public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Marek Vasut <marek.vasut@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 09/15] iMX28: Add GPMI NAND driver
Date: Wed, 28 Sep 2011 23:42:09 +0200	[thread overview]
Message-ID: <201109282342.10073.marek.vasut@gmail.com> (raw)
In-Reply-To: <4E839115.6000409@freescale.com>

On Wednesday, September 28, 2011 11:26:45 PM Scott Wood wrote:
> On 09/11/2011 11:06 PM, Marek Vasut wrote:
> > +static void mxs_nand_return_dma_descs(struct mxs_nand_info *info)
> > +{
> > +	int i = info->desc_index;
> > +	struct mxs_dma_desc *desc;
> > +
> > +	for (--i; i >= 0; i--) {
> 
> This is an awkward construct.
> 
> Why not just the usual:
> 
> for (i = 0; i < info->desc_index; i++)

Good catch.

> 
> > +		desc = info->desc[i];
> > +		memset(desc, 0, sizeof(struct mxs_dma_desc));
> > +		desc->address = (dma_addr_t)desc;
> > +	}
> > +
> > +	info->desc_index = 0;
> > +}
> > +
> > +static inline uint32_t mxs_nand_ecc_chunk_cnt(uint32_t page_data_size)
> > +{
> > +	return page_data_size / MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
> > +}
> 
> No need for inline in .c files, GCC should take care of this automatically.

Does it really ?
> 
> > +/*
> > + * There are several places in this driver where we have to handle the
> > OOB and + * block marks. This is the function where things are the most
> > complicated, so + * this is where we try to explain it all. All the
> > other places refer back to + * here.
> > + *
> > + * These are the rules, in order of decreasing importance:
> > + *
> > + * 1) Nothing the caller does can be allowed to imperil the block mark,
> > so all + *    write operations take measures to protect it.
> > + *
> > + * 2) In read operations, the first byte of the OOB we return must
> > reflect the + *    true state of the block mark, no matter where that
> > block mark appears in + *    the physical page.
> > + *
> > + * 3) ECC-based read operations return an OOB full of set bits (since we
> > never + *    allow ECC-based writes to the OOB, it doesn't matter what
> > ECC-based reads + *    return).
> > + *
> > + * 4) "Raw" read operations return a direct view of the physical bytes
> > in the + *    page, using the conventional definition of which bytes are
> > data and which + *    are OOB. This gives the caller a way to see the
> > actual, physical bytes + *    in the page, without the distortions
> > applied by our ECC engine.
> 
> Hmm, I thought raw was just supposed to disable ECC, not change the
> layout from what is used in normal operation.

You see the page as is ... I see no problem with this part.
> 
> > + * It turns out that knowing whether we want an "ECC-based" or "raw"
> > read is not + * easy. When reading a page, for example, the NAND Flash
> > MTD code calls our + * ecc.read_page or ecc.read_page_raw function.
> > Thus, the fact that MTD wants an + * ECC-based or raw view of the page
> > is implicit in which function it calls + * (there is a similar pair of
> > ECC-based/raw functions for writing).
> 
> This is an issue for the eLBC driver as well -- we need to know whether
> to enable or disable ECC before we begin the operation (in cmdfunc), not
> just at the time the buffer is accessed.  Currently we just always have
> ECC on, and raw accesses aren't raw.  It would be nice to fix this more
> generally (starting in Linux, so we don't diverge).
> 
> It's too bad we can't rely on chip->ops being used... maybe we could
> copy the data into there?  Or just have a separate mtd_oob_mode_t in
> nand_chip.
> 
> > +/*
> > + * Write OOB data to NAND.
> > + */
> > +static int mxs_nand_ecc_write_oob(struct mtd_info *mtd, struct nand_chip
> > *nand, +					int page)
> > +{
> > +	struct mxs_nand_info *nand_info = nand->priv;
> > +	uint8_t block_mark = 0;
> > +
> > +	/*
> > +	 * There are fundamental incompatibilities between the i.MX GPMI NFC
> > and +	 * the NAND Flash MTD model that make it essentially impossible 
to
> > write +	 * the out-of-band bytes.
> > +	 *
> > +	 * We permit *ONE* exception. If the *intent* of writing the OOB is to
> > +	 * mark a block bad, we can do that.
> > +	 */
> 
> Is this just an issue with writing OOB separately from the main data
> (which would also be an issue on MLC chips that don't allow multiple
> partial programming), or can you not even write user OOB bytes as part
> of a full page write?
> 
> Based on fake_ecc_layout I'm guessing the latter.

My understanding of the original FSL driver is that you should never be allowed 
to access the physical NAND media at all. Only through the driver, which does 
the magic.
> 
> > +	if (nand_info->marking_block_bad) {
> > +		printf("NXS NAND: Writing OOB isn't supported\n");
> > +		return -EIO;
> > +	}
> 
> Shouldn't this be if (!nand_info->marking_block_bad)?
> 
> > +/*
> > + * Claims all blocks are good.
> > + *
> > + * In principle, this function is *only* called when the NAND Flash MTD
> > system + * isn't allowed to keep an in-memory bad block table, so it is
> > forced to ask + * the driver for bad block information.
> > + *
> > + * In fact, we permit the NAND Flash MTD system to have an in-memory
> > BBT, so + * this function is *only* called when we take it away.
> > + *
> > + * We take away the in-memory BBT when the user sets the "ignorebad"
> > parameter, + * which indicates that all blocks should be reported good.
> > + *
> > + * Thus, this function is only called when we want *all* blocks to look
> > good, + * so it *always* return success.
> > + */
> > +static int mxs_nand_block_bad(struct mtd_info *mtd, loff_t ofs, int
> > getchip) +{
> > +	return 0;
> > +}
> 
> What/where is the "ignorebad" parameter?

Remnant from FSL code.
> 
> Other than when scrubbing (which has its own override), when would you
> want to do this?
> 
> > +/*
> > + * Nominally, the purpose of this function is to look for or create the
> > bad + * block table. In fact, since the HIL calls this function at the
> > very end of
> 
> HIL?

DTTO
> 
> > + * the initialization process started by nand_scan(), and the HIL
> > doesn't have a + * more formal mechanism, everyone "hooks" this function
> > to continue the + * initialization process.
> 
> Everyone?  I only see diskonchip doing this.

DTTO
> 
> The nand_base.c code actually does have a split here
> (nand_scan_ident/nand_scan_tail), but U-Boot's glue code is too
> inflexible, and insists on calling nand_scan.  The right fix is to let
> drivers call nand_scan_ident/nand_scan_tail themselves.

I can't test now, so this has to wait. I'd prefer to get this mainline and then 
start poking around fixing this.
> 
> -Scott

  reply	other threads:[~2011-09-28 21:42 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-12  4:06 [U-Boot] [PATCH 00/15 V2] Support for the DENX M28 SoM Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 01/15] iMX28: Initial support for iMX28 CPU Marek Vasut
2011-09-14  7:10   ` Stefano Babic
2011-09-27 13:45   ` [U-Boot] [PATCH 01/15 V2] " Marek Vasut
2011-09-30  9:42     ` [U-Boot] [PATCH 01/15 V3] " Marek Vasut
2011-10-13 16:19       ` Stefano Babic
2011-10-13 18:14         ` Marek Vasut
2011-10-13 20:45           ` Wolfgang Denk
2011-10-14  7:51           ` Stefano Babic
2011-10-14  7:59             ` Marek Vasut
2011-10-14 21:00               ` Wolfgang Denk
2011-10-14 21:06                 ` Marek Vasut
2011-10-13 23:38       ` [U-Boot] [PATCH 01/15 V4] " Marek Vasut
2011-10-14 21:14         ` [U-Boot] [PATCH 01/15 V5] " Marek Vasut
2011-10-14 21:01       ` [U-Boot] [PATCH 01/15 V3] " Wolfgang Denk
2011-10-14 21:10         ` Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 02/15] iMX28: Add SSP MMC driver Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 03/15] FEC: Add support for iMX28 quirks Marek Vasut
2011-09-14  7:17   ` Stefano Babic
2011-09-14 12:11     ` Marek Vasut
2011-09-14 15:38       ` Mike Frysinger
2011-09-12  4:06 ` [U-Boot] [PATCH 04/15] iMX28: Add PINMUX control Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 05/15] iMX28: Add I2C bus driver Marek Vasut
2011-09-12  5:30   ` Heiko Schocher
2011-09-12 13:31     ` Marek Vasut
2011-09-13 12:05   ` Wolfram Sang
2011-09-13 12:56     ` Marek Vasut
2011-09-13 13:12       ` Wolfram Sang
2011-09-13 13:20         ` Marek Vasut
2011-09-13 13:31           ` Wolfram Sang
2011-09-13 22:24   ` [U-Boot] [PATCH 05/15 V2] " Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 06/15] iMX28: Add GPIO control Marek Vasut
2011-09-14  7:25   ` Stefano Babic
2011-09-12  4:06 ` [U-Boot] [PATCH 07/15] iMX28: Add SPI driver Marek Vasut
2011-09-12 16:35   ` Mike Frysinger
2011-09-12 17:42     ` Marek Vasut
2011-09-12 20:26       ` Mike Frysinger
2011-09-12 22:45         ` Marek Vasut
2011-09-13 22:26   ` [U-Boot] [PATCH 07/15 V2] " Marek Vasut
2011-09-14  2:50     ` Mike Frysinger
2011-09-14  3:14       ` Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 08/15] iMX28: Add APBH DMA driver Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 09/15] iMX28: Add GPMI NAND driver Marek Vasut
2011-09-28 21:26   ` Scott Wood
2011-09-28 21:42     ` Marek Vasut [this message]
2011-09-28 21:57       ` Scott Wood
2011-09-28 22:09         ` Marek Vasut
2011-09-28 22:13           ` Scott Wood
2011-09-28 22:34             ` Marek Vasut
2011-09-28 22:12     ` Marek Vasut
2011-09-28 22:23       ` Scott Wood
2011-09-28 22:17   ` [U-Boot] [PATCH 09/15 V2] " Marek Vasut
2011-09-28 22:32     ` [U-Boot] [PATCH 09/15 V3] " Marek Vasut
2011-09-29  0:07       ` [U-Boot] [PATCH 09/15 V4] " Marek Vasut
2011-09-30  9:39         ` [U-Boot] [PATCH 09/15 V5] " Marek Vasut
2011-10-10 21:06           ` Scott Wood
2011-09-12  4:06 ` [U-Boot] [PATCH 10/15] iMX28: Add driver for internal RTC Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 11/15] iMX28: Add image header generator tool Marek Vasut
2011-09-12 16:38   ` Mike Frysinger
2011-09-12 17:40     ` Marek Vasut
2011-09-12 20:24       ` Mike Frysinger
2011-09-12 22:13         ` Marek Vasut
2011-09-13 22:27   ` [U-Boot] [PATCH 11/15 V2] " Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 12/15] iMX28: Add u-boot.sb target to Makefile Marek Vasut
2011-09-12 16:33   ` Mike Frysinger
2011-09-12 17:40     ` Marek Vasut
2011-09-13 22:28   ` [U-Boot] [PATCH 12/15 V2] " Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 13/15] iMX28: Add support for DENX M28EVK board Marek Vasut
2011-09-13 22:29   ` [U-Boot] [PATCH 13/15 V2] " Marek Vasut
2011-09-14  2:48     ` Mike Frysinger
2011-09-14  3:17       ` Marek Vasut
2011-09-14  3:33         ` Mike Frysinger
2011-09-14  4:24           ` Marek Vasut
2011-09-14  5:01             ` Mike Frysinger
2011-09-14  5:10               ` Marek Vasut
2011-09-14 22:12                 ` Mike Frysinger
2011-09-14 23:13                   ` Marek Vasut
2011-09-20  2:15     ` [U-Boot] [PATCH 13/15 V3] " Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 14/15] M28: Add MMC SPL Marek Vasut
2011-09-30  9:40   ` [U-Boot] [PATCH 14/15 V2] " Marek Vasut
2011-10-14 12:09     ` [U-Boot] [PATCH 14/15 V3] " Marek Vasut
2011-09-12  4:06 ` [U-Boot] [PATCH 15/15] M28: Add doc/README.m28 documentation Marek Vasut
2011-10-21 22:44 ` [U-Boot] [PATCH 00/17 V3] Support for the DENX M28 SoM Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 01/17 RESEND V5] iMX28: Initial support for iMX28 CPU Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 02/17 RESEND] iMX28: Add SSP MMC driver Marek Vasut
2011-11-08 20:45     ` Andy Fleming
2011-11-08 21:42       ` Marek Vasut
2011-11-08 21:50         ` Andy Fleming
2011-11-09  8:18           ` Stefano Babic
2011-11-09  8:38             ` Marek Vasut
2011-11-09  8:52               ` Stefano Babic
2011-10-21 22:44   ` [U-Boot] [PATCH 03/17 RESEND] FEC: Add support for iMX28 quirks Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 04/17 RESEND] iMX28: Add PINMUX control Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 05/17 RESEND V2] iMX28: Add I2C bus driver Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 06/17 RESEND] iMX28: Add GPIO control Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 07/17 RESEND V2] iMX28: Add SPI driver Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 08/17 RESEND] iMX28: Add APBH DMA driver Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 09/17 RESEND V5] iMX28: Add GPMI NAND driver Marek Vasut
2011-11-04 13:13     ` Veli-Pekka Peltola
2011-11-04 13:30       ` Marek Vasut
2011-11-04 14:02         ` Veli-Pekka Peltola
2011-11-05  2:24           ` Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 10/17 RESEND] iMX28: Add driver for internal RTC Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 11/17 RESEND V2] iMX28: Add image header generator tool Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 12/17 V3] iMX28: Add u-boot.sb target to Makefile Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 13/17 V4] iMX28: Add support for DENX M28EVK board Marek Vasut
2011-10-31  9:12     ` Igor Grinberg
2011-10-31 11:42     ` [U-Boot] [PATCH 13/17 V5] " Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 14/17 V4] M28: Add MMC SPL Marek Vasut
2011-10-23 21:42     ` Robert Schwebel
2011-10-31 11:44     ` [U-Boot] [PATCH 14/17 V5] " Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 15/17 RESEND] M28: Add doc/README.m28 documentation Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 16/17] iMX28: Fix ARM vector handling Marek Vasut
2011-10-21 22:44   ` [U-Boot] [PATCH 17/17] M28: Add memory detection into SPL Marek Vasut
2011-10-31 11:45     ` [U-Boot] [PATCH 17/17 V2] " Marek Vasut
2011-11-05  2:39       ` [U-Boot] [PATCH 17/17 V3] " Marek Vasut

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=201109282342.10073.marek.vasut@gmail.com \
    --to=marek.vasut@gmail.com \
    --cc=u-boot@lists.denx.de \
    /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