All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot]  [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
@ 2009-09-24  6:13 Amul Kumar Saha
  2009-11-04  5:09 ` Amul Kumar Saha
  0 siblings, 1 reply; 10+ messages in thread
From: Amul Kumar Saha @ 2009-09-24  6:13 UTC (permalink / raw)
  To: u-boot

Add command for changing Flex-OneNAND SLC / MLC boundary.
Also onenand commands work for Flex-OneNAND.

Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
Signed-off-by: Amul Kumar Saha <amul.saha@samsung.com>
---
 common/cmd_onenand.c      |   90 +++++++++++++++++++++++++++++++++-------------
 include/configs/apollon.h |    2 -
 2 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
index 9090940..a34befe 100644
--- a/common/cmd_onenand.c
+++ b/common/cmd_onenand.c
@@ -69,36 +69,49 @@ static int arg_off_size(int argc, char *argv[], ulong *off, size_t *size)
 	return 0;
 }

+static inline int onenand_blocksize(loff_t ofs)
+{
+	struct onenand_chip *this = mtd->priv;
+	int i;
+
+	if (!FLEXONENAND(this))
+		return mtd->erasesize;
+
+	i = flexonenand_region(mtd, ofs);
+	return mtd->eraseregions[i].erasesize;
+}
+
 static int onenand_block_read(loff_t from, size_t len,
 			      size_t *retlen, u_char *buf, int oob)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = (int) len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks = (int) onenand_block(this, from + len)
+			 - onenand_block(this, from);
+	int blocksize;
 	loff_t ofs = from;
 	struct mtd_oob_ops ops = {
 		.retlen		= 0,
 	};
 	int ret;

-	if (oob)
-		ops.ooblen = blocksize;
-	else
-		ops.len = blocksize;
-
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			ofs += blocksize;
 			continue;
 		}

-		if (oob)
+		if (oob) {
 			ops.oobbuf = buf;
-		else
+			ops.ooblen = blocksize;
+		} else {
 			ops.datbuf = buf;
+			ops.len = blocksize;
+		}

 		ops.retlen = 0;
 		ret = mtd->read_oob(mtd, ofs, &ops);
@@ -120,8 +133,7 @@ static int onenand_block_write(loff_t to, size_t len,
 			       size_t *retlen, const u_char * buf)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks, blocksize;
 	loff_t ofs;
 	size_t _retlen = 0;
 	int ret;
@@ -135,11 +147,16 @@ static int onenand_block_write(loff_t to, size_t len,
 	}
 	ofs = to;

+	blocks = (int) onenand_block(this, ofs + len)
+		- onenand_block(this, ofs);
+
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			skip_ofs += blocksize;
 			goto next;
 		}
@@ -169,13 +186,15 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 	};
 	loff_t ofs;
 	int ret;
-	int blocksize = 1 << this->erase_shift;
+	int blocksize;

 	for (ofs = start; ofs < (start + size); ofs += blocksize) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret && !force) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}

@@ -186,7 +205,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 		ret = mtd->erase(mtd, &instr);
 		if (ret) {
 			printf("erase failed block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}
 	}
@@ -223,25 +242,28 @@ static int onenand_block_test(u32 start, u32 size)
 		return -1;
 	}

-	start_block = start >> this->erase_shift;
-	end_block = (start + size) >> this->erase_shift;
+	start_block = onenand_block(this, start);
+	end_block = onenand_block(this, start + size);

 	/* Protect boot-loader from badblock testing */
 	if (start_block < 2)
 		start_block = 2;

-	if (end_block > (mtd->size >> this->erase_shift))
-		end_block = mtd->size >> this->erase_shift;
+	if (end_block > onenand_block(this, mtd->size))
+		end_block = onenand_block(this, mtd->size);

 	blocks = start_block;
 	ofs = start;
 	while (blocks < end_block) {
-		printf("\rTesting block %d@0x%x", (u32)(ofs >> this->erase_shift), (u32)ofs);
+		printf("\rTesting block %d at 0x%x",
+			(u32) onenand_block(this, ofs), (u32)ofs);
+
+		blocksize = onenand_blocksize(ofs);

 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			goto next;
 		}

@@ -345,7 +367,6 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

 	mtd = &onenand_mtd;
 	this = mtd->priv;
-	blocksize = (1 << this->erase_shift);

 	cmd = argv[1];

@@ -363,9 +384,11 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 		if (strcmp(cmd, "bad") == 0) {
 			/* Currently only one OneNAND device is supported */
 			printf("\nDevice %d bad blocks:\n", 0);
-			for (ofs = 0; ofs < mtd->size; ofs += mtd->erasesize) {
+			for (ofs = 0; ofs < mtd->size; ofs += blocksize) {
 				if (mtd->block_isbad(mtd, ofs))
 					printf("  %08x\n", (u32)ofs);
+
+				blocksize = onenand_blocksize(ofs);
 			}

 			return 0;
@@ -474,6 +497,21 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			return ret == 0 ? 1 : 0;
 		}

+		if (strncmp(cmd, "setboundary", 11) == 0) {
+			int die, bdry, lock = 0;
+
+			if (argc < 4)
+				goto usage;
+
+			die = (int) strict_strtoul(argv[2], NULL, 0);
+			bdry = (int) strict_strtoul(argv[3], NULL, 0);
+
+			if (argc == 5 && strncmp(argv[4], "LOCK", 4) == 0)
+				lock = 1;
+
+			return flexonenand_set_boundary(mtd, die, bdry, lock);
+		}
+
 		break;
 	}

@@ -493,9 +531,11 @@ U_BOOT_CMD(
 	"onenand write[.oob] addr off size\n"
 	"    read/write 'size' bytes starting at offset 'off'\n"
 	"    to/from memory address 'addr', skipping bad blocks.\n"
-	"onenand erase [force] [off size] - erase 'size' bytes from\n"
+	"onenand erase [force] [off size] - erase 'size' bytes from off\n"
 	"onenand test [off size] - test 'size' bytes from\n"
 	"    offset 'off' (entire device if not specified)\n"
 	"onenand dump[.oob] off - dump page\n"
 	"onenand markbad off [...] - mark bad block(s)@offset (UNSAFE)"
+	"onenand setboundary DIE BOUNDARY [LOCK] - \n"
+	"Change SLC boundary of Flex-OneNAND\n"
 );
diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index ddac5fb..5a97743 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -77,7 +77,7 @@
  */
 #define	CONFIG_ENV_SIZE SZ_128K	/* Total Size of Environment Sector */
 #define CONFIG_ENV_SIZE_FLEX SZ_256K
-#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_1M)
+#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_2M)
 /* bytes reserved for initial data */
 #define	CONFIG_SYS_GBL_DATA_SIZE	128

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-09-24  6:13 [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings Amul Kumar Saha
@ 2009-11-04  5:09 ` Amul Kumar Saha
  2009-11-05 23:08   ` Scott Wood
  0 siblings, 1 reply; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-04  5:09 UTC (permalink / raw)
  To: u-boot

Add command for changing Flex-OneNAND SLC / MLC boundary.
Also onenand commands work for Flex-OneNAND.

Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
Signed-off-by: Amul Kumar Saha <amul.saha@samsung.com>
---
 common/cmd_onenand.c      |   90 +++++++++++++++++++++++++++++++++-------------
 include/configs/apollon.h |    2 -
 2 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
index 9090940..a34befe 100644
--- a/common/cmd_onenand.c
+++ b/common/cmd_onenand.c
@@ -69,36 +69,49 @@ static int arg_off_size(int argc, char *argv[], ulong *off, size_t *size)
 	return 0;
 }

+static inline int onenand_blocksize(loff_t ofs)
+{
+	struct onenand_chip *this = mtd->priv;
+	int i;
+
+	if (!FLEXONENAND(this))
+		return mtd->erasesize;
+
+	i = flexonenand_region(mtd, ofs);
+	return mtd->eraseregions[i].erasesize;
+}
+
 static int onenand_block_read(loff_t from, size_t len,
 			      size_t *retlen, u_char *buf, int oob)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = (int) len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks = (int) onenand_block(this, from + len)
+			 - onenand_block(this, from);
+	int blocksize;
 	loff_t ofs = from;
 	struct mtd_oob_ops ops = {
 		.retlen		= 0,
 	};
 	int ret;

-	if (oob)
-		ops.ooblen = blocksize;
-	else
-		ops.len = blocksize;
-
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			ofs += blocksize;
 			continue;
 		}

-		if (oob)
+		if (oob) {
 			ops.oobbuf = buf;
-		else
+			ops.ooblen = blocksize;
+		} else {
 			ops.datbuf = buf;
+			ops.len = blocksize;
+		}

 		ops.retlen = 0;
 		ret = mtd->read_oob(mtd, ofs, &ops);
@@ -120,8 +133,7 @@ static int onenand_block_write(loff_t to, size_t len,
 			       size_t *retlen, const u_char * buf)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks, blocksize;
 	loff_t ofs;
 	size_t _retlen = 0;
 	int ret;
@@ -135,11 +147,16 @@ static int onenand_block_write(loff_t to, size_t len,
 	}
 	ofs = to;

+	blocks = (int) onenand_block(this, ofs + len)
+		- onenand_block(this, ofs);
+
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			skip_ofs += blocksize;
 			goto next;
 		}
@@ -169,13 +186,15 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 	};
 	loff_t ofs;
 	int ret;
-	int blocksize = 1 << this->erase_shift;
+	int blocksize;

 	for (ofs = start; ofs < (start + size); ofs += blocksize) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret && !force) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}

@@ -186,7 +205,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 		ret = mtd->erase(mtd, &instr);
 		if (ret) {
 			printf("erase failed block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}
 	}
@@ -223,25 +242,28 @@ static int onenand_block_test(u32 start, u32 size)
 		return -1;
 	}

-	start_block = start >> this->erase_shift;
-	end_block = (start + size) >> this->erase_shift;
+	start_block = onenand_block(this, start);
+	end_block = onenand_block(this, start + size);

 	/* Protect boot-loader from badblock testing */
 	if (start_block < 2)
 		start_block = 2;

-	if (end_block > (mtd->size >> this->erase_shift))
-		end_block = mtd->size >> this->erase_shift;
+	if (end_block > onenand_block(this, mtd->size))
+		end_block = onenand_block(this, mtd->size);

 	blocks = start_block;
 	ofs = start;
 	while (blocks < end_block) {
-		printf("\rTesting block %d@0x%x", (u32)(ofs >> this->erase_shift), (u32)ofs);
+		printf("\rTesting block %d at 0x%x",
+			(u32) onenand_block(this, ofs), (u32)ofs);
+
+		blocksize = onenand_blocksize(ofs);

 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			goto next;
 		}

@@ -345,7 +367,6 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

 	mtd = &onenand_mtd;
 	this = mtd->priv;
-	blocksize = (1 << this->erase_shift);

 	cmd = argv[1];

@@ -363,9 +384,11 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 		if (strcmp(cmd, "bad") == 0) {
 			/* Currently only one OneNAND device is supported */
 			printf("\nDevice %d bad blocks:\n", 0);
-			for (ofs = 0; ofs < mtd->size; ofs += mtd->erasesize) {
+			for (ofs = 0; ofs < mtd->size; ofs += blocksize) {
 				if (mtd->block_isbad(mtd, ofs))
 					printf("  %08x\n", (u32)ofs);
+
+				blocksize = onenand_blocksize(ofs);
 			}

 			return 0;
@@ -474,6 +497,21 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			return ret == 0 ? 1 : 0;
 		}

+		if (strncmp(cmd, "setboundary", 11) == 0) {
+			int die, bdry, lock = 0;
+
+			if (argc < 4)
+				goto usage;
+
+			die = (int) simple_strtoul(argv[2], NULL, 0);
+			bdry = (int) simple_strtoul(argv[3], NULL, 0);
+
+			if (argc == 5 && strncmp(argv[4], "LOCK", 4) == 0)
+				lock = 1;
+
+			return flexonenand_set_boundary(mtd, die, bdry, lock);
+		}
+
 		break;
 	}

@@ -493,9 +531,11 @@ U_BOOT_CMD(
 	"onenand write[.oob] addr off size\n"
 	"    read/write 'size' bytes starting at offset 'off'\n"
 	"    to/from memory address 'addr', skipping bad blocks.\n"
-	"onenand erase [force] [off size] - erase 'size' bytes from\n"
+	"onenand erase [force] [off size] - erase 'size' bytes from off\n"
 	"onenand test [off size] - test 'size' bytes from\n"
 	"    offset 'off' (entire device if not specified)\n"
 	"onenand dump[.oob] off - dump page\n"
 	"onenand markbad off [...] - mark bad block(s)@offset (UNSAFE)"
+	"onenand setboundary DIE BOUNDARY [LOCK] - \n"
+	"Change SLC boundary of Flex-OneNAND\n"
 );
diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index ddac5fb..5a97743 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -77,7 +77,7 @@
  */
 #define	CONFIG_ENV_SIZE SZ_128K	/* Total Size of Environment Sector */
 #define CONFIG_ENV_SIZE_FLEX SZ_256K
-#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_1M)
+#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_2M)
 /* bytes reserved for initial data */
 #define	CONFIG_SYS_GBL_DATA_SIZE	128

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-04  5:09 ` Amul Kumar Saha
@ 2009-11-05 23:08   ` Scott Wood
  2009-11-06 11:43     ` Amul Kumar Saha
  0 siblings, 1 reply; 10+ messages in thread
From: Scott Wood @ 2009-11-05 23:08 UTC (permalink / raw)
  To: u-boot

On Wed, Nov 04, 2009 at 10:39:41AM +0530, Amul Kumar Saha wrote:
>  	while (blocks) {
> +		blocksize = onenand_blocksize(ofs);
> +
>  		ret = mtd->block_isbad(mtd, ofs);
>  		if (ret) {
>  			printk("Bad blocks %d at 0x%x\n",
> -			       (u32)(ofs >> this->erase_shift), (u32)ofs);
> +			       (u32)onenand_block(this, ofs), (u32)ofs);

This isn't new, but %d doesn't match u32 (though I guess GCC doesn't
complain about signedness) -- and we shouldn't be chopping off the upper
bits of ofs.

> +	blocks = (int) onenand_block(this, ofs + len)
> +		- onenand_block(this, ofs);

Unnecessary cast.

> @@ -493,9 +531,11 @@ U_BOOT_CMD(
>  	"onenand write[.oob] addr off size\n"
>  	"    read/write 'size' bytes starting at offset 'off'\n"
>  	"    to/from memory address 'addr', skipping bad blocks.\n"
> -	"onenand erase [force] [off size] - erase 'size' bytes from\n"
> +	"onenand erase [force] [off size] - erase 'size' bytes from off\n"
>  	"onenand test [off size] - test 'size' bytes from\n"
>  	"    offset 'off' (entire device if not specified)\n"
>  	"onenand dump[.oob] off - dump page\n"
>  	"onenand markbad off [...] - mark bad block(s) at offset (UNSAFE)"
> +	"onenand setboundary DIE BOUNDARY [LOCK] - \n"
> +	"Change SLC boundary of Flex-OneNAND\n"

Description should be indented if you're going to put it on a new line.

-Scott

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-05 23:08   ` Scott Wood
@ 2009-11-06 11:43     ` Amul Kumar Saha
  2009-11-06 11:47       ` Amul Kumar Saha
  0 siblings, 1 reply; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-06 11:43 UTC (permalink / raw)
  To: u-boot

>>  while (blocks) {
>> + blocksize = onenand_blocksize(ofs);
>> +
>>  ret = mtd->block_isbad(mtd, ofs);
>>  if (ret) {
>>  printk("Bad blocks %d at 0x%x\n",
>> -        (u32)(ofs >> this->erase_shift), (u32)ofs);
>> +        (u32)onenand_block(this, ofs), (u32)ofs);
>
> This isn't new, but %d doesn't match u32 (though I guess GCC doesn't
> complain about signedness) -- and we shouldn't be chopping off the upper
> bits of ofs.
>

Accepted and Corrected

>> + blocks = (int) onenand_block(this, ofs + len)
>> + - onenand_block(this, ofs);
>
> Unnecessary cast.
>

Yes, got that.

>> @@ -493,9 +531,11 @@ U_BOOT_CMD(
>>  "onenand write[.oob] addr off size\n"
>>  "    read/write 'size' bytes starting at offset 'off'\n"
>>  "    to/from memory address 'addr', skipping bad blocks.\n"
>> - "onenand erase [force] [off size] - erase 'size' bytes from\n"
>> + "onenand erase [force] [off size] - erase 'size' bytes from off\n"
>>  "onenand test [off size] - test 'size' bytes from\n"
>>  "    offset 'off' (entire device if not specified)\n"
>>  "onenand dump[.oob] off - dump page\n"
>>  "onenand markbad off [...] - mark bad block(s) at offset (UNSAFE)"
>> + "onenand setboundary DIE BOUNDARY [LOCK] - \n"
>> + "Change SLC boundary of Flex-OneNAND\n"
>
> Description should be indented if you're going to put it on a new line.
>

I've put '\t' instead now.

Regards,
Amul 

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-06 11:43     ` Amul Kumar Saha
@ 2009-11-06 11:47       ` Amul Kumar Saha
  2009-11-09 20:02         ` Scott Wood
  0 siblings, 1 reply; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-06 11:47 UTC (permalink / raw)
  To: u-boot

Add command for changing Flex-OneNAND SLC / MLC boundary.
Also onenand commands work for Flex-OneNAND.

Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
Signed-off-by: Amul Kumar Saha <amul.saha@samsung.com>
---
 common/cmd_onenand.c      |   98 ++++++++++++++++++++++++++++++++--------------
 include/configs/apollon.h |    2
 2 files changed, 70 insertions(+), 30 deletions(-)

diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
index 9090940..1d0778e 100644
--- a/common/cmd_onenand.c
+++ b/common/cmd_onenand.c
@@ -69,36 +69,49 @@ static int arg_off_size(int argc, char *argv[], ulong *off, size_t *size)
 	return 0;
 }

+static inline int onenand_blocksize(loff_t ofs)
+{
+	struct onenand_chip *this = mtd->priv;
+	int i;
+
+	if (!FLEXONENAND(this))
+		return mtd->erasesize;
+
+	i = flexonenand_region(mtd, ofs);
+	return mtd->eraseregions[i].erasesize;
+}
+
 static int onenand_block_read(loff_t from, size_t len,
 			      size_t *retlen, u_char *buf, int oob)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = (int) len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks = onenand_block(this, from + len)
+		- onenand_block(this, from);
+	int blocksize;
 	loff_t ofs = from;
 	struct mtd_oob_ops ops = {
 		.retlen		= 0,
 	};
 	int ret;

-	if (oob)
-		ops.ooblen = blocksize;
-	else
-		ops.len = blocksize;
-
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
-			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printk("Bad blocks %lu at 0x%x\n",
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			ofs += blocksize;
 			continue;
 		}

-		if (oob)
+		if (oob) {
 			ops.oobbuf = buf;
-		else
+			ops.ooblen = blocksize;
+		} else {
 			ops.datbuf = buf;
+			ops.len = blocksize;
+		}

 		ops.retlen = 0;
 		ret = mtd->read_oob(mtd, ofs, &ops);
@@ -120,8 +133,7 @@ static int onenand_block_write(loff_t to, size_t len,
 			       size_t *retlen, const u_char * buf)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks, blocksize;
 	loff_t ofs;
 	size_t _retlen = 0;
 	int ret;
@@ -135,11 +147,16 @@ static int onenand_block_write(loff_t to, size_t len,
 	}
 	ofs = to;

+	blocks = (int) onenand_block(this, ofs + len)
+		- onenand_block(this, ofs);
+
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			skip_ofs += blocksize;
 			goto next;
 		}
@@ -169,13 +186,15 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 	};
 	loff_t ofs;
 	int ret;
-	int blocksize = 1 << this->erase_shift;
+	int blocksize;

 	for (ofs = start; ofs < (start + size); ofs += blocksize) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret && !force) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}

@@ -186,7 +205,7 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 		ret = mtd->erase(mtd, &instr);
 		if (ret) {
 			printf("erase failed block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			continue;
 		}
 	}
@@ -223,25 +242,28 @@ static int onenand_block_test(u32 start, u32 size)
 		return -1;
 	}

-	start_block = start >> this->erase_shift;
-	end_block = (start + size) >> this->erase_shift;
+	start_block = onenand_block(this, start);
+	end_block = onenand_block(this, start + size);

 	/* Protect boot-loader from badblock testing */
 	if (start_block < 2)
 		start_block = 2;

-	if (end_block > (mtd->size >> this->erase_shift))
-		end_block = mtd->size >> this->erase_shift;
+	if (end_block > onenand_block(this, mtd->size))
+		end_block = onenand_block(this, mtd->size);

 	blocks = start_block;
 	ofs = start;
 	while (blocks < end_block) {
-		printf("\rTesting block %d@0x%x", (u32)(ofs >> this->erase_shift), (u32)ofs);
+		printf("\rTesting block %d at 0x%x",
+			(u32) onenand_block(this, ofs), (u32)ofs);
+
+		blocksize = onenand_blocksize(ofs);

 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
 			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			       (u32)onenand_block(this, ofs), (u32)ofs);
 			goto next;
 		}

@@ -345,7 +367,6 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

 	mtd = &onenand_mtd;
 	this = mtd->priv;
-	blocksize = (1 << this->erase_shift);

 	cmd = argv[1];

@@ -363,9 +384,11 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 		if (strcmp(cmd, "bad") == 0) {
 			/* Currently only one OneNAND device is supported */
 			printf("\nDevice %d bad blocks:\n", 0);
-			for (ofs = 0; ofs < mtd->size; ofs += mtd->erasesize) {
+			for (ofs = 0; ofs < mtd->size; ofs += blocksize) {
 				if (mtd->block_isbad(mtd, ofs))
 					printf("  %08x\n", (u32)ofs);
+
+				blocksize = onenand_blocksize(ofs);
 			}

 			return 0;
@@ -474,6 +497,21 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			return ret == 0 ? 1 : 0;
 		}

+		if (strncmp(cmd, "setboundary", 11) == 0) {
+			int die, bdry, lock = 0;
+
+			if (argc < 4)
+				goto usage;
+
+			die = (int) simple_strtoul(argv[2], NULL, 0);
+			bdry = (int) simple_strtoul(argv[3], NULL, 0);
+
+			if (argc == 5 && strncmp(argv[4], "LOCK", 4) == 0)
+				lock = 1;
+
+			return flexonenand_set_boundary(mtd, die, bdry, lock);
+		}
+
 		break;
 	}

@@ -491,11 +529,13 @@ U_BOOT_CMD(
 	"onenand bad - show bad blocks\n"
 	"onenand read[.oob] addr off size\n"
 	"onenand write[.oob] addr off size\n"
-	"    read/write 'size' bytes starting at offset 'off'\n"
-	"    to/from memory address 'addr', skipping bad blocks.\n"
-	"onenand erase [force] [off size] - erase 'size' bytes from\n"
+	"\tread/write 'size' bytes starting at offset 'off'\n"
+	"\tto/from memory address 'addr', skipping bad blocks.\n"
+	"onenand erase [force] [off size] - erase 'size' bytes from off\n"
 	"onenand test [off size] - test 'size' bytes from\n"
-	"    offset 'off' (entire device if not specified)\n"
+	"\toffset 'off' (entire device if not specified)\n"
 	"onenand dump[.oob] off - dump page\n"
 	"onenand markbad off [...] - mark bad block(s)@offset (UNSAFE)"
+	"onenand setboundary DIE BOUNDARY [LOCK] - \n"
+	"\tChange SLC boundary of Flex-OneNAND\n"
 );
diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index ddac5fb..5a97743 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -77,7 +77,7 @@
  */
 #define	CONFIG_ENV_SIZE SZ_128K	/* Total Size of Environment Sector */
 #define CONFIG_ENV_SIZE_FLEX SZ_256K
-#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_1M)
+#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_2M)
 /* bytes reserved for initial data */
 #define	CONFIG_SYS_GBL_DATA_SIZE	128

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-06 11:47       ` Amul Kumar Saha
@ 2009-11-09 20:02         ` Scott Wood
  2009-11-11  5:56           ` Amul Kumar Saha
  2009-11-11  5:57           ` Amul Kumar Saha
  0 siblings, 2 replies; 10+ messages in thread
From: Scott Wood @ 2009-11-09 20:02 UTC (permalink / raw)
  To: u-boot

On Fri, Nov 06, 2009 at 05:17:44PM +0530, Amul Kumar Saha wrote:
> -			printk("Bad blocks %d at 0x%x\n",
> -			       (u32)(ofs >> this->erase_shift), (u32)ofs);
> +			printk("Bad blocks %lu at 0x%x\n",
> +			       (u32)onenand_block(this, ofs), (u32)ofs);

cmd_onenand.c: In function ?onenand_block_read?:
cmd_onenand.c:103: warning: format ?%lu? expects type ?long unsigned int?,
but argument 2 has type ?unsigned int?

If you must pass a u32 to printf, use "%u" or "%x" -- but it makes little
sense to explicitly cast from int to something that doesn't have a standard
printf format string.

How about this?

+			printk("Bad block %d at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);

Likewise throughout the rest of the file.

-Scott

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-09 20:02         ` Scott Wood
@ 2009-11-11  5:56           ` Amul Kumar Saha
  2009-11-11  5:57           ` Amul Kumar Saha
  1 sibling, 0 replies; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-11  5:56 UTC (permalink / raw)
  To: u-boot

Hi Scott,


> On Fri, Nov 06, 2009 at 05:17:44PM +0530, Amul Kumar Saha wrote:
>> - printk("Bad blocks %d at 0x%x\n",
>> -        (u32)(ofs >> this->erase_shift), (u32)ofs);
>> + printk("Bad blocks %lu at 0x%x\n",
>> +        (u32)onenand_block(this, ofs), (u32)ofs);
>
> cmd_onenand.c: In function 'onenand_block_read':
> cmd_onenand.c:103: warning: format '%lu' expects type 'long unsigned int',
> but argument 2 has type 'unsigned int'
>
My bad.

> If you must pass a u32 to printf, use "%u" or "%x" -- but it makes little
> sense to explicitly cast from int to something that doesn't have a standard
> printf format string.
>
> How about this?
>
> + printk("Bad block %d at 0x%llx\n",
> +        onenand_block(this, ofs), ofs);
>
Accepted and Corrected.

> Likewise throughout the rest of the file.
>
Yes, there are areas that need sanity clean-ups.
I'll send a patch for the same, shortly.

Regards,
Amul Kumar Saha 

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-09 20:02         ` Scott Wood
  2009-11-11  5:56           ` Amul Kumar Saha
@ 2009-11-11  5:57           ` Amul Kumar Saha
  2009-11-16 22:56             ` Wolfgang Denk
  1 sibling, 1 reply; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-11  5:57 UTC (permalink / raw)
  To: u-boot

Add command for changing Flex-OneNAND SLC / MLC boundary.
Also onenand commands work for Flex-OneNAND.

Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
Signed-off-by: Amul Kumar Saha <amul.saha@samsung.com>
---
 common/cmd_onenand.c      |  106 +++++++++++++++++++++++++++++++---------------
 include/configs/apollon.h |    2
 2 files changed, 74 insertions(+), 34 deletions(-)

diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
index 9090940..d6aff90 100644
--- a/common/cmd_onenand.c
+++ b/common/cmd_onenand.c
@@ -69,36 +69,49 @@ static int arg_off_size(int argc, char *argv[], ulong *off, size_t *size)
 	return 0;
 }

+static inline int onenand_blocksize(loff_t ofs)
+{
+	struct onenand_chip *this = mtd->priv;
+	int i;
+
+	if (!FLEXONENAND(this))
+		return mtd->erasesize;
+
+	i = flexonenand_region(mtd, ofs);
+	return mtd->eraseregions[i].erasesize;
+}
+
 static int onenand_block_read(loff_t from, size_t len,
 			      size_t *retlen, u_char *buf, int oob)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = (int) len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks = onenand_block(this, from + len)
+		- onenand_block(this, from);
+	int blocksize;
 	loff_t ofs = from;
 	struct mtd_oob_ops ops = {
 		.retlen		= 0,
 	};
 	int ret;

-	if (oob)
-		ops.ooblen = blocksize;
-	else
-		ops.len = blocksize;
-
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
-			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printk("Bad blocks %u at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);
 			ofs += blocksize;
 			continue;
 		}

-		if (oob)
+		if (oob) {
 			ops.oobbuf = buf;
-		else
+			ops.ooblen = blocksize;
+		} else {
 			ops.datbuf = buf;
+			ops.len = blocksize;
+		}

 		ops.retlen = 0;
 		ret = mtd->read_oob(mtd, ofs, &ops);
@@ -120,8 +133,7 @@ static int onenand_block_write(loff_t to, size_t len,
 			       size_t *retlen, const u_char * buf)
 {
 	struct onenand_chip *this = mtd->priv;
-	int blocks = len >> this->erase_shift;
-	int blocksize = (1 << this->erase_shift);
+	int blocks, blocksize;
 	loff_t ofs;
 	size_t _retlen = 0;
 	int ret;
@@ -135,11 +147,16 @@ static int onenand_block_write(loff_t to, size_t len,
 	}
 	ofs = to;

+	blocks = (int) onenand_block(this, ofs + len)
+		- onenand_block(this, ofs);
+
 	while (blocks) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
-			printk("Bad blocks %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printk("Bad blocks %u at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);
 			skip_ofs += blocksize;
 			goto next;
 		}
@@ -169,13 +186,15 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 	};
 	loff_t ofs;
 	int ret;
-	int blocksize = 1 << this->erase_shift;
+	int blocksize;

 	for (ofs = start; ofs < (start + size); ofs += blocksize) {
+		blocksize = onenand_blocksize(ofs);
+
 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret && !force) {
-			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printf("Skip erase bad block %u at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);
 			continue;
 		}

@@ -185,8 +204,8 @@ static int onenand_block_erase(u32 start, u32 size, int force)
 		instr.mtd = mtd;
 		ret = mtd->erase(mtd, &instr);
 		if (ret) {
-			printf("erase failed block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printf("erase failed block %u at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);
 			continue;
 		}
 	}
@@ -223,25 +242,28 @@ static int onenand_block_test(u32 start, u32 size)
 		return -1;
 	}

-	start_block = start >> this->erase_shift;
-	end_block = (start + size) >> this->erase_shift;
+	start_block = onenand_block(this, start);
+	end_block = onenand_block(this, start + size);

 	/* Protect boot-loader from badblock testing */
 	if (start_block < 2)
 		start_block = 2;

-	if (end_block > (mtd->size >> this->erase_shift))
-		end_block = mtd->size >> this->erase_shift;
+	if (end_block > onenand_block(this, mtd->size))
+		end_block = onenand_block(this, mtd->size);

 	blocks = start_block;
 	ofs = start;
 	while (blocks < end_block) {
-		printf("\rTesting block %d@0x%x", (u32)(ofs >> this->erase_shift), (u32)ofs);
+		printf("\rTesting block %u at 0x%llx",
+			onenand_block(this, ofs), ofs);
+
+		blocksize = onenand_blocksize(ofs);

 		ret = mtd->block_isbad(mtd, ofs);
 		if (ret) {
-			printf("Skip erase bad block %d at 0x%x\n",
-			       (u32)(ofs >> this->erase_shift), (u32)ofs);
+			printf("Skip erase bad block %u at 0x%llx\n",
+			       onenand_block(this, ofs), ofs);
 			goto next;
 		}

@@ -345,7 +367,6 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

 	mtd = &onenand_mtd;
 	this = mtd->priv;
-	blocksize = (1 << this->erase_shift);

 	cmd = argv[1];

@@ -363,9 +384,11 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 		if (strcmp(cmd, "bad") == 0) {
 			/* Currently only one OneNAND device is supported */
 			printf("\nDevice %d bad blocks:\n", 0);
-			for (ofs = 0; ofs < mtd->size; ofs += mtd->erasesize) {
+			for (ofs = 0; ofs < mtd->size; ofs += blocksize) {
 				if (mtd->block_isbad(mtd, ofs))
 					printf("  %08x\n", (u32)ofs);
+
+				blocksize = onenand_blocksize(ofs);
 			}

 			return 0;
@@ -474,6 +497,21 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			return ret == 0 ? 1 : 0;
 		}

+		if (strncmp(cmd, "setboundary", 11) == 0) {
+			int die, bdry, lock = 0;
+
+			if (argc < 4)
+				goto usage;
+
+			die = (int) simple_strtoul(argv[2], NULL, 0);
+			bdry = (int) simple_strtoul(argv[3], NULL, 0);
+
+			if (argc == 5 && strncmp(argv[4], "LOCK", 4) == 0)
+				lock = 1;
+
+			return flexonenand_set_boundary(mtd, die, bdry, lock);
+		}
+
 		break;
 	}

@@ -491,11 +529,13 @@ U_BOOT_CMD(
 	"onenand bad - show bad blocks\n"
 	"onenand read[.oob] addr off size\n"
 	"onenand write[.oob] addr off size\n"
-	"    read/write 'size' bytes starting at offset 'off'\n"
-	"    to/from memory address 'addr', skipping bad blocks.\n"
-	"onenand erase [force] [off size] - erase 'size' bytes from\n"
+	"\tread/write 'size' bytes starting at offset 'off'\n"
+	"\tto/from memory address 'addr', skipping bad blocks.\n"
+	"onenand erase [force] [off size] - erase 'size' bytes from off\n"
 	"onenand test [off size] - test 'size' bytes from\n"
-	"    offset 'off' (entire device if not specified)\n"
+	"\toffset 'off' (entire device if not specified)\n"
 	"onenand dump[.oob] off - dump page\n"
 	"onenand markbad off [...] - mark bad block(s)@offset (UNSAFE)"
+	"onenand setboundary DIE BOUNDARY [LOCK] - \n"
+	"\tChange SLC boundary of Flex-OneNAND\n"
 );
diff --git a/include/configs/apollon.h b/include/configs/apollon.h
index ddac5fb..5a97743 100644
--- a/include/configs/apollon.h
+++ b/include/configs/apollon.h
@@ -77,7 +77,7 @@
  */
 #define	CONFIG_ENV_SIZE SZ_128K	/* Total Size of Environment Sector */
 #define CONFIG_ENV_SIZE_FLEX SZ_256K
-#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_1M)
+#define	CONFIG_SYS_MALLOC_LEN	(CONFIG_ENV_SIZE + SZ_2M)
 /* bytes reserved for initial data */
 #define	CONFIG_SYS_GBL_DATA_SIZE	128

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-11  5:57           ` Amul Kumar Saha
@ 2009-11-16 22:56             ` Wolfgang Denk
  2009-11-19 11:14               ` Amul Kumar Saha
  0 siblings, 1 reply; 10+ messages in thread
From: Wolfgang Denk @ 2009-11-16 22:56 UTC (permalink / raw)
  To: u-boot

Dear Amul Kumar Saha,

In message <0870C11EAE73409E8727CAC3891E4DED@sisodomain.com> you wrote:
> Add command for changing Flex-OneNAND SLC / MLC boundary.
> Also onenand commands work for Flex-OneNAND.
> 
> Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
> Signed-off-by: Amul Kumar Saha <amul.saha@samsung.com>
> ---
>  common/cmd_onenand.c      |  106 +++++++++++++++++++++++++++++++---------------
>  include/configs/apollon.h |    2
>  2 files changed, 74 insertions(+), 34 deletions(-)

How many versions of these patches did you post so far?

You are supposed to use "[PATCH 3/3 v5]" or similar in the Subject:
line to mark the Nth re-submission of the patch.


And what was changed between versions of this patch?

You are supposed to put a change log below the "---" line that
explains which changes were made to the previous version of the patch.

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
"Never give in.  Never give in.  Never. Never. Never."
- Winston Churchill

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

* [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings
  2009-11-16 22:56             ` Wolfgang Denk
@ 2009-11-19 11:14               ` Amul Kumar Saha
  0 siblings, 0 replies; 10+ messages in thread
From: Amul Kumar Saha @ 2009-11-19 11:14 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang Denk,

Sorry for the late reply.

>
> How many versions of these patches did you post so far?
>
> You are supposed to use "[PATCH 3/3 v5]" or similar in the Subject:
> line to mark the Nth re-submission of the patch.
>
>

I'll make sure that versions are properly displayed with each patch, from next post onwards.

> And what was changed between versions of this patch?
>
> You are supposed to put a change log below the "---" line that
> explains which changes were made to the previous version of the patch.
>

Accepted.

Should I send the patch again with version updated?

Regards,
Amul Kumar Saha 

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

end of thread, other threads:[~2009-11-19 11:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-24  6:13 [U-Boot] [PATCH 3/3] [OneNAND] Flex-OneNAND boundary settings Amul Kumar Saha
2009-11-04  5:09 ` Amul Kumar Saha
2009-11-05 23:08   ` Scott Wood
2009-11-06 11:43     ` Amul Kumar Saha
2009-11-06 11:47       ` Amul Kumar Saha
2009-11-09 20:02         ` Scott Wood
2009-11-11  5:56           ` Amul Kumar Saha
2009-11-11  5:57           ` Amul Kumar Saha
2009-11-16 22:56             ` Wolfgang Denk
2009-11-19 11:14               ` Amul Kumar Saha

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.