All of lore.kernel.org
 help / color / mirror / Atom feed
From: Albert ARIBAUD <albert.u.boot@aribaud.net>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/4] spl: nand: simple: replace readb() with chip specific read_buf()
Date: Thu, 16 Jul 2015 14:43:32 +0200	[thread overview]
Message-ID: <20150716144332.64c4edf2@lilith> (raw)
In-Reply-To: <55A7960E.6000809@mleia.com>

Hello Vladimir,

On Thu, 16 Jul 2015 14:31:26 +0300, Vladimir Zapolskiy <vz@mleia.com>
wrote:
> Hello Albert,
> 
> On 16.07.2015 11:02, Albert ARIBAUD wrote:
> > Hello Vladimir,
> > 
> > On Thu, 16 Jul 2015 02:33:45 +0300, Vladimir Zapolskiy <vz@mleia.com>
> > wrote:
> >> Some NAND controllers define custom functions to read data out,
> >> respect this in order to correctly support bad block handling in
> >> simple SPL NAND framework.
> >>
> >> NAND controller specific read_buf() is used even to read 1 byte in
> >> case of connected 8-bit NAND device, it turns out that read_byte()
> >> may become outdated.
> >>
> >> Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
> >> ---
> >>  drivers/mtd/nand/nand_spl_simple.c | 7 +++++--
> >>  1 file changed, 5 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/mtd/nand/nand_spl_simple.c b/drivers/mtd/nand/nand_spl_simple.c
> >> index 700ca32..e69f662 100644
> >> --- a/drivers/mtd/nand/nand_spl_simple.c
> >> +++ b/drivers/mtd/nand/nand_spl_simple.c
> >> @@ -115,6 +115,7 @@ static int nand_command(int block, int page, uint32_t offs,
> >>  static int nand_is_bad_block(int block)
> >>  {
> >>  	struct nand_chip *this = mtd.priv;
> >> +	u_char bb_data[2];
> >>  
> >>  	nand_command(block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS,
> >>  		NAND_CMD_READOOB);
> >> @@ -123,10 +124,12 @@ static int nand_is_bad_block(int block)
> >>  	 * Read one byte (or two if it's a 16 bit chip).
> >>  	 */
> >>  	if (this->options & NAND_BUSWIDTH_16) {
> >> -		if (readw(this->IO_ADDR_R) != 0xffff)
> >> +		this->read_buf(&mtd, bb_data, 2);
> >> +		if (bb_data[0] != 0xff || bb_data[1] != 0xff)
> >>  			return 1;
> >>  	} else {
> >> -		if (readb(this->IO_ADDR_R) != 0xff)
> >> +		this->read_buf(&mtd, bb_data, 1);
> >> +		if (bb_data[0] != 0xff)
> >>  			return 1;
> >>  	}
> >>  
> >> -- 
> >> 2.1.4
> >>
> > 
> > The way you describe this patch, it looks like a bug that should have
> > bitten way more boards than lpc32xx. Did you have a look at some other
> > boards to see why this did not affect them?
> 
> Yes, it is a bug IMHO.

If it is, then it has hit no board which defines CONFIG_SPL_NAND_SIMPLE
and we should understand why.

> Grepping for CONFIG_SPL_NAND_SIMPLE I see that TI and Tegra boards may
> be impacted (positively or negatively):
> 
> * CONFIG_NAND_OMAP_GPMC --- own .read_buf(), default .read_byte()
> * CONFIG_NAND_DAVINCI   --- own .read_buf(), default .read_byte()
> * CONFIG_TEGRA_NAND     --- own .read_byte(), own .read_buf()

They may be impacted by your change, but they are working now -- they
are not obscure models. Let's dig a bit...

> > Conversively, what is the actual failure scenario that led you to 
> > writing this patch?
> 
> The failure scenario is quite simple, the ARM core gets stuck on first
> attempt to access SLC NAND data register -- traced with JTAG.
> 
> The same happens, if I remove custom .read_byte()/.read_buf() from SLC
> NAND driver. The only difference between custom .read_byte() and shared
> read_byte() is in readb()/readl() access to the data register, it is
> essential to have only 32-bit wide access to SLC NAND registers.

README describes CONFIG_SPL_NAND_SIMPLE as "Support for NAND boot using
simple NAND drivers that expose the cmd_ctrl() interface". The cmd_ctrl
interface actually contains the cmd_ctrl() function *and* the
IO_ADDR_[RW] fields. IOW, a simple NAND driver provides byte or word
access to the NAND's I/O lines on which command, address and data are
passed. If the NAND is 8 bits, then there are 8 lines; if it is 16
bit, then there are 16 lines. 

I reckon that the OMAP/DAVINCI and TEGRA simple drivers just do that:
set IO_ADDR_[RW] to the IP register through which direct access to the
NAND's I/O lines can be performed, byte or word depending on the chip
width.

As such, there is no bug in the way nand_simple.c uses IO_ADDR_[RW].

OTOH, the SLC IP does not provide direct access to the NAND I/O lines
through a general register; what it provides is a set of three
specialized registers one for commands, one for addresses and one
for data. Plus, even though only 8 bit NANDs are supported, the data
register does not physically support 8-bit wide accesses (NXP: I am
still struggling to understand what you were trying to achieve there).

All this basically makes the SLC controller a 'not simple NAND IP', and
its driver a 'not simple NAND driver' incompatible with nand_simple.c.

Your solution to this incompatibility is to change nand_simple.c to
support other types of drivers; but by doing that, you're changing the
API between nand_simple.c and all simple drivers, possibly changing the
established behavior.

I personally don't think this is the right way; nand_simple.c should be
left unchanged and the board should simply not use it since it does not
have a simple NAND controller, and instead it should provide its own
nand_spl_load_image().

But hey, I'm not then NAND custodian. Scott: your call. :)

> --
> With best wishes,
> Vladimir

Amicalement,
-- 
Albert.

  reply	other threads:[~2015-07-16 12:43 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-15 23:33 [U-Boot] [PATCH 0/4] lpc32xx: devkit3250 board update Vladimir Zapolskiy
2015-07-15 23:33 ` [U-Boot] [PATCH 1/4] spl: nand: simple: replace readb() with chip specific read_buf() Vladimir Zapolskiy
2015-07-16  8:02   ` Albert ARIBAUD
2015-07-16 11:31     ` Vladimir Zapolskiy
2015-07-16 12:43       ` Albert ARIBAUD [this message]
2015-07-16 13:48         ` Vladimir Zapolskiy
2015-07-16 14:12           ` Albert ARIBAUD
2015-07-16 19:30             ` Scott Wood
2015-07-15 23:33 ` [U-Boot] [PATCH 2/4] nand: lpc32xx: add SLC NAND controller support Vladimir Zapolskiy
2015-07-16 12:53   ` Albert ARIBAUD
2015-07-16 20:14     ` Scott Wood
2015-07-16 20:18       ` Vladimir Zapolskiy
2015-07-16 20:20   ` Scott Wood
2015-07-16 20:29     ` Vladimir Zapolskiy
2015-07-15 23:33 ` [U-Boot] [PATCH 3/4] lpc32xx: devkit3250: update of board configuration Vladimir Zapolskiy
2015-07-16  7:27   ` Albert ARIBAUD
2015-07-16 12:05     ` Vladimir Zapolskiy
2015-07-16 12:45       ` Albert ARIBAUD
2015-07-15 23:33 ` [U-Boot] [PATCH 4/4] lpc32xx: devkit3250: add spl build support Vladimir Zapolskiy

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=20150716144332.64c4edf2@lilith \
    --to=albert.u.boot@aribaud.net \
    --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 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.