public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot]  [PATCH] Fix OneNAND ipl to read 256KB
@ 2009-02-26  7:33 Rohit Hagargundgi
  2009-02-26  8:13 ` Jean-Christophe PLAGNIOL-VILLARD
  2009-02-26  8:23 ` Wolfgang Denk
  0 siblings, 2 replies; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-02-26  7:33 UTC (permalink / raw)
  To: u-boot

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

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26  7:33 [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB Rohit Hagargundgi
@ 2009-02-26  8:13 ` Jean-Christophe PLAGNIOL-VILLARD
  2009-02-26 12:31   ` Rohit Hagargundgi
  2009-02-26  8:23 ` Wolfgang Denk
  1 sibling, 1 reply; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2009-02-26  8:13 UTC (permalink / raw)
  To: u-boot

On 13:03 Thu 26 Feb     , Rohit Hagargundgi wrote:
> 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
why hardcoded value?
> 
>   #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));
please add a empty line

and why not do this
	if (page < 2 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
		return 1;

> +		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++)
please add the {} and move the page = 0 to the second 'for' it will be easier
to read and understand
> +		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;
> +		}

Best Regards,
J.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26  7:33 [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB Rohit Hagargundgi
  2009-02-26  8:13 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2009-02-26  8:23 ` Wolfgang Denk
  2009-02-26 10:34   ` Kyungmin Park
  1 sibling, 1 reply; 14+ messages in thread
From: Wolfgang Denk @ 2009-02-26  8:23 UTC (permalink / raw)
  To: u-boot

Dear Rohit Hagargundgi,

In message <49A645E0.9060608@samsung.com> you wrote:
> 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.

What if there is a board that enables additional features and the size
grows above 256 kB?

>   #include <linux/mtd/onenand_regs.h>
> 
>   #define ONENAND_BLOCK_SIZE              2048
> +#define ONENAND_BOOTLOADER_SIZE		0x40000

Why do we need a new #define here. CONFIG_SYS_MONITOR_LEN already
contains the U-Boot image size, and is configurable for each board.

Please drop this #define here and substitute ONENAND_BOOTLOADER_SIZE
by CONFIG_SYS_MONITOR_LEN in the rest of the patch.

Thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
It's not an optical illusion, it just looks like one.   -- Phil White

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26  8:23 ` Wolfgang Denk
@ 2009-02-26 10:34   ` Kyungmin Park
  2009-02-26 20:01     ` Rohit Hagargundgi
  0 siblings, 1 reply; 14+ messages in thread
From: Kyungmin Park @ 2009-02-26 10:34 UTC (permalink / raw)
  To: u-boot

Hi,

In the previous mail, I also solve this issue. multi-block read for IPL

http://www.mail-archive.com/u-boot at lists.denx.de/msg04641.html

Of course, it's not consider the Flex-OneNAND, please apply this one
first and then fix it for Flex-OneNAND.

How do you think?

Thank you,
Kyungmin Park

On Thu, Feb 26, 2009 at 5:23 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Rohit Hagargundgi,
>
> In message <49A645E0.9060608@samsung.com> you wrote:
>> 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.
>
> What if there is a board that enables additional features and the size
> grows above 256 kB?
>
>> ? #include <linux/mtd/onenand_regs.h>
>>
>> ? #define ONENAND_BLOCK_SIZE ? ? ? ? ? ? ?2048
>> +#define ONENAND_BOOTLOADER_SIZE ? ? ? ? ? ? ?0x40000
>
> Why do we need a new #define here. CONFIG_SYS_MONITOR_LEN already
> contains the U-Boot image size, and is configurable for each board.
>
> Please drop this #define here and substitute ONENAND_BOOTLOADER_SIZE
> by CONFIG_SYS_MONITOR_LEN in the rest of the patch.
>
> Thanks.
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> It's not an optical illusion, it just looks like one. ? -- Phil White
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26  8:13 ` 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
  0 siblings, 2 replies; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-02-26 12:31 UTC (permalink / raw)
  To: u-boot

Hi,

Jean-Christophe PLAGNIOL-VILLARD wrote:
>>   #define ONENAND_BLOCK_SIZE              2048
>> +#define ONENAND_BOOTLOADER_SIZE		0x40000
> why hardcoded value?

Is it possible to get image size instead of hard value.
Then we can read exactly u-boot image size on boot up.

>> +	/* Check for invalid block mark*/
>> +	if (page < 2) {
>> +		unsigned int mark = onenand_readw(THIS_ONENAND(ONENAND_SPARERAM));
> please add a empty line
> 
> and why not do this
> 	if (page < 2 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
> 		return 1;

okay.

>> -	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++)
> please add the {} and move the page = 0 to the second 'for' it will be easier
> to read and understand

okay.

Thanks,
Rohit

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26 12:31   ` Rohit Hagargundgi
@ 2009-02-26 12:47     ` Jean-Christophe PLAGNIOL-VILLARD
  2009-02-26 13:56     ` Wolfgang Denk
  1 sibling, 0 replies; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2009-02-26 12:47 UTC (permalink / raw)
  To: u-boot

On 18:01 Thu 26 Feb     , Rohit Hagargundgi wrote:
> Hi,
>
> Jean-Christophe PLAGNIOL-VILLARD wrote:
>>>   #define ONENAND_BLOCK_SIZE              2048
>>> +#define ONENAND_BOOTLOADER_SIZE		0x40000
>> why hardcoded value?
>
> Is it possible to get image size instead of hard value.
> Then we can read exactly u-boot image size on boot up.
as point out Wolfgang you can use the MONITOR_LEN.

If you really need the u-boot.bin size you will need to built it first and then
on the host calculate it and genereate a .h with its size.

But IMHO the MONITOR_LEN will give enough information evenif it's not the real size
to copy u-boot in memory

Best Regards,
J.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26 12:31   ` Rohit Hagargundgi
  2009-02-26 12:47     ` Jean-Christophe PLAGNIOL-VILLARD
@ 2009-02-26 13:56     ` Wolfgang Denk
  1 sibling, 0 replies; 14+ messages in thread
From: Wolfgang Denk @ 2009-02-26 13:56 UTC (permalink / raw)
  To: u-boot

Dear Rohit Hagargundgi,

In message <49A68BA2.80807@samsung.com> you wrote:
> 
> Jean-Christophe PLAGNIOL-VILLARD wrote:
> >>   #define ONENAND_BLOCK_SIZE              2048
> >> +#define ONENAND_BOOTLOADER_SIZE		0x40000
> > why hardcoded value?
> 
> Is it possible to get image size instead of hard value.
> Then we can read exactly u-boot image size on boot up.

Use CONFIG_SYS_MONITOR_LEN as I suggested in my previous message.


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The philosophy exam was a piece of cake  -  which  was  a  bit  of  a
surprise, actually, because I was expecting some questions on a sheet
of paper.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26 10:34   ` Kyungmin Park
@ 2009-02-26 20:01     ` Rohit Hagargundgi
  2009-03-04 15:09       ` Rohit Hagargundgi
  0 siblings, 1 reply; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-02-26 20:01 UTC (permalink / raw)
  To: u-boot

Hi,

Kyungmin Park wrote:
> Hi,
> 
> In the previous mail, I also solve this issue. multi-block read for IPL
> 
> http://www.mail-archive.com/u-boot at lists.denx.de/msg04641.html

oh, okay. So this merge first.

To Scott, Wolfgang - can you please apply this patch.

Also environment block is affected by larger ipl size.
I will repost as per comments.

Thanks and regards,
Rohit

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-02-26 20:01     ` Rohit Hagargundgi
@ 2009-03-04 15:09       ` Rohit Hagargundgi
  2009-03-04 23:55         ` Kyungmin Park
  2009-03-08 22:44         ` Wolfgang Denk
  0 siblings, 2 replies; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-03-04 15:09 UTC (permalink / raw)
  To: u-boot

Hi,

Here is the updated patch.

Thanks,
Rohit

Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
---
  include/configs/apollon.h  |    1 +
  onenand_ipl/onenand_read.c |   27 ++++++++++++++++++++-------
  2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index dff47fc..2e8198f 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -254,6 +254,7 @@

  /* OneNAND boot, OneNAND has CS0, NOR boot ONeNAND has CS2 */
  #define	CONFIG_SYS_ONENAND_BASE	0x00000000
+#define CONFIG_SYS_MONITOR_LEN		SZ_256K	/* U-Boot image size */
  #define	CONFIG_ENV_IS_IN_ONENAND	1
  #define CONFIG_ENV_ADDR		0x00020000

diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c
index 6d04943..6782eac 100644
--- a/onenand_ipl/onenand_read.c
+++ b/onenand_ipl/onenand_read.c
@@ -72,6 +72,10 @@ 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 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
+		return 1;
+
  #ifdef __HAVE_ARCH_MEMCPY32
  	/* 32 bytes boundary memory copy */
  	memcpy32(buf, base, pagesize);
@@ -94,20 +98,29 @@ 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 = CONFIG_SYS_MONITOR_LEN / (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 = (nblocks + 1) >> 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;
+	page = ONENAND_START_PAGE;
+	for (; block < nblocks; 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;
+		}
+		page = 0;
  	}

  	return 0;
-- 
1.6.0.6

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  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
  1 sibling, 1 reply; 14+ messages in thread
From: Kyungmin Park @ 2009-03-04 23:55 UTC (permalink / raw)
  To: u-boot

On Thu, Mar 5, 2009 at 12:09 AM, Rohit Hagargundgi <h.rohit@samsung.com> wrote:
> Hi,
>
> Here is the updated patch.
>
> Thanks,
> Rohit
>
> Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
> ---
> ?include/configs/apollon.h ?| ? ?1 +
> ?onenand_ipl/onenand_read.c | ? 27 ++++++++++++++++++++-------
> ?2 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/include/configs/apollon.h b/include/configs/apollon.h
> index dff47fc..2e8198f 100644
> --- a/include/configs/apollon.h
> +++ b/include/configs/apollon.h
> @@ -254,6 +254,7 @@
>
> ?/* OneNAND boot, OneNAND has CS0, NOR boot ONeNAND has CS2 */
> ?#define ? ? ? CONFIG_SYS_ONENAND_BASE 0x00000000
> +#define CONFIG_SYS_MONITOR_LEN ? ? ? ? SZ_256K /* U-Boot image size */
> ?#define ? ? ? CONFIG_ENV_IS_IN_ONENAND ? ? ? ?1
> ?#define CONFIG_ENV_ADDR ? ? ? ? ? ? ? 0x00020000
>
> diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c
> index 6d04943..6782eac 100644
> --- a/onenand_ipl/onenand_read.c
> +++ b/onenand_ipl/onenand_read.c
> @@ -72,6 +72,10 @@ 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 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
> + ? ? ? ? ? ? ? return 1;
> +

No need to check invalid block. Note that block 0 is always good
block. no exception.
Now you assume block 1 can be invalid block. If true just skip it.
when update bootloader at u-boot or kernel.
there's bad block at block 1. it will skip write. it means bootloader
are located at block 0 and block 2.

> ?#ifdef __HAVE_ARCH_MEMCPY32
> ? ? ? ?/* 32 bytes boundary memory copy */
> ? ? ? ?memcpy32(buf, base, pagesize);
> @@ -94,20 +98,29 @@ 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 = CONFIG_SYS_MONITOR_LEN / (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 = (nblocks + 1) >> 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;
> + ? ? ? page = ONENAND_START_PAGE;
> + ? ? ? for (; block < nblocks; 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;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? page = 0;
> ? ? ? ?}
>
> ? ? ? ?return 0;

NAK, please use previous one as I sent.
In Flex-OneNAND block 0 has 256KiB. need to handle at here how many
blocks are needed.
I also want to use CONFIG_ONENAND_END_BLOCK since we don't know which
OneNAND or Flex-OneNAND are attached to apollon board.

Thank you,
Kyungmin Park

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-03-04 23:55         ` Kyungmin Park
@ 2009-03-08  6:50           ` Rohit Hagargundgi
  0 siblings, 0 replies; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-03-08  6:50 UTC (permalink / raw)
  To: u-boot

Hi,

Kyungmin Park wrote:
>>
>> +       /* Check for invalid block mark*/
>> +       if (page < 2 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
>> +               return 1;
>> +
> 
> No need to check invalid block. Note that block 0 is always good
> block. no exception.

Correct. block 0 is guaranteed to be good.

> Now you assume block 1 can be invalid block. If true just skip it.
> when update bootloader at u-boot or kernel.
> there's bad block at block 1. it will skip write. it means bootloader
> are located at block 0 and block 2.

yes, block 1 is invalid so block 0 and block 2 store bootloader.
so in ipl, we need to check invalid mark. block 1 is detected bad.
block 1 is skipped and block 2 is read for bootloader.

>> +       int nblocks = CONFIG_SYS_MONITOR_LEN / (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 = (nblocks + 1) >> 1;
>> +       }

assuming page size of 2KB, nblocks is initialised to 2.
for 4KB paged devices (like Flex-OneNAND), nblocks gets halved ie 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;
>> +       page = ONENAND_START_PAGE;
>> +       for (; block < nblocks; 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;
>> +               }
>> +               page = 0;
>>        }
>>
>>        return 0;
> 
> NAK, please use previous one as I sent.
> In Flex-OneNAND block 0 has 256KiB. need to handle at here how many
> blocks are needed.

this is taken care above.

> I also want to use CONFIG_ONENAND_END_BLOCK since we don't know which
> OneNAND or Flex-OneNAND are attached to apollon board.

okay. but why not use a variable instead.

Thanks,
Rohit

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-03-04 15:09       ` Rohit Hagargundgi
  2009-03-04 23:55         ` Kyungmin Park
@ 2009-03-08 22:44         ` Wolfgang Denk
  2009-03-09 10:34           ` Rohit Hagargundgi
  1 sibling, 1 reply; 14+ messages in thread
From: Wolfgang Denk @ 2009-03-08 22:44 UTC (permalink / raw)
  To: u-boot

Dear Rohit Hagargundgi,

In message <49AE99C0.9040400@samsung.com> you wrote:
> Hi,
> 
> Here is the updated patch.
> 
> Thanks,
> Rohit

This is not an acceptable commit message.

Please include a reasonable commit message that explains what you are
doinbg and why.

> Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
> ---

Comments must go below this "---" line, not above.

>   include/configs/apollon.h  |    1 +
>   onenand_ipl/onenand_read.c |   27 ++++++++++++++++++++-------
>   2 files changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/include/configs/apollon.h b/include/configs/apollon.h
> index dff47fc..2e8198f 100644
> --- a/include/configs/apollon.h
> +++ b/include/configs/apollon.h
> @@ -254,6 +254,7 @@
> 
>   /* OneNAND boot, OneNAND has CS0, NOR boot ONeNAND has CS2 */
>   #define	CONFIG_SYS_ONENAND_BASE	0x00000000
> +#define CONFIG_SYS_MONITOR_LEN		SZ_256K	/* U-Boot image size */
>   #define	CONFIG_ENV_IS_IN_ONENAND	1
>   #define CONFIG_ENV_ADDR		0x00020000

Your patch is white-space corrupted. Please fix your mailer settings.

>   int onenand_read_block0(unsigned char *buf)
>   {
> -	int page, offset = 0;
> +	int block = 0, page, offset = 0;

Please don;t mix uninitialized and initialized variables on one line.

>   	int pagesize = ONENAND_PAGE_SIZE;
> +	int nblocks = CONFIG_SYS_MONITOR_LEN / (ONENAND_PAGES_PER_BLOCK * ONENAND_PAGE_SIZE);

Line too long.

> +	page = ONENAND_START_PAGE;
> +	for (; block < nblocks; 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;
> +		}
> +		page = 0;

I always consider it a design problem when the loop limits get changed
within the loop. While legal C, it always gives me the creeps.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Politics:  A  strife  of  interests  masquerading  as  a  contest  of
principles. The conduct of public affairs for private advantage.
- Ambrose Bierce

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-03-08 22:44         ` Wolfgang Denk
@ 2009-03-09 10:34           ` Rohit Hagargundgi
  2009-03-09 11:55             ` Wolfgang Denk
  0 siblings, 1 reply; 14+ messages in thread
From: Rohit Hagargundgi @ 2009-03-09 10:34 UTC (permalink / raw)
  To: u-boot

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>
---
 include/configs/apollon.h  |    1 +
 onenand_ipl/onenand_read.c |   27 ++++++++++++++++++++-------
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index dff47fc..2e8198f 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -254,6 +254,7 @@
 
 /* OneNAND boot, OneNAND has CS0, NOR boot ONeNAND has CS2 */
 #define	CONFIG_SYS_ONENAND_BASE	0x00000000
+#define CONFIG_SYS_MONITOR_LEN		SZ_256K	/* U-Boot image size */
 #define	CONFIG_ENV_IS_IN_ONENAND	1
 #define CONFIG_ENV_ADDR		0x00020000
 
diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c
index 6d04943..c3b63ed 100644
--- a/onenand_ipl/onenand_read.c
+++ b/onenand_ipl/onenand_read.c
@@ -72,6 +72,10 @@ 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 && (onenand_readw(THIS_ONENAND(ONENAND_SPARERAM)) != 0xffff))
+		return 1;
+
 #ifdef __HAVE_ARCH_MEMCPY32
 	/* 32 bytes boundary memory copy */
 	memcpy32(buf, base, pagesize);
@@ -87,6 +91,7 @@ static inline int onenand_read_page(ulong block, ulong page,
 
 #define ONENAND_START_PAGE		1
 #define ONENAND_PAGES_PER_BLOCK		64
+#define ONENAND_BLOCK_SIZE	(ONENAND_PAGES_PER_BLOCK * ONENAND_PAGE_SIZE)
 
 /**
  * onenand_read_block - Read a block data to buf
@@ -94,20 +99,28 @@ 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 = ONENAND_START_PAGE, offset = 0;
 	int pagesize = ONENAND_PAGE_SIZE;
+	int nblocks = CONFIG_SYS_MONITOR_LEN / ONENAND_BLOCK_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 = (nblocks + 1) >> 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 (; block < nblocks; 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;
+		}
+		page = 0;
 	}
 
 	return 0;

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB
  2009-03-09 10:34           ` Rohit Hagargundgi
@ 2009-03-09 11:55             ` Wolfgang Denk
  0 siblings, 0 replies; 14+ messages in thread
From: Wolfgang Denk @ 2009-03-09 11:55 UTC (permalink / raw)
  To: u-boot

Dear Rohit Hagargundgi,

In message <200903091604.45906.h.rohit@samsung.com> you wrote:
> 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.

NAK.

The description is wrong:

The code was not changed to read 256 KB (fixed), but to read whetever
there is defined by the CONFIG_SYS_MONITOR_LEN definition.

Please change the commit messages accordingly.

Also, please split this into two separate patches: the first to
implement the feature (changes to onenand_ipl/onenand_read.c), and a
second one to fix the apollon board (changes to
include/configs/apollon.h).

Thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
All a hacker needs is a tight PUSHJ, a loose pair of UUOs, and a warm
place to shift.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2009-03-09 11:55 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-26  7:33 [U-Boot] [PATCH] Fix OneNAND ipl to read 256KB Rohit Hagargundgi
2009-02-26  8:13 ` 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox