All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
@ 2011-08-19 19:28 Simon Glass
  2011-08-19 21:15 ` Mike Frysinger
  2011-08-20 22:35 ` [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand " Mike Frysinger
  0 siblings, 2 replies; 15+ messages in thread
From: Simon Glass @ 2011-08-19 19:28 UTC (permalink / raw)
  To: u-boot

This adds a new SPI flash command which only rewrites blocks if the contents
need to change. This can speed up SPI flash programming when much of the
data is unchanged from what is already there.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v2:
-Moved loop into a function
-Moved malloc outside loop
-Other minor changes from review comments

Changes in v3:
-Change error message
-Style and function name change

 common/cmd_sf.c |   82 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 11a491d..69f04e5 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <spi_flash.h>
 
 #include <asm/io.h>
@@ -109,6 +110,78 @@ static int do_spi_flash_probe(int argc, char * const argv[])
 	return 0;
 }
 
+/**
+ * Write a block of data to SPI flash, first checking if it is different from
+ * what is already there.
+ *
+ * If the data being written is the same, then *skipped is incremented by len.
+ *
+ * @param flash		flash context pointer
+ * @param offset	flash offset to write
+ * @param len		number of bytes to write
+ * @param buf		buffer to write from
+ * @param cmp_buf	read buffer to use to compare data
+ * @param skipped	Count of skipped data (incremented by this function)
+ * @return NULL if OK, else a string containing the stage which failed
+ */
+static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,
+		size_t len, const char *buf, char *cmp_buf, size_t *skipped)
+{
+	debug("offset=%#x, sector_size=%#x, len=%#x\n",
+		offset, flash->sector_size, len);
+	if (spi_flash_read(flash, offset, len, cmp_buf))
+		return "read";
+	if (memcmp(cmp_buf, buf, len) == 0) {
+		debug("Skip region %x size %x: no change\n",
+			offset, len);
+		*skipped += len;
+		return NULL;
+	}
+	if (spi_flash_erase(flash, offset, len))
+		return "erase";
+	if (spi_flash_write(flash, offset, len, buf))
+		return "write";
+	return NULL;
+}
+
+/**
+ * Update an area of SPI flash by erasing and writing any blocks which need
+ * to change. Existing blocks with the correct data are left unchanged.
+ *
+ * @param flash		flash context pointer
+ * @param offset	flash offset to write
+ * @param len		number of bytes to write
+ * @param buf		buffer to write from
+ * @return 0 if ok, 1 on error
+ */
+static int spi_flash_update(struct spi_flash *flash, u32 offset,
+		size_t len, const char *buf)
+{
+	const char *err_oper = NULL;
+	char *cmp_buf;
+	const char *end = buf + len;
+	size_t todo;		/* number of bytes to do in this pass */
+	size_t skipped;		/* statistics */
+
+	cmp_buf = malloc(flash->sector_size);
+	if (cmp_buf) {
+		for (skipped = 0; buf < end; buf += todo, offset += todo) {
+			todo = min(end - buf, flash->sector_size);
+			err_oper = spi_flash_update_block(flash, offset, todo,
+					buf, cmp_buf, &skipped);
+		}
+	} else {
+		err_oper = "malloc";
+	}
+	free(cmp_buf);
+	if (err_oper) {
+		printf("SPI flash failed in %s step\n", err_oper);
+		return 1;
+	}
+	printf("%d bytes written, %d bytes skipped\n", len - skipped, skipped);
+	return 0;
+}
+
 static int do_spi_flash_read_write(int argc, char * const argv[])
 {
 	unsigned long addr;
@@ -137,7 +210,9 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
 		return 1;
 	}
 
-	if (strcmp(argv[0], "read") == 0)
+	if (strcmp(argv[0], "update") == 0)
+		ret = spi_flash_update(flash, offset, len, buf);
+	else if (strcmp(argv[0], "read") == 0)
 		ret = spi_flash_read(flash, offset, len, buf);
 	else
 		ret = spi_flash_write(flash, offset, len, buf);
@@ -203,7 +278,8 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 		return 1;
 	}
 
-	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0)
+	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0 ||
+			strcmp(cmd, "update") == 0)
 		ret = do_spi_flash_read_write(argc, argv);
 	else if (strcmp(cmd, "erase") == 0)
 		ret = do_spi_flash_erase(argc, argv);
@@ -229,4 +305,6 @@ U_BOOT_CMD(
 	"				  at `addr' to flash at `offset'\n"
 	"sf erase offset [+]len		- erase `len' bytes from `offset'\n"
 	"				  `+len' round up `len' to block size"
+	"sf update addr offset len	- erase and write `len' bytes from memory\n"
+	"				  at `addr' to flash at `offset'\n"
 );
-- 
1.7.3.1

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-19 19:28 [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update Simon Glass
@ 2011-08-19 21:15 ` Mike Frysinger
  2011-08-19 21:25   ` Simon Glass
  2011-08-20 22:35 ` [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand " Mike Frysinger
  1 sibling, 1 reply; 15+ messages in thread
From: Mike Frysinger @ 2011-08-19 21:15 UTC (permalink / raw)
  To: u-boot

On Friday, August 19, 2011 15:28:48 Simon Glass wrote:
> This adds a new SPI flash command which only rewrites blocks if the
> contents need to change. This can speed up SPI flash programming when much
> of the data is unchanged from what is already there.

looks good to me.  i'll give it a spin on a board of mine and then push into 
my sf branch.  i really should write a spi flash simulation so i could just 
test this from gdb ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110819/26b5577c/attachment.pgp 

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-19 21:15 ` Mike Frysinger
@ 2011-08-19 21:25   ` Simon Glass
  2011-08-19 22:28     ` Mike Frysinger
  0 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2011-08-19 21:25 UTC (permalink / raw)
  To: u-boot

On Fri, Aug 19, 2011 at 3:15 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Friday, August 19, 2011 15:28:48 Simon Glass wrote:
>> This adds a new SPI flash command which only rewrites blocks if the
>> contents need to change. This can speed up SPI flash programming when much
>> of the data is unchanged from what is already there.
>
> looks good to me. ?i'll give it a spin on a board of mine and then push into
> my sf branch. ?i really should write a spi flash simulation so i could just
> test this from gdb ...

Hi Mike,

Thanks.

Funny you should say that. I rather badly need a way of testing the
higher level U-Boot code (from the commands down to where it calls
architecture/driver code). I am drafting up an email to send to the
list with some thoughts on the matter.

Regards,
Simon

> -mike
>

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-19 21:25   ` Simon Glass
@ 2011-08-19 22:28     ` Mike Frysinger
  2011-08-23 22:01       ` Simon Glass
  0 siblings, 1 reply; 15+ messages in thread
From: Mike Frysinger @ 2011-08-19 22:28 UTC (permalink / raw)
  To: u-boot

On Friday, August 19, 2011 17:25:10 Simon Glass wrote:
> On Fri, Aug 19, 2011 at 3:15 PM, Mike Frysinger wrote:
> > On Friday, August 19, 2011 15:28:48 Simon Glass wrote:
> >> This adds a new SPI flash command which only rewrites blocks if the
> >> contents need to change. This can speed up SPI flash programming when
> >> much of the data is unchanged from what is already there.
> > 
> > looks good to me.  i'll give it a spin on a board of mine and then push
> > into my sf branch.  i really should write a spi flash simulation so i
> > could just test this from gdb ...
> 
> Funny you should say that. I rather badly need a way of testing the
> higher level U-Boot code (from the commands down to where it calls
> architecture/driver code). I am drafting up an email to send to the
> list with some thoughts on the matter.

when i wrote the blackfin system level port of the gnu sim, it was so i could 
do this (and i thought it'd be bad-ass).  i often use the gnu sim to do 
initial testing (sometimes down to the driver level) before i get around to 
loading up on actual hardware.

$ bfin-elf-run --env operating --model bf537 ./u-boot


U-Boot 2011.06-00375-g23ffb39-dirty (Aug 14 2011 - 16:54:03)

CPU:   ADSP bf537-0.2 (Detected Rev: 0.0) (bypass boot)
Board: ADI BF537 stamp board
       Support: http://blackfin.uclinux.org/
Clock: VCO: 500 MHz, Core: 500 MHz, System: 125 MHz
RAM:   64 MiB
Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
0 Bytes
MMC:   
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
KGDB:  [on serial] ready
Warning: Generating 'random' MAC address
Net:   bfin_mac
Hit any key to stop autoboot:  5  0 
bfin> help sf
sf - SPI flash sub-system

Usage:
sf probe [bus:]cs [hz] [mode]   - init flash device on given SPI bus
                                  and chip select
sf read addr offset len         - read `len' bytes starting at
                                  `offset' to memory at `addr'
sf write addr offset len        - write `len' bytes from memory
                                  at `addr' to flash at `offset'
sf erase offset [+]len          - erase `len' bytes from `offset'
                                  `+len' round up `len' to block size
bfin> 
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110819/4627a91d/attachment.pgp 

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-19 19:28 [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update Simon Glass
  2011-08-19 21:15 ` Mike Frysinger
@ 2011-08-20 22:35 ` Mike Frysinger
  2011-08-20 23:04   ` Marek Vasut
  2011-08-21 10:27   ` Simon Glass
  1 sibling, 2 replies; 15+ messages in thread
From: Mike Frysinger @ 2011-08-20 22:35 UTC (permalink / raw)
  To: u-boot

From: Simon Glass <sjg@chromium.org>

This adds a new SPI flash command which only rewrites blocks if the contents
need to change. This can speed up SPI flash programming when much of the
data is unchanged from what is already there.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
v4
	- tweak summary
	- fix printf warnings with %d vs %zu
	- fix help string and missing/extra newlines

TODO: it'd be nice if we supported +len like we do with erase ...

 common/cmd_sf.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 81 insertions(+), 3 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 11a491d..9b7d61b 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <spi_flash.h>
 
 #include <asm/io.h>
@@ -109,6 +110,78 @@ static int do_spi_flash_probe(int argc, char * const argv[])
 	return 0;
 }
 
+/**
+ * Write a block of data to SPI flash, first checking if it is different from
+ * what is already there.
+ *
+ * If the data being written is the same, then *skipped is incremented by len.
+ *
+ * @param flash		flash context pointer
+ * @param offset	flash offset to write
+ * @param len		number of bytes to write
+ * @param buf		buffer to write from
+ * @param cmp_buf	read buffer to use to compare data
+ * @param skipped	Count of skipped data (incremented by this function)
+ * @return NULL if OK, else a string containing the stage which failed
+ */
+static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,
+		size_t len, const char *buf, char *cmp_buf, size_t *skipped)
+{
+	debug("offset=%#x, sector_size=%#x, len=%#x\n",
+		offset, flash->sector_size, len);
+	if (spi_flash_read(flash, offset, len, cmp_buf))
+		return "read";
+	if (memcmp(cmp_buf, buf, len) == 0) {
+		debug("Skip region %x size %x: no change\n",
+			offset, len);
+		*skipped += len;
+		return NULL;
+	}
+	if (spi_flash_erase(flash, offset, len))
+		return "erase";
+	if (spi_flash_write(flash, offset, len, buf))
+		return "write";
+	return NULL;
+}
+
+/**
+ * Update an area of SPI flash by erasing and writing any blocks which need
+ * to change. Existing blocks with the correct data are left unchanged.
+ *
+ * @param flash		flash context pointer
+ * @param offset	flash offset to write
+ * @param len		number of bytes to write
+ * @param buf		buffer to write from
+ * @return 0 if ok, 1 on error
+ */
+static int spi_flash_update(struct spi_flash *flash, u32 offset,
+		size_t len, const char *buf)
+{
+	const char *err_oper = NULL;
+	char *cmp_buf;
+	const char *end = buf + len;
+	size_t todo;		/* number of bytes to do in this pass */
+	size_t skipped;		/* statistics */
+
+	cmp_buf = malloc(flash->sector_size);
+	if (cmp_buf) {
+		for (skipped = 0; buf < end; buf += todo, offset += todo) {
+			todo = min(end - buf, flash->sector_size);
+			err_oper = spi_flash_update_block(flash, offset, todo,
+					buf, cmp_buf, &skipped);
+		}
+	} else {
+		err_oper = "malloc";
+	}
+	free(cmp_buf);
+	if (err_oper) {
+		printf("SPI flash failed in %s step\n", err_oper);
+		return 1;
+	}
+	printf("%zu bytes written, %zu bytes skipped\n", len - skipped, skipped);
+	return 0;
+}
+
 static int do_spi_flash_read_write(int argc, char * const argv[])
 {
 	unsigned long addr;
@@ -137,7 +210,9 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
 		return 1;
 	}
 
-	if (strcmp(argv[0], "read") == 0)
+	if (strcmp(argv[0], "update") == 0)
+		ret = spi_flash_update(flash, offset, len, buf);
+	else if (strcmp(argv[0], "read") == 0)
 		ret = spi_flash_read(flash, offset, len, buf);
 	else
 		ret = spi_flash_write(flash, offset, len, buf);
@@ -203,7 +278,8 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 		return 1;
 	}
 
-	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0)
+	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0 ||
+	    strcmp(cmd, "update") == 0)
 		ret = do_spi_flash_read_write(argc, argv);
 	else if (strcmp(cmd, "erase") == 0)
 		ret = do_spi_flash_erase(argc, argv);
@@ -228,5 +304,7 @@ U_BOOT_CMD(
 	"sf write addr offset len	- write `len' bytes from memory\n"
 	"				  at `addr' to flash at `offset'\n"
 	"sf erase offset [+]len		- erase `len' bytes from `offset'\n"
-	"				  `+len' round up `len' to block size"
+	"				  `+len' round up `len' to block size\n"
+	"sf update addr offset len	- erase and write `len' bytes from memory\n"
+	"				  at `addr' to flash at `offset'"
 );
-- 
1.7.6

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-20 22:35 ` [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand " Mike Frysinger
@ 2011-08-20 23:04   ` Marek Vasut
  2011-08-21 10:37     ` Simon Glass
  2011-08-21 10:27   ` Simon Glass
  1 sibling, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2011-08-20 23:04 UTC (permalink / raw)
  To: u-boot

On Sunday, August 21, 2011 12:35:51 AM Mike Frysinger wrote:
> From: Simon Glass <sjg@chromium.org>
> 
> This adds a new SPI flash command which only rewrites blocks if the
> contents need to change. This can speed up SPI flash programming when much
> of the data is unchanged from what is already there.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
> ---
> v4
> 	- tweak summary
> 	- fix printf warnings with %d vs %zu
> 	- fix help string and missing/extra newlines
> 
> TODO: it'd be nice if we supported +len like we do with erase ...
> 
>  common/cmd_sf.c |   84
> +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed,
> 81 insertions(+), 3 deletions(-)
> 
> diff --git a/common/cmd_sf.c b/common/cmd_sf.c
> index 11a491d..9b7d61b 100644
> --- a/common/cmd_sf.c
> +++ b/common/cmd_sf.c
> @@ -6,6 +6,7 @@
>   */
> 
>  #include <common.h>
> +#include <malloc.h>
>  #include <spi_flash.h>
> 
>  #include <asm/io.h>
> @@ -109,6 +110,78 @@ static int do_spi_flash_probe(int argc, char * const
> argv[]) return 0;
>  }
> 
> +/**
> + * Write a block of data to SPI flash, first checking if it is different
> from + * what is already there.
> + *
> + * If the data being written is the same, then *skipped is incremented by
> len. + *
> + * @param flash		flash context pointer
> + * @param offset	flash offset to write
> + * @param len		number of bytes to write
> + * @param buf		buffer to write from
> + * @param cmp_buf	read buffer to use to compare data
> + * @param skipped	Count of skipped data (incremented by this function)
> + * @return NULL if OK, else a string containing the stage which failed
> + */
> +static const char *spi_flash_update_block(struct spi_flash *flash, u32
> offset, +		size_t len, const char *buf, char *cmp_buf, size_t *skipped)

Can't you just pass here a structure instead of this wicked pointer alchemy ?

> +{
> +	debug("offset=%#x, sector_size=%#x, len=%#x\n",
> +		offset, flash->sector_size, len);
> +	if (spi_flash_read(flash, offset, len, cmp_buf))
> +		return "read";
> +	if (memcmp(cmp_buf, buf, len) == 0) {
> +		debug("Skip region %x size %x: no change\n",
> +			offset, len);
> +		*skipped += len;
> +		return NULL;
> +	}
> +	if (spi_flash_erase(flash, offset, len))
> +		return "erase";
> +	if (spi_flash_write(flash, offset, len, buf))
> +		return "write";

Numeric value won't be ok ? You can have these in the calling function instead 
of returning a char *.

> +	return NULL;
> +}
> +
> +/**
> + * Update an area of SPI flash by erasing and writing any blocks which
> need + * to change. Existing blocks with the correct data are left
> unchanged. + *
> + * @param flash		flash context pointer
> + * @param offset	flash offset to write
> + * @param len		number of bytes to write
> + * @param buf		buffer to write from
> + * @return 0 if ok, 1 on error
> + */
> +static int spi_flash_update(struct spi_flash *flash, u32 offset,
> +		size_t len, const char *buf)
> +{
> +	const char *err_oper = NULL;
> +	char *cmp_buf;
> +	const char *end = buf + len;
> +	size_t todo;		/* number of bytes to do in this pass */
> +	size_t skipped;		/* statistics */

You can allocate a structure holding the internal state of the "update" command, 
which I mentioned above, here, on stack.

> +
> +	cmp_buf = malloc(flash->sector_size);
> +	if (cmp_buf) {

if (!cmp_buf)
	goto err;

... rest of code ...

Don't be afraid of goto and failpaths.

> +		for (skipped = 0; buf < end; buf += todo, offset += todo) {
> +			todo = min(end - buf, flash->sector_size);
> +			err_oper = spi_flash_update_block(flash, offset, todo,
> +					buf, cmp_buf, &skipped);
> +		}
> +	} else {
> +		err_oper = "malloc";
> +	}
> +	free(cmp_buf);
> +	if (err_oper) {
> +		printf("SPI flash failed in %s step\n", err_oper);
> +		return 1;
> +	}
> +	printf("%zu bytes written, %zu bytes skipped\n", len - skipped, skipped);
> +	return 0;
> +}
> +
>  static int do_spi_flash_read_write(int argc, char * const argv[])
>  {
>  	unsigned long addr;
> @@ -137,7 +210,9 @@ static int do_spi_flash_read_write(int argc, char *
> const argv[]) return 1;
>  	}
> 
> -	if (strcmp(argv[0], "read") == 0)
> +	if (strcmp(argv[0], "update") == 0)
> +		ret = spi_flash_update(flash, offset, len, buf);
> +	else if (strcmp(argv[0], "read") == 0)
>  		ret = spi_flash_read(flash, offset, len, buf);
>  	else
>  		ret = spi_flash_write(flash, offset, len, buf);
> @@ -203,7 +278,8 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int
> argc, char * const argv[ return 1;
>  	}
> 
> -	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0)
> +	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0 ||
> +	    strcmp(cmd, "update") == 0)
>  		ret = do_spi_flash_read_write(argc, argv);
>  	else if (strcmp(cmd, "erase") == 0)
>  		ret = do_spi_flash_erase(argc, argv);
> @@ -228,5 +304,7 @@ U_BOOT_CMD(
>  	"sf write addr offset len	- write `len' bytes from memory\n"
>  	"				  at `addr' to flash at `offset'\n"
>  	"sf erase offset [+]len		- erase `len' bytes from `offset'\n"
> -	"				  `+len' round up `len' to block size"
> +	"				  `+len' round up `len' to block size\n"
> +	"sf update addr offset len	- erase and write `len' bytes from memory\n"
> +	"				  at `addr' to flash at `offset'"
>  );

I like this patch!

Cheers

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-20 22:35 ` [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand " Mike Frysinger
  2011-08-20 23:04   ` Marek Vasut
@ 2011-08-21 10:27   ` Simon Glass
  2011-08-21 16:34     ` Mike Frysinger
  1 sibling, 1 reply; 15+ messages in thread
From: Simon Glass @ 2011-08-21 10:27 UTC (permalink / raw)
  To: u-boot

On Sat, Aug 20, 2011 at 4:35 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> From: Simon Glass <sjg@chromium.org>
>
> This adds a new SPI flash command which only rewrites blocks if the contents
> need to change. This can speed up SPI flash programming when much of the
> data is unchanged from what is already there.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
> ---
> v4
> ? ? ? ?- tweak summary
> ? ? ? ?- fix printf warnings with %d vs %zu
> ? ? ? ?- fix help string and missing/extra newlines
>
> TODO: it'd be nice if we supported +len like we do with erase ...
...
> +static int spi_flash_update(struct spi_flash *flash, u32 offset,
> + ? ? ? ? ? ? ? size_t len, const char *buf)
> +{
> + ? ? ? const char *err_oper = NULL;
> + ? ? ? char *cmp_buf;
> + ? ? ? const char *end = buf + len;
> + ? ? ? size_t todo; ? ? ? ? ? ?/* number of bytes to do in this pass */
> + ? ? ? size_t skipped; ? ? ? ? /* statistics */
> +
> + ? ? ? cmp_buf = malloc(flash->sector_size);
> + ? ? ? if (cmp_buf) {
> + ? ? ? ? ? ? ? for (skipped = 0; buf < end; buf += todo, offset += todo) {

Oops I got this wrong:

for (skipped = 0; buf < end && !err_oper; buf += todo, offset += todo) {

(or if (err_oper) break in the loop)

> + ? ? ? ? ? ? ? ? ? ? ? todo = min(end - buf, flash->sector_size);
> + ? ? ? ? ? ? ? ? ? ? ? err_oper = spi_flash_update_block(flash, offset, todo,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buf, cmp_buf, &skipped);
> + ? ? ? ? ? ? ? }
> + ? ? ? } else {
> + ? ? ? ? ? ? ? err_oper = "malloc";
> + ? ? ? }
> + ? ? ? free(cmp_buf);
> + ? ? ? if (err_oper) {
> + ? ? ? ? ? ? ? printf("SPI flash failed in %s step\n", err_oper);
> + ? ? ? ? ? ? ? return 1;
> + ? ? ? }
> + ? ? ? printf("%zu bytes written, %zu bytes skipped\n", len - skipped, skipped);
> + ? ? ? return 0;
> +}
> +
> ?static int do_spi_flash_read_write(int argc, char * const argv[])
> ?{
> ? ? ? ?unsigned long addr;
> @@ -137,7 +210,9 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
> ? ? ? ? ? ? ? ?return 1;
> ? ? ? ?}
>
> - ? ? ? if (strcmp(argv[0], "read") == 0)
> + ? ? ? if (strcmp(argv[0], "update") == 0)
> + ? ? ? ? ? ? ? ret = spi_flash_update(flash, offset, len, buf);
> + ? ? ? else if (strcmp(argv[0], "read") == 0)
> ? ? ? ? ? ? ? ?ret = spi_flash_read(flash, offset, len, buf);
> ? ? ? ?else
> ? ? ? ? ? ? ? ?ret = spi_flash_write(flash, offset, len, buf);
> @@ -203,7 +278,8 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
> ? ? ? ? ? ? ? ?return 1;
> ? ? ? ?}
>
> - ? ? ? if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0)
> + ? ? ? if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0 ||
> + ? ? ? ? ? strcmp(cmd, "update") == 0)
> ? ? ? ? ? ? ? ?ret = do_spi_flash_read_write(argc, argv);
> ? ? ? ?else if (strcmp(cmd, "erase") == 0)
> ? ? ? ? ? ? ? ?ret = do_spi_flash_erase(argc, argv);
> @@ -228,5 +304,7 @@ U_BOOT_CMD(
> ? ? ? ?"sf write addr offset len ? ? ? - write `len' bytes from memory\n"
> ? ? ? ?" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? at `addr' to flash at `offset'\n"
> ? ? ? ?"sf erase offset [+]len ? ? ? ? - erase `len' bytes from `offset'\n"
> - ? ? ? " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? `+len' round up `len' to block size"
> + ? ? ? " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? `+len' round up `len' to block size\n"
> + ? ? ? "sf update addr offset len ? ? ?- erase and write `len' bytes from memory\n"
> + ? ? ? " ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? at `addr' to flash at `offset'"
> ?);
> --
> 1.7.6
>
>

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-20 23:04   ` Marek Vasut
@ 2011-08-21 10:37     ` Simon Glass
  2011-08-21 16:35       ` Mike Frysinger
  0 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2011-08-21 10:37 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On Sat, Aug 20, 2011 at 5:04 PM, Marek Vasut <marek.vasut@gmail.com> wrote:
> On Sunday, August 21, 2011 12:35:51 AM Mike Frysinger wrote:
>> From: Simon Glass <sjg@chromium.org>
>>
>> This adds a new SPI flash command which only rewrites blocks if the
>> contents need to change. This can speed up SPI flash programming when much
>> of the data is unchanged from what is already there.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
>> ---
>> v4
>> ? ? ? - tweak summary
>> ? ? ? - fix printf warnings with %d vs %zu
>> ? ? ? - fix help string and missing/extra newlines
>>
>> TODO: it'd be nice if we supported +len like we do with erase ...
>>
>> ?common/cmd_sf.c | ? 84
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed,
>> 81 insertions(+), 3 deletions(-)
>>
>> diff --git a/common/cmd_sf.c b/common/cmd_sf.c
>> index 11a491d..9b7d61b 100644
>> --- a/common/cmd_sf.c
>> +++ b/common/cmd_sf.c
>> @@ -6,6 +6,7 @@
>> ? */
>>
>> ?#include <common.h>
>> +#include <malloc.h>
>> ?#include <spi_flash.h>
>>
>> ?#include <asm/io.h>
>> @@ -109,6 +110,78 @@ static int do_spi_flash_probe(int argc, char * const
>> argv[]) return 0;
>> ?}
>>
>> +/**
>> + * Write a block of data to SPI flash, first checking if it is different
>> from + * what is already there.
>> + *
>> + * If the data being written is the same, then *skipped is incremented by
>> len. + *
>> + * @param flash ? ? ? ? ? ? ?flash context pointer
>> + * @param offset ? ? flash offset to write
>> + * @param len ? ? ? ? ? ? ? ?number of bytes to write
>> + * @param buf ? ? ? ? ? ? ? ?buffer to write from
>> + * @param cmp_buf ? ?read buffer to use to compare data
>> + * @param skipped ? ?Count of skipped data (incremented by this function)
>> + * @return NULL if OK, else a string containing the stage which failed
>> + */
>> +static const char *spi_flash_update_block(struct spi_flash *flash, u32
>> offset, + ? ? ? ? ? ? size_t len, const char *buf, char *cmp_buf, size_t *skipped)
>
> Can't you just pass here a structure instead of this wicked pointer alchemy ?

Do you mean create a structure with the things that don't change in it
(flash, cmp_buf and skipped)? Is the problem too many parameters?

>
>> +{
>> + ? ? debug("offset=%#x, sector_size=%#x, len=%#x\n",
>> + ? ? ? ? ? ? offset, flash->sector_size, len);
>> + ? ? if (spi_flash_read(flash, offset, len, cmp_buf))
>> + ? ? ? ? ? ? return "read";
>> + ? ? if (memcmp(cmp_buf, buf, len) == 0) {
>> + ? ? ? ? ? ? debug("Skip region %x size %x: no change\n",
>> + ? ? ? ? ? ? ? ? ? ? offset, len);
>> + ? ? ? ? ? ? *skipped += len;
>> + ? ? ? ? ? ? return NULL;
>> + ? ? }
>> + ? ? if (spi_flash_erase(flash, offset, len))
>> + ? ? ? ? ? ? return "erase";
>> + ? ? if (spi_flash_write(flash, offset, len, buf))
>> + ? ? ? ? ? ? return "write";
>
> Numeric value won't be ok ? You can have these in the calling function instead
> of returning a char *.

Yes it's a bit odd, but the alternative is quite a bit more verbose:

enum {
   OPER_MALLOC,
   OPER_READ,
   OPER_ERASE,
   ...
};

static const char *names[OPER...] = {
   "malloc",
   "read",
   "erase"
...
};

Is that better?

>
>> + ? ? return NULL;
>> +}
>> +
>> +/**
>> + * Update an area of SPI flash by erasing and writing any blocks which
>> need + * to change. Existing blocks with the correct data are left
>> unchanged. + *
>> + * @param flash ? ? ? ? ? ? ?flash context pointer
>> + * @param offset ? ? flash offset to write
>> + * @param len ? ? ? ? ? ? ? ?number of bytes to write
>> + * @param buf ? ? ? ? ? ? ? ?buffer to write from
>> + * @return 0 if ok, 1 on error
>> + */
>> +static int spi_flash_update(struct spi_flash *flash, u32 offset,
>> + ? ? ? ? ? ? size_t len, const char *buf)
>> +{
>> + ? ? const char *err_oper = NULL;
>> + ? ? char *cmp_buf;
>> + ? ? const char *end = buf + len;
>> + ? ? size_t todo; ? ? ? ? ? ?/* number of bytes to do in this pass */
>> + ? ? size_t skipped; ? ? ? ? /* statistics */
>
> You can allocate a structure holding the internal state of the "update" command,
> which I mentioned above, here, on stack.

Please see question above.

>
>> +
>> + ? ? cmp_buf = malloc(flash->sector_size);
>> + ? ? if (cmp_buf) {
>
> if (!cmp_buf)
> ? ? ? ?goto err;
>
> ... rest of code ...
>
> Don't be afraid of goto and failpaths.

OK, will try.

>
> I like this patch!

Thanks!

Regards,
Simon

>
> Cheers
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-21 10:27   ` Simon Glass
@ 2011-08-21 16:34     ` Mike Frysinger
  0 siblings, 0 replies; 15+ messages in thread
From: Mike Frysinger @ 2011-08-21 16:34 UTC (permalink / raw)
  To: u-boot

On Sunday, August 21, 2011 06:27:16 Simon Glass wrote:
> On Sat, Aug 20, 2011 at 4:35 PM, Mike Frysinger wrote:
> > +static int spi_flash_update(struct spi_flash *flash, u32 offset,
> > +               size_t len, const char *buf)
> > +{
> > +       const char *err_oper = NULL;
> > +       char *cmp_buf;
> > +       const char *end = buf + len;
> > +       size_t todo;            /* number of bytes to do in this pass */
> > +       size_t skipped;         /* statistics */
> > +
> > +       cmp_buf = malloc(flash->sector_size);
> > +       if (cmp_buf) {
> > +               for (skipped = 0; buf < end; buf += todo, offset += todo)
> > {
> 
> Oops I got this wrong:
> 
> for (skipped = 0; buf < end && !err_oper; buf += todo, offset += todo) {
> 
> (or if (err_oper) break in the loop)

you can send a v5 and i'll just replace it in my tree :)

or a diff and i'll just merge it locally ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110821/ebbe2e78/attachment.pgp 

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-21 10:37     ` Simon Glass
@ 2011-08-21 16:35       ` Mike Frysinger
  2011-08-22 22:53         ` Simon Glass
  0 siblings, 1 reply; 15+ messages in thread
From: Mike Frysinger @ 2011-08-21 16:35 UTC (permalink / raw)
  To: u-boot

On Sunday, August 21, 2011 06:37:30 Simon Glass wrote:
> On Sat, Aug 20, 2011 at 5:04 PM, Marek Vasut wrote:
> > On Sunday, August 21, 2011 12:35:51 AM Mike Frysinger wrote:
> >> +{
> >> +     debug("offset=%#x, sector_size=%#x, len=%#x\n",
> >> +             offset, flash->sector_size, len);
> >> +     if (spi_flash_read(flash, offset, len, cmp_buf))
> >> +             return "read";
> >> +     if (memcmp(cmp_buf, buf, len) == 0) {
> >> +             debug("Skip region %x size %x: no change\n",
> >> +                     offset, len);
> >> +             *skipped += len;
> >> +             return NULL;
> >> +     }
> >> +     if (spi_flash_erase(flash, offset, len))
> >> +             return "erase";
> >> +     if (spi_flash_write(flash, offset, len, buf))
> >> +             return "write";
> > 
> > Numeric value won't be ok ? You can have these in the calling function
> > instead of returning a char *.
> 
> Yes it's a bit odd, but the alternative is quite a bit more verbose:
> 
> enum {
>    OPER_MALLOC,
>    OPER_READ,
>    OPER_ERASE,
>    ...
> };
> 
> static const char *names[OPER...] = {

static const char * const names[] = {

>    "malloc",
>    "read",
>    "erase"
> ...
> };
> 
> Is that better?

only if the code size is smaller ;)
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110821/419a1cad/attachment.pgp 

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

* [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand to do smart SPI flash update
  2011-08-21 16:35       ` Mike Frysinger
@ 2011-08-22 22:53         ` Simon Glass
  0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2011-08-22 22:53 UTC (permalink / raw)
  To: u-boot

On Sun, Aug 21, 2011 at 9:35 AM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Sunday, August 21, 2011 06:37:30 Simon Glass wrote:
>> On Sat, Aug 20, 2011 at 5:04 PM, Marek Vasut wrote:
>> > On Sunday, August 21, 2011 12:35:51 AM Mike Frysinger wrote:
>> >> +{
>> >> + ? ? debug("offset=%#x, sector_size=%#x, len=%#x\n",
>> >> + ? ? ? ? ? ? offset, flash->sector_size, len);
>> >> + ? ? if (spi_flash_read(flash, offset, len, cmp_buf))
>> >> + ? ? ? ? ? ? return "read";
>> >> + ? ? if (memcmp(cmp_buf, buf, len) == 0) {
>> >> + ? ? ? ? ? ? debug("Skip region %x size %x: no change\n",
>> >> + ? ? ? ? ? ? ? ? ? ? offset, len);
>> >> + ? ? ? ? ? ? *skipped += len;
>> >> + ? ? ? ? ? ? return NULL;
>> >> + ? ? }
>> >> + ? ? if (spi_flash_erase(flash, offset, len))
>> >> + ? ? ? ? ? ? return "erase";
>> >> + ? ? if (spi_flash_write(flash, offset, len, buf))
>> >> + ? ? ? ? ? ? return "write";
>> >
>> > Numeric value won't be ok ? You can have these in the calling function
>> > instead of returning a char *.
>>
>> Yes it's a bit odd, but the alternative is quite a bit more verbose:
>>
>> enum {
>> ? ?OPER_MALLOC,
>> ? ?OPER_READ,
>> ? ?OPER_ERASE,
>> ? ?...
>> };
>>
>> static const char *names[OPER...] = {
>
> static const char * const names[] = {
>
>> ? ?"malloc",
>> ? ?"read",
>> ? ?"erase"
>> ...
>> };
>>
>> Is that better?
>
> only if the code size is smaller ;)

Hi Mike,

Well it is 4 bytes larger, or 8 if I avoid char * for the array and
fix the string length. So I will leave that as is for now, and send a
new v5 patch.

Regards,
Simon

> -mike
>

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-19 22:28     ` Mike Frysinger
@ 2011-08-23 22:01       ` Simon Glass
  2011-08-23 22:16         ` Mike Frysinger
  0 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2011-08-23 22:01 UTC (permalink / raw)
  To: u-boot

Hi Mike,

On Fri, Aug 19, 2011 at 3:28 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Friday, August 19, 2011 17:25:10 Simon Glass wrote:
>> On Fri, Aug 19, 2011 at 3:15 PM, Mike Frysinger wrote:
>> > On Friday, August 19, 2011 15:28:48 Simon Glass wrote:
>> >> This adds a new SPI flash command which only rewrites blocks if the
>> >> contents need to change. This can speed up SPI flash programming when
>> >> much of the data is unchanged from what is already there.
>> >
>> > looks good to me. ?i'll give it a spin on a board of mine and then push
>> > into my sf branch. ?i really should write a spi flash simulation so i
>> > could just test this from gdb ...
>>
>> Funny you should say that. I rather badly need a way of testing the
>> higher level U-Boot code (from the commands down to where it calls
>> architecture/driver code). I am drafting up an email to send to the
>> list with some thoughts on the matter.
>
> when i wrote the blackfin system level port of the gnu sim, it was so i could
> do this (and i thought it'd be bad-ass). ?i often use the gnu sim to do
> initial testing (sometimes down to the driver level) before i get around to
> loading up on actual hardware.
>
> $ bfin-elf-run --env operating --model bf537 ./u-boot
>
>
> U-Boot 2011.06-00375-g23ffb39-dirty (Aug 14 2011 - 16:54:03)
>
> CPU: ? ADSP bf537-0.2 (Detected Rev: 0.0) (bypass boot)
> Board: ADI BF537 stamp board
> ? ? ? Support: http://blackfin.uclinux.org/
> Clock: VCO: 500 MHz, Core: 500 MHz, System: 125 MHz
> RAM: ? 64 MiB
> Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
> 0 Bytes
> MMC:
> *** Warning - bad CRC, using default environment
>
> In: ? ?serial
> Out: ? serial
> Err: ? serial
> KGDB: ?[on serial] ready
> Warning: Generating 'random' MAC address
> Net: ? bfin_mac
> Hit any key to stop autoboot: ?5 ?0
> bfin> help sf
> sf - SPI flash sub-system
>
> Usage:
> sf probe [bus:]cs [hz] [mode] ? - init flash device on given SPI bus
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?and chip select
> sf read addr offset len ? ? ? ? - read `len' bytes starting at
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?`offset' to memory at `addr'
> sf write addr offset len ? ? ? ?- write `len' bytes from memory
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?at `addr' to flash at `offset'
> sf erase offset [+]len ? ? ? ? ?- erase `len' bytes from `offset'
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?`+len' round up `len' to block size
> bfin>
> -mike
>

That's a great trick. How much of the drivers did you implement in the
simulator?

How about this, running native under Linux:

$ ./u-boot


U-Boot 2011.03-00793-g0463aab-dirty (Aug 23 2011 - 14:56:06)

DRAM:  128 MiB
Using default environment

In:    serial
Out:   lcd
Err:   lcd
=>sf probe 0
sf probe 0
SF: Detected test with page size 256, total 4 MiB
4096 KiB test at 0:0 is now current device
=>sf read 0 0 0x2000
sf read 0 0 0x2000
=>md 0
md 0
00000000: 282c36b2 17938d43 d7dcbdfd 362e4362    .6,(C.......bC.6
00000010: 00000000 00000000 00000000 00000000    ................
00000020: 00020001 0000000f 0000000b 00400000    .............. at .
00000030: 00000004 00000003 00000003 00000003    ................
00000040: 00000003 00000000 00000116 00000000    ................
00000050: 00000000 00000000 00000116 00000000    ................
00000060: 00000000 00000000 00000116 00000000    ................
00000070: 00000000 00000000 00000116 00000000    ................
00000080: 00000000 00000002 00000003 00000008    ................
00000090: 00000000 0000001a 000002f8 00000000    ................
000000a0: 0000012c 00000002 00000000 e0a61818    ,...............
000000b0: 00000000 00000000 0000000b 00000026    ............&...
000000c0: 00000008 00000003 00000004 00000004    ................
000000d0: 00000002 0000000b 00000003 00000003    ................
000000e0: 00000002 00000001 00000003 00000004    ................
000000f0: 00000003 00000009 0000000c 0000059f    ................
=>^C
$

Regards,
Simon

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-23 22:01       ` Simon Glass
@ 2011-08-23 22:16         ` Mike Frysinger
  2011-08-24  3:41           ` Che-liang Chiou
  0 siblings, 1 reply; 15+ messages in thread
From: Mike Frysinger @ 2011-08-23 22:16 UTC (permalink / raw)
  To: u-boot

On Tuesday, August 23, 2011 18:01:34 Simon Glass wrote:
> That's a great trick. How much of the drivers did you implement in the
> simulator?

probably more than i'd like to admit, but not as many as i'd like ;)
http://docs.blackfin.uclinux.org/doku.php?id=toolchain:sim#peripherals

> How about this, running native under Linux:

also pretty cool.  i think both are worth while efforts.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110823/250883d1/attachment.pgp 

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-23 22:16         ` Mike Frysinger
@ 2011-08-24  3:41           ` Che-liang Chiou
  2011-08-24  4:11             ` Simon Glass
  0 siblings, 1 reply; 15+ messages in thread
From: Che-liang Chiou @ 2011-08-24  3:41 UTC (permalink / raw)
  To: u-boot

Hi Simon,

I have a dumb question: How did you make u-boot run native under
Linux? Did you mock out all platform functions? Or did you bundle
u-boot with a emulator?

Regards,
Che-Liang

On Wed, Aug 24, 2011 at 6:16 AM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Tuesday, August 23, 2011 18:01:34 Simon Glass wrote:
>> That's a great trick. How much of the drivers did you implement in the
>> simulator?
>
> probably more than i'd like to admit, but not as many as i'd like ;)
> http://docs.blackfin.uclinux.org/doku.php?id=toolchain:sim#peripherals
>
>> How about this, running native under Linux:
>
> also pretty cool. ?i think both are worth while efforts.
> -mike
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
>

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

* [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update
  2011-08-24  3:41           ` Che-liang Chiou
@ 2011-08-24  4:11             ` Simon Glass
  0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2011-08-24  4:11 UTC (permalink / raw)
  To: u-boot

Hi Che-Liang.

On Tue, Aug 23, 2011 at 8:41 PM, Che-liang Chiou <clchiou@chromium.org> wrote:
> Hi Simon,
>
> I have a dumb question: How did you make u-boot run native under
> Linux? Did you mock out all platform functions? Or did you bundle
> u-boot with a emulator?

Basically created a new architecture (like arm/x86) called 'native'
which runs under Linux.

Here is the first review, some of the rest follow, but I am still working on it:

http://gerrit.chromium.org/gerrit/#change,6334

Regards,
Simon

>
> Regards,
> Che-Liang
>
> On Wed, Aug 24, 2011 at 6:16 AM, Mike Frysinger <vapier@gentoo.org> wrote:
>> On Tuesday, August 23, 2011 18:01:34 Simon Glass wrote:
>>> That's a great trick. How much of the drivers did you implement in the
>>> simulator?
>>
>> probably more than i'd like to admit, but not as many as i'd like ;)
>> http://docs.blackfin.uclinux.org/doku.php?id=toolchain:sim#peripherals
>>
>>> How about this, running native under Linux:
>>
>> also pretty cool. ?i think both are worth while efforts.
>> -mike
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
>>
>>
>

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

end of thread, other threads:[~2011-08-24  4:11 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-19 19:28 [U-Boot] [PATCH v3] Add 'sf update' command to do smart SPI flash update Simon Glass
2011-08-19 21:15 ` Mike Frysinger
2011-08-19 21:25   ` Simon Glass
2011-08-19 22:28     ` Mike Frysinger
2011-08-23 22:01       ` Simon Glass
2011-08-23 22:16         ` Mike Frysinger
2011-08-24  3:41           ` Che-liang Chiou
2011-08-24  4:11             ` Simon Glass
2011-08-20 22:35 ` [U-Boot] [PATCH v4] cmd_sf: add "update" subcommand " Mike Frysinger
2011-08-20 23:04   ` Marek Vasut
2011-08-21 10:37     ` Simon Glass
2011-08-21 16:35       ` Mike Frysinger
2011-08-22 22:53         ` Simon Glass
2011-08-21 10:27   ` Simon Glass
2011-08-21 16:34     ` Mike Frysinger

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.