From: Masahiro Yamada <yamada.masahiro@socionext.com>
To: Boris Brezillon <boris.brezillon@free-electrons.com>
Cc: linux-mtd@lists.infradead.org,
Laurent Monat <laurent.monat@idquantique.com>,
thorsten.christiansson@idquantique.com,
Enrico Jorns <ejo@pengutronix.de>,
Jason Roberts <jason.e.roberts@intel.com>,
Artem Bityutskiy <artem.bityutskiy@linux.intel.com>,
Dinh Nguyen <dinguyen@kernel.org>,
Marek Vasut <marek.vasut@gmail.com>,
Brian Norris <computersforpeace@gmail.com>,
Graham Moore <grmoore@opensource.altera.com>,
David Woodhouse <dwmw2@infradead.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Chuanxiao Dong <chuanxiao.dong@intel.com>,
Jassi Brar <jaswinder.singh@linaro.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Richard Weinberger <richard@nod.at>,
Cyrille Pitchen <cyrille.pitchen@atmel.com>
Subject: Re: [PATCH v2 10/53] mtd: nand: denali: fix erased page checking
Date: Fri, 24 Mar 2017 11:43:43 +0900 [thread overview]
Message-ID: <CAK7LNARt9nagFk_bU0g_+AWk8dv61korDiRiRWTqh2Z-PHsQRw@mail.gmail.com> (raw)
In-Reply-To: <20170323085644.338a3a81@bbrezillon>
Hi Boris,
2017-03-23 16:56 GMT+09:00 Boris Brezillon <boris.brezillon@free-electrons.com>:
> On Thu, 23 Mar 2017 14:04:44 +0900
> Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
>
>> Hi Boris,
>>
>> 2017-03-23 5:56 GMT+09:00 Boris Brezillon <boris.brezillon@free-electrons.com>:
>> > On Wed, 22 Mar 2017 23:07:17 +0900
>> > Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
>> >> dev_err(denali->dev,
>> >> @@ -1148,12 +1136,15 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,
>> >> if (check_erased_page) {
>> >> read_oob_data(mtd, chip->oob_poi, denali->page);
>> >>
>> >> - /* check ECC failures that may have occurred on erased pages */
>> >> - if (check_erased_page) {
>> >> - if (!is_erased(buf, mtd->writesize))
>> >> - mtd->ecc_stats.failed++;
>> >> - if (!is_erased(buf, mtd->oobsize))
>> >> - mtd->ecc_stats.failed++;
>> >> + stat = nand_check_erased_ecc_chunk(
>> >> + buf, mtd->writesize,
>> >> + chip->oob_poi, mtd->oobsize,
>> >> + NULL, 0,
>> >> + chip->ecc.strength * chip->ecc.steps);
>> >
>> > That's not how it's supposed to be done. Each chunk should be checked
>> > independently. Here is a simple example explaining why this is
>> > important:
>> >
>> > Let's consider the following setup:
>> > - 4k pages
>> > - 16bits/1024bytes ECC
>> >
>> > With your approach, you turn this into:
>> > - 4k pages
>> > - 64bits/4096bytes ECC
>> >
>> > Now suppose you have 32 bitflips in the first 1024 bytes. The real ECC
>> > config is expected to report uncorrectable errors, but your approach
>> > will just report that 32 bits have been fixed, which is wrong.
>>
>>
>> OK. How about adding a helper like follows:
>>
>> static int denali_check_erased_page(struct mtd_info *mtd,
>> struct nand_chip *chip, uint8_t *buf)
>> {
>> uint8_t *ecc_code = chip->buffers->ecccode;
>> int ecc_steps = chip->ecc.steps;
>> int ecc_size = chip->ecc.size;
>> int ecc_bytes = chip->ecc.bytes;
>> int i, ret;
>>
>> ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
>> chip->ecc.total);
>> if (ret)
>> return ret;
>>
>> for (i = 0; i < ecc_steps; i++) {
>> ret = nand_check_erased_ecc_chunk(buf, ecc_size,
>> ecc_code, ecc_bytes,
>> NULL, 0,
>> chip->ecc.strength);
>> if (ret < 0)
>> return ret;
>> buf += ecc_size;
>> ecc_code += ecc_bytes;
>> }
>>
>> return 0;
>> }
>>
>>
>>
>> Then,
>>
>> stat = denali_check_erased_page(mtd, chip, buf);
>> if (stat < 0) {
>> mtd->ecc_stats.failed++;
>> /* return 0 for uncorrectable bitflips */
>> stat = 0;
>> }
>
> What's the point of checking all ECC chunks if only one contains ECC
> errors? I really recommend to put the nand_check_erased_ecc_chunk()
> call next to the per-ECC-block correction test.
OK. I can fix it for software ECC fixup.
What should I do for hardware ECC fixup case?
http://patchwork.ozlabs.org/patch/742321/
If at least one ECC sector fails to correct bit-flips,
the controller sets INTR__ECC_UNCOR_ERR flag.
In this case, we can not know the number of uncorrectable errors.
Possible solutions are:
- Increment ecc_stats.failed only by one (compromised solution)
- If the controller IP supports sub-page read,
transfer sectors once again, one by one, checking the register
flag each time.
As far as I see, there are three cases.
[1] SW ECC fixup (Intel)
This can be fixed
[2] HW ECC fixup is supported, but sub-page read is not supported
(old UniPhier SoCs, probably SOCFPGA too)
[3] HW ECC fixup is supported, and sub-page read is supported as well
(new UniPhier SoCs)
I do not know how to precisely increment
ecc_stats.failed and ecc_stats.corrected for [2].
As for [3], we can solve the issue by making more efforts,
but I am not sure this effort is worthwhile.
> Also, mtd->ecc_stats.failed is supposed to be incremented each time an
> uncorrectable error is detected. In your denali_sw_ecc_fixup()
> implementation you can detect errors at the ECC chunk level, so you
> should increment ecc_stats.failed for each failure and not once if at
> least one chunk is faulty.
Yes, I can do this for denali_sw_ecc_fixup().
Can I ask what disadvantage would happen
if ecc_stats.failed / .corrected is incremented only by one,
where actually errors happen in multiple sectors.
--
Best Regards
Masahiro Yamada
next prev parent reply other threads:[~2017-03-24 2:44 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-22 14:07 [PATCH v2 00/53] mtd: nand: denali: 2nd round of Denali NAND IP patch bomb Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 01/53] mtd: nand: allow to set only one of ECC size and ECC strength from DT Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 02/53] mtd: nand: use read_oob() instead of cmdfunc() for bad block check Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 03/53] mtd: nand: denali: remove unused CONFIG option and macros Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 04/53] mtd: nand: denali: remove redundant define of BANK(x) Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 05/53] mtd: nand: denali: remove more unused struct members Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 06/53] mtd: nand: denali: fix comment of denali_nand_info::flash_mem Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 07/53] mtd: nand: denali: consolidate INTR_STATUS__* and INTR_EN__* macros Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 08/53] mtd: nand: denali: introduce capability flag Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 09/53] mtd: nand: denali: use int where no reason to use fixed width variable Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 10/53] mtd: nand: denali: fix erased page checking Masahiro Yamada
2017-03-22 20:36 ` Boris Brezillon
2017-03-23 5:15 ` Masahiro Yamada
2017-03-23 8:03 ` Boris Brezillon
2017-03-22 20:56 ` Boris Brezillon
2017-03-23 5:04 ` Masahiro Yamada
2017-03-23 7:56 ` Boris Brezillon
2017-03-24 2:43 ` Masahiro Yamada [this message]
2017-03-24 8:06 ` Boris Brezillon
2017-03-22 14:07 ` [PATCH v2 11/53] mtd: nand: denali: fix bitflips calculation in handle_ecc() Masahiro Yamada
2017-03-22 20:57 ` Boris Brezillon
2017-03-23 7:02 ` Masahiro Yamada
2017-03-23 8:12 ` Boris Brezillon
2017-03-22 14:07 ` [PATCH v2 12/53] mtd: nand: denali: support HW_ECC_FIXUP capability Masahiro Yamada
2017-03-22 21:09 ` Boris Brezillon
2017-03-23 7:06 ` Masahiro Yamada
2017-03-23 8:16 ` Boris Brezillon
2017-03-22 21:12 ` Boris Brezillon
2017-03-23 7:05 ` Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 13/53] mtd: nand: denali_dt: enable HW_ECC_FIXUP for Altera SOCFPGA variant Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 14/53] mtd: nand: denali: support 64bit capable DMA engine Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 15/53] mtd: nand: denali_dt: remove dma-mask DT property Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 16/53] mtd: nand: denali_dt: use pdev instead of ofdev for platform_device Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 17/53] mtd: nand: denali: allow to override revision number Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 18/53] mtd: nand: denali: use nand_chip to hold frequently accessed data Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 19/53] mtd: nand: denali: call nand_set_flash_node() to set DT node Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 20/53] mtd: nand: denali: do not set mtd->name Masahiro Yamada
2017-03-27 15:31 ` Boris Brezillon
2017-03-28 21:32 ` Masahiro Yamada
2017-03-28 21:40 ` Boris Brezillon
2017-03-29 1:19 ` Masahiro Yamada
2017-03-29 7:19 ` Boris Brezillon
2017-03-29 11:30 ` Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 21/53] mtd: nand: denali: move multi device fixup code to a helper function Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 22/53] mtd: nand: denali: simplify multi device fixup code Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 23/53] mtd: nand: denali: set DEVICES_CONNECTED 1 if not set Masahiro Yamada
2017-03-22 14:07 ` [PATCH v2 24/53] mtd: nand: denali: remove meaningless writes to read-only registers Masahiro Yamada
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=CAK7LNARt9nagFk_bU0g_+AWk8dv61korDiRiRWTqh2Z-PHsQRw@mail.gmail.com \
--to=yamada.masahiro@socionext.com \
--cc=artem.bityutskiy@linux.intel.com \
--cc=boris.brezillon@free-electrons.com \
--cc=chuanxiao.dong@intel.com \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@atmel.com \
--cc=dinguyen@kernel.org \
--cc=dwmw2@infradead.org \
--cc=ejo@pengutronix.de \
--cc=grmoore@opensource.altera.com \
--cc=jason.e.roberts@intel.com \
--cc=jaswinder.singh@linaro.org \
--cc=laurent.monat@idquantique.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=mhiramat@kernel.org \
--cc=richard@nod.at \
--cc=thorsten.christiansson@idquantique.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).