From: Rohit Hagargundgi <h.rohit@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
Date: Thu, 26 Feb 2009 13:03:52 +0530 [thread overview]
Message-ID: <49A645E0.9060608@samsung.com> (raw)
Currently OneNAND initial program loader (ipl) reads only block 0.
However, u-boot image for apollon board is 195KB making the board
unbootable with OneNAND.
Fix ipl to read 256KB.
Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
---
onenand_ipl/onenand_ipl.h | 1 +
onenand_ipl/onenand_read.c | 29 +++++++++++++++++++++--------
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/onenand_ipl/onenand_ipl.h b/onenand_ipl/onenand_ipl.h
index 3387998..f96e88a 100644
--- a/onenand_ipl/onenand_ipl.h
+++ b/onenand_ipl/onenand_ipl.h
@@ -24,6 +24,7 @@
#include <linux/mtd/onenand_regs.h>
#define ONENAND_BLOCK_SIZE 2048
+#define ONENAND_BOOTLOADER_SIZE 0x40000
#ifndef CONFIG_SYS_PRINTF
#define printf(format, args...)
diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c
index 6d04943..33c66ff 100644
--- a/onenand_ipl/onenand_read.c
+++ b/onenand_ipl/onenand_read.c
@@ -72,6 +72,13 @@ static inline int onenand_read_page(ulong block, ulong page,
while (!(READ_INTERRUPT() & ONENAND_INT_READ))
continue;
+ /* Check for invalid block mark*/
+ if (page < 2) {
+ unsigned int mark = onenand_readw(THIS_ONENAND(ONENAND_SPARERAM));
+ if (mark != 0xffff)
+ return 1;
+ }
+
#ifdef __HAVE_ARCH_MEMCPY32
/* 32 bytes boundary memory copy */
memcpy32(buf, base, pagesize);
@@ -94,21 +101,27 @@ static inline int onenand_read_page(ulong block, ulong page,
*/
int onenand_read_block0(unsigned char *buf)
{
- int page, offset = 0;
+ int block = 0, page, offset = 0;
int pagesize = ONENAND_PAGE_SIZE;
+ int nblocks = ONENAND_BOOTLOADER_SIZE / (ONENAND_PAGES_PER_BLOCK * ONENAND_PAGE_SIZE);
/* MLC OneNAND has 4KiB page size */
- if (onenand_readw(THIS_ONENAND(ONENAND_REG_TECHNOLOGY)))
+ if (onenand_readw(THIS_ONENAND(ONENAND_REG_TECHNOLOGY))) {
pagesize <<= 1;
+ nblocks >>= 1;
+ }
/* NOTE: you must read page from page 1 of block 0 */
/* read the block page by page*/
- for (page = ONENAND_START_PAGE;
- page < ONENAND_PAGES_PER_BLOCK; page++) {
-
- onenand_read_page(0, page, buf + offset, pagesize);
- offset += pagesize;
- }
+ for (page = ONENAND_START_PAGE; block < nblocks; page = 0, block++)
+ for (; page < ONENAND_PAGES_PER_BLOCK; page++) {
+ if (onenand_read_page(block, page, buf + offset, pagesize)) {
+ /* This block is bad. Skip it and read next block */
+ nblocks++;
+ break;
+ }
+ offset += pagesize;
+ }
return 0;
}
--
1.6.0.6
next reply other threads:[~2009-02-26 7:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-26 7:33 Rohit Hagargundgi [this message]
2009-02-26 8:13 ` [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB Jean-Christophe PLAGNIOL-VILLARD
2009-02-26 12:31 ` Rohit Hagargundgi
2009-02-26 12:47 ` Jean-Christophe PLAGNIOL-VILLARD
2009-02-26 13:56 ` Wolfgang Denk
2009-02-26 8:23 ` Wolfgang Denk
2009-02-26 10:34 ` Kyungmin Park
2009-02-26 20:01 ` Rohit Hagargundgi
2009-03-04 15:09 ` Rohit Hagargundgi
2009-03-04 23:55 ` Kyungmin Park
2009-03-08 6:50 ` Rohit Hagargundgi
2009-03-08 22:44 ` Wolfgang Denk
2009-03-09 10:34 ` Rohit Hagargundgi
2009-03-09 11:55 ` Wolfgang Denk
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=49A645E0.9060608@samsung.com \
--to=h.rohit@samsung.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 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.