Thread (33 messages) flat view 33 messages, 5 authors, 2011-12-20

Re: [PATCH 3/3] mtd/nand : workaround for Freescale FCM to support large-page Nand chip

From: LiuShuo <hidden>
Date: 2011-12-08 10:40:57
Also in: lkml

=E4=BA=8E 2011=E5=B9=B412=E6=9C=8808=E6=97=A5 03:11, Scott Wood =E5=86=99=
=E9=81=93:
On 12/06/2011 09:55 PM, LiuShuo wrote:
quoted
=E4=BA=8E 2011=E5=B9=B412=E6=9C=8807=E6=97=A5 08:09, Scott Wood =E5=86=
=99=E9=81=93:
quoted
quoted
On 12/03/2011 10:31 PM, shuo.liu@freescale.com wrote:
quoted
From: Liu Shuo<redacted>

Freescale FCM controller has a 2K size limitation of buffer RAM. In
order
to support the Nand flash chip whose page size is larger than 2K byt=
es,
quoted
quoted
quoted
we read/write 2k data repeatedly by issuing FIR_OP_RB/FIR_OP_WB and =
save
quoted
quoted
quoted
them to a large buffer.

Signed-off-by: Liu Shuo<redacted>
---
v3:
      -remove page_size of struct fsl_elbc_mtd.
      -do a oob write by NAND_CMD_RNDIN.

   drivers/mtd/nand/fsl_elbc_nand.c |  243
++++++++++++++++++++++++++++++++++----
   1 files changed, 218 insertions(+), 25 deletions(-)
What is the plan for bad block marker migration?
This patch has been ported to uboot now, I think we can make a special
uboot image for bad
block marker migration when first use the chip.
It should not be a special image, and there should be some way to mark
that the migration has happened.  Even if we do the migration in U-Boot=
,
Linux could check for the marker and if absent, disallow access and tel=
l
the user to run the migration tool.
quoted
quoted
quoted
@@ -473,13 +568,72 @@ static void fsl_elbc_cmdfunc(struct mtd_info
*mtd, unsigned int command,
            * write so the HW generates the ECC.
            */
           if (elbc_fcm_ctrl->oob || elbc_fcm_ctrl->column !=3D 0 ||
-            elbc_fcm_ctrl->index !=3D mtd->writesize + mtd->oobsize=
)
quoted
quoted
quoted
-            out_be32(&lbc->fbcr,
-                elbc_fcm_ctrl->index - elbc_fcm_ctrl->column);
-        else
+            elbc_fcm_ctrl->index !=3D mtd->writesize + mtd->oobsize=
) {
quoted
quoted
quoted
+            if (elbc_fcm_ctrl->oob&&   mtd->writesize>   2048) {
+                out_be32(&lbc->fbcr, 64);
+            } else {
+                out_be32(&lbc->fbcr, elbc_fcm_ctrl->index
+                        - elbc_fcm_ctrl->column);
+            }
We need to limit ourselves to the regions that have actually been
written to in the buffer.  fbcr needs to be set separately for first =
and
quoted
quoted
last subpages, with intermediate subpages having 0, 64, or 2112 as
appropriate.  Subpages that are entirely before column or entirely af=
ter
quoted
quoted
column + index should be skipped.
I have considered this case, but I don't think it is useful.
     1.There isn't a 'length' parameter in driver interface, although =
we
quoted
can get it from 'index - column'.
Right.  column is start, and index is end + 1.  We have the bounds of
what has been written.
quoted
     2.To see nand_do_write_oob() in nand_base.c, it fill '0xff' to
entire oob area first and write the user data by nand_fill_oob(), then
call ecc.write_oob (default is nand_write_oob_std()).
Do we really want to assume that that's what it will always do?

And if we do want to make such assumptions, we could rip out all usage
of index/column here, and just handle "oob" and "full page" cases.
The function nand_do_write_ops() in nandbase.c is a Nand internal interfa=
ce.
It always is called when application write to nand flash. (e.g. dd)
In this function, partial page write is dealt with by filling '0xff' to=20
buffer before data copy.
(nand_do_write_oob() is similar)
So I don't think we need to do it in our controller driver again, it=20
should be a job of upper layer.


I found that 'column' for NAND_CMD_SEQIN is always 0 or writesize except=20
for oob write with
  NAND_ECC_HW_SYNDROME, but it's not useful case for our controller.

-LiuShuo
-Scott
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help