Patchwork [flashrom] write_sst_fwhub: optimized for safety and speed

login
register
about
Submitter Adam Jurkowski
Date 2009-11-23 15:20:09
Message ID <4B0AA829.1020700@kontron.pl>
Download mbox | patch
Permalink /patch/583/
State Not Applicable
Headers show

Comments

Adam Jurkowski - 2009-11-23 15:20:09
Optimized write_sst_fwhub for safety and speed:
Now uses block erase instead of chip erase. Also introduced auto skip 
feature.

Signed-off-by: Adam Jurkowski <adam.jurkowski@kontron.pl>
---
It's the modification we use since may '08.
Now we want to add it to the main trunk together with Poulsbo support 
patch which will follow.

Tested with SST49LF008A.
Carl-Daniel Hailfinger - 2009-11-23 23:02:05
Hi Adam,

thanks for your patch. It looks good.
Unfortunately, it conflicts with the new generic partial flashing
support which will be merged soon. However, given that the partial
flashing support is not completely ready yet, I think I'll apply your
patch now and revert it once the generic partial flashing support is ready.

On 23.11.2009 16:20, Adam Jurkowski wrote:
> Optimized write_sst_fwhub for safety and speed:
> Now uses block erase instead of chip erase. Also introduced auto skip
> feature.
>
> Signed-off-by: Adam Jurkowski <adam.jurkowski@kontron.pl>

I'll give the other developers some time to comment, but I think this is
a good short-term solution.

Regards,
Carl-Daniel
Carl-Daniel Hailfinger - 2009-11-23 23:04:10
Adam, would you mind reposting your patch to flashrom@flashrom.org as
well? That way, it ends up in our patch tracker and will not be
forgotten. Thanks!

Regards,
Carl-Daniel

On 23.11.2009 16:20, Adam Jurkowski wrote:
> Optimized write_sst_fwhub for safety and speed:
> Now uses block erase instead of chip erase. Also introduced auto skip
> feature.
>
> Signed-off-by: Adam Jurkowski <adam.jurkowski@kontron.pl>
> ---
> It's the modification we use since may '08.
> Now we want to add it to the main trunk together with Poulsbo support
> patch which will follow.
>
> Tested with SST49LF008A.

Patch

Index: sst_fwhub.c
===================================================================
--- sst_fwhub.c	(revision 770)
+++ sst_fwhub.c	(working copy)
@@ -2,6 +2,7 @@ 
  * This file is part of the flashrom project.
  *
  * Copyright (C) 2000 Silicon Integrated System Corporation
+ * Copyright (C) 2009 Kontron Modular Computers
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +21,8 @@ 
 
 /* Adapted from the Intel FW hub stuff for 82802ax parts. */
 
+#include <stdlib.h>
+#include <string.h>
 #include "flash.h"
 
 // I need that Berkeley bit-map printer
@@ -130,28 +133,33 @@ 
 
 int write_sst_fwhub(struct flashchip *flash, uint8_t *buf)
 {
-	int i;
+	int i, rc;
 	int total_size = flash->total_size * 1024;
 	int page_size = flash->page_size;
 	chipaddr bios = flash->virtual_memory;
-	uint8_t blockstatus;
-
-	// FIXME: We want block wide erase instead of ironing the whole chip
-	if (erase_sst_fwhub(flash)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-
+	uint8_t *readbuf = malloc(page_size);
+	
 	printf("Programming page: ");
 	for (i = 0; i < total_size / page_size; i++) {
 		printf("%04d at address: 0x%08x", i, i * page_size);
-		blockstatus = clear_sst_fwhub_block_lock(flash, i * page_size);
-		if (blockstatus) {
-			printf(" is locked down permanently, aborting\n");
-			return 1;
+
+		/* Auto Skip Blocks, which already contain the desired data:
+		 * Faster, because we only write, what has changed
+		 * More secure, because blocks, which are excluded
+		 * (with the exclude or layout feature)
+		 * are not erased and rewritten; data is retained also
+		 * in sudden power off situations
+		 */
+		flash->read(flash, readbuf, i * page_size, page_size);
+		if (memcmp((void *)(buf + i * page_size),
+			   (void *)(readbuf), page_size)) {
+			rc = erase_sst_fwhub_block(flash, i * page_size,
+						   page_size);
+			if (rc)
+				return 1;
+			write_sector_jedec(bios, buf + i * page_size,
+					   bios + i * page_size, page_size);
 		}
-		write_sector_jedec(bios, buf + i * page_size,
-				   bios + i * page_size, page_size);
 		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 	}
 	printf("\n");