* [PATCH v1 mtd/nand/next 0/3] mtd: rawnand: fsl_elbc: Make SW ECC work
@ 2019-03-22 13:26 Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move Marek Behún
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Marek Behún @ 2019-03-22 13:26 UTC (permalink / raw)
To: linux-mtd; +Cc: Boris Brezillon, Marek Behún, Shreeya Patel, Miquel Raynal
Hi,
this patch series updates the fsl_elbc rawnand driver to work on CZ.NIC's
Turris 1.x, where the NAND chip's HW ECC is incompatible with the HW ECC
of the controller. Software ECC must be used, but the fsl_elbc driver does
not support it correctly, at least not for Turris.
The first patch only moves the attach_chip method only after the _read_page
and friends are defined, so that the third patch can reference these
methods in attach_chip.
The second patch adds RNDOUT command.
The third patch moves the code which sets ECC parameters from init_chip to
attach_chip because we want to consider device-tree settings (if SW ECC was
chosen in device-tree).
Marek
Marek Behún (3):
mtd: rawnand: fsl_elbc: Cosmetic move
mtd: rawnand: fsl_elbc: Implement RNDOUT command
mtd: rawnand: fsl_elbc: Make SW ECC work
drivers/mtd/nand/raw/fsl_elbc_nand.c | 201 +++++++++++++++------------
1 file changed, 113 insertions(+), 88 deletions(-)
--
2.19.2
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move
2019-03-22 13:26 [PATCH v1 mtd/nand/next 0/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
@ 2019-03-22 13:26 ` Marek Behún
2019-04-18 16:10 ` Miquel Raynal
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 2/3] mtd: rawnand: fsl_elbc: Implement RNDOUT command Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 3/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
2 siblings, 1 reply; 5+ messages in thread
From: Marek Behún @ 2019-03-22 13:26 UTC (permalink / raw)
To: linux-mtd; +Cc: Boris Brezillon, Marek Behún, Shreeya Patel, Miquel Raynal
Move the fsl_elbc_attach_chip function after the definitions of
fsl_elbc_read_page and friends in preparation for the next patch.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
drivers/mtd/nand/raw/fsl_elbc_nand.c | 146 +++++++++++++--------------
1 file changed, 73 insertions(+), 73 deletions(-)
diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index 70f0d2b450ea..9bffb672448a 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -635,79 +635,6 @@ static int fsl_elbc_wait(struct nand_chip *chip)
return (elbc_fcm_ctrl->mdr & 0xff) | NAND_STATUS_WP;
}
-static int fsl_elbc_attach_chip(struct nand_chip *chip)
-{
- struct mtd_info *mtd = nand_to_mtd(chip);
- struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
- struct fsl_lbc_ctrl *ctrl = priv->ctrl;
- struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- unsigned int al;
-
- /* calculate FMR Address Length field */
- al = 0;
- if (chip->pagemask & 0xffff0000)
- al++;
- if (chip->pagemask & 0xff000000)
- al++;
-
- priv->fmr |= al << FMR_AL_SHIFT;
-
- dev_dbg(priv->dev, "fsl_elbc_init: nand->numchips = %d\n",
- chip->numchips);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->chipsize = %lld\n",
- chip->chipsize);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->pagemask = %8x\n",
- chip->pagemask);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->legacy.chip_delay = %d\n",
- chip->legacy.chip_delay);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->badblockpos = %d\n",
- chip->badblockpos);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->chip_shift = %d\n",
- chip->chip_shift);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->page_shift = %d\n",
- chip->page_shift);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->phys_erase_shift = %d\n",
- chip->phys_erase_shift);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.mode = %d\n",
- chip->ecc.mode);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.steps = %d\n",
- chip->ecc.steps);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.bytes = %d\n",
- chip->ecc.bytes);
- dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.total = %d\n",
- chip->ecc.total);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->ooblayout = %p\n",
- mtd->ooblayout);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->flags = %08x\n", mtd->flags);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->size = %lld\n", mtd->size);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->erasesize = %d\n",
- mtd->erasesize);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->writesize = %d\n",
- mtd->writesize);
- dev_dbg(priv->dev, "fsl_elbc_init: mtd->oobsize = %d\n",
- mtd->oobsize);
-
- /* adjust Option Register and ECC to match Flash page size */
- if (mtd->writesize == 512) {
- priv->page_size = 0;
- clrbits32(&lbc->bank[priv->bank].or, OR_FCM_PGS);
- } else if (mtd->writesize == 2048) {
- priv->page_size = 1;
- setbits32(&lbc->bank[priv->bank].or, OR_FCM_PGS);
- } else {
- dev_err(priv->dev,
- "fsl_elbc_init: page size %d is not supported\n",
- mtd->writesize);
- return -ENOTSUPP;
- }
-
- return 0;
-}
-
-static const struct nand_controller_ops fsl_elbc_controller_ops = {
- .attach_chip = fsl_elbc_attach_chip,
-};
-
static int fsl_elbc_read_page(struct nand_chip *chip, uint8_t *buf,
int oob_required, int page)
{
@@ -815,6 +742,79 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
return 0;
}
+static int fsl_elbc_attach_chip(struct nand_chip *chip)
+{
+ struct mtd_info *mtd = nand_to_mtd(chip);
+ struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
+ unsigned int al;
+
+ /* calculate FMR Address Length field */
+ al = 0;
+ if (chip->pagemask & 0xffff0000)
+ al++;
+ if (chip->pagemask & 0xff000000)
+ al++;
+
+ priv->fmr |= al << FMR_AL_SHIFT;
+
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->numchips = %d\n",
+ chip->numchips);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->chipsize = %lld\n",
+ chip->chipsize);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->pagemask = %8x\n",
+ chip->pagemask);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->legacy.chip_delay = %d\n",
+ chip->legacy.chip_delay);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->badblockpos = %d\n",
+ chip->badblockpos);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->chip_shift = %d\n",
+ chip->chip_shift);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->page_shift = %d\n",
+ chip->page_shift);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->phys_erase_shift = %d\n",
+ chip->phys_erase_shift);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.mode = %d\n",
+ chip->ecc.mode);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.steps = %d\n",
+ chip->ecc.steps);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.bytes = %d\n",
+ chip->ecc.bytes);
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.total = %d\n",
+ chip->ecc.total);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->ooblayout = %p\n",
+ mtd->ooblayout);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->flags = %08x\n", mtd->flags);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->size = %lld\n", mtd->size);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->erasesize = %d\n",
+ mtd->erasesize);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->writesize = %d\n",
+ mtd->writesize);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->oobsize = %d\n",
+ mtd->oobsize);
+
+ /* adjust Option Register and ECC to match Flash page size */
+ if (mtd->writesize == 512) {
+ priv->page_size = 0;
+ clrbits32(&lbc->bank[priv->bank].or, OR_FCM_PGS);
+ } else if (mtd->writesize == 2048) {
+ priv->page_size = 1;
+ setbits32(&lbc->bank[priv->bank].or, OR_FCM_PGS);
+ } else {
+ dev_err(priv->dev,
+ "fsl_elbc_init: page size %d is not supported\n",
+ mtd->writesize);
+ return -ENOTSUPP;
+ }
+
+ return 0;
+}
+
+static const struct nand_controller_ops fsl_elbc_controller_ops = {
+ .attach_chip = fsl_elbc_attach_chip,
+};
+
static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv)
{
struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;
--
2.19.2
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 mtd/nand/next 2/3] mtd: rawnand: fsl_elbc: Implement RNDOUT command
2019-03-22 13:26 [PATCH v1 mtd/nand/next 0/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move Marek Behún
@ 2019-03-22 13:26 ` Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 3/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
2 siblings, 0 replies; 5+ messages in thread
From: Marek Behún @ 2019-03-22 13:26 UTC (permalink / raw)
To: linux-mtd; +Cc: Boris Brezillon, Marek Behún, Shreeya Patel, Miquel Raynal
This is needed for SW ECC.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
drivers/mtd/nand/raw/fsl_elbc_nand.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index 9bffb672448a..fb6092829d78 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -355,6 +355,15 @@ static void fsl_elbc_cmdfunc(struct nand_chip *chip, unsigned int command,
fsl_elbc_run_command(mtd);
return;
+ /* RNDOUT moves the pointer inside the page */
+ case NAND_CMD_RNDOUT:
+ dev_dbg(priv->dev,
+ "fsl_elbc_cmdfunc: NAND_CMD_RNDOUT, column: 0x%x.\n",
+ column);
+
+ elbc_fcm_ctrl->index = column;
+ return;
+
/* READOOB reads only the OOB because no ECC is performed. */
case NAND_CMD_READOOB:
dev_vdbg(priv->dev,
--
2.19.2
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 mtd/nand/next 3/3] mtd: rawnand: fsl_elbc: Make SW ECC work
2019-03-22 13:26 [PATCH v1 mtd/nand/next 0/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 2/3] mtd: rawnand: fsl_elbc: Implement RNDOUT command Marek Behún
@ 2019-03-22 13:26 ` Marek Behún
2 siblings, 0 replies; 5+ messages in thread
From: Marek Behún @ 2019-03-22 13:26 UTC (permalink / raw)
To: linux-mtd; +Cc: Boris Brezillon, Marek Behún, Shreeya Patel, Miquel Raynal
Move the code that choses ECC into _attach_chip, which is executed only
after the chip->ecc.* properties were loaded from device-tree. This way
we know which ECC method was chosen by the device-tree and can set
methods appropriately.
The chip->ecc.*page methods should be set to fsl_elbc_*page only in HW
ECC mode.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
drivers/mtd/nand/raw/fsl_elbc_nand.c | 52 ++++++++++++++++++----------
1 file changed, 34 insertions(+), 18 deletions(-)
diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index fb6092829d78..fa03c8f64b42 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -730,24 +730,6 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
chip->controller = &elbc_fcm_ctrl->controller;
nand_set_controller_data(chip, priv);
- chip->ecc.read_page = fsl_elbc_read_page;
- chip->ecc.write_page = fsl_elbc_write_page;
- chip->ecc.write_subpage = fsl_elbc_write_subpage;
-
- /* If CS Base Register selects full hardware ECC then use it */
- if ((in_be32(&lbc->bank[priv->bank].br) & BR_DECC) ==
- BR_DECC_CHK_GEN) {
- chip->ecc.mode = NAND_ECC_HW;
- mtd_set_ooblayout(mtd, &fsl_elbc_ooblayout_ops);
- chip->ecc.size = 512;
- chip->ecc.bytes = 3;
- chip->ecc.strength = 1;
- } else {
- /* otherwise fall back to default software ECC */
- chip->ecc.mode = NAND_ECC_SOFT;
- chip->ecc.algo = NAND_ECC_HAMMING;
- }
-
return 0;
}
@@ -759,6 +741,40 @@ static int fsl_elbc_attach_chip(struct nand_chip *chip)
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
unsigned int al;
+ switch (chip->ecc.mode) {
+ /*
+ * if ECC was not chosen in DT, decide whether to use HW or SW ECC from
+ * CS Base Register
+ */
+ case NAND_ECC_NONE:
+ /* If CS Base Register selects full hardware ECC then use it */
+ if ((in_be32(&lbc->bank[priv->bank].br) & BR_DECC) ==
+ BR_DECC_CHK_GEN) {
+ chip->ecc.read_page = fsl_elbc_read_page;
+ chip->ecc.write_page = fsl_elbc_write_page;
+ chip->ecc.write_subpage = fsl_elbc_write_subpage;
+
+ chip->ecc.mode = NAND_ECC_HW;
+ mtd_set_ooblayout(mtd, &fsl_elbc_ooblayout_ops);
+ chip->ecc.size = 512;
+ chip->ecc.bytes = 3;
+ chip->ecc.strength = 1;
+ } else {
+ /* otherwise fall back to default software ECC */
+ chip->ecc.mode = NAND_ECC_SOFT;
+ chip->ecc.algo = NAND_ECC_HAMMING;
+ }
+ break;
+
+ /* if SW ECC was chosen in DT, we do not need to set anything here */
+ case NAND_ECC_SOFT:
+ break;
+
+ /* should we also implement NAND_ECC_HW to do as the code above? */
+ default:
+ return -EINVAL;
+ }
+
/* calculate FMR Address Length field */
al = 0;
if (chip->pagemask & 0xffff0000)
--
2.19.2
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move Marek Behún
@ 2019-04-18 16:10 ` Miquel Raynal
0 siblings, 0 replies; 5+ messages in thread
From: Miquel Raynal @ 2019-04-18 16:10 UTC (permalink / raw)
To: Marek Behún; +Cc: Boris Brezillon, linux-mtd, Shreeya Patel
Hi Marek,
Marek Behún <marek.behun@nic.cz> wrote on Fri, 22 Mar 2019 14:26:17
+0100:
> Move the fsl_elbc_attach_chip function after the definitions of
> fsl_elbc_read_page and friends in preparation for the next patch.
>
> Signed-off-by: Marek Behún <marek.behun@nic.cz>
> ---
Series applied to
https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git
branch nand/next.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-04-18 16:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-22 13:26 [PATCH v1 mtd/nand/next 0/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 1/3] mtd: rawnand: fsl_elbc: Cosmetic move Marek Behún
2019-04-18 16:10 ` Miquel Raynal
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 2/3] mtd: rawnand: fsl_elbc: Implement RNDOUT command Marek Behún
2019-03-22 13:26 ` [PATCH v1 mtd/nand/next 3/3] mtd: rawnand: fsl_elbc: Make SW ECC work Marek Behún
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).