[coreboot] [flashrom] r629 - trunk

svn at coreboot.org svn at coreboot.org
Wed Jun 24 10:20:45 CEST 2009


Author: hailfinger
Date: 2009-06-24 10:20:45 +0200 (Wed, 24 Jun 2009)
New Revision: 629

Modified:
   trunk/flashrom.c
Log:
Use correct abstraction for verify_range(). The new abstraction can
handle out-of-band chip communication protocols as well.
The old abstraction caused spurious false positives for erase on SPI and
spurious false negatives for verify on SPI.

Make verify_flash() use verify_range().

Tested by Uwe on SB600.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Acked-by: Uwe Hermann <uwe at hermann-uwe.de>


Modified: trunk/flashrom.c
===================================================================
--- trunk/flashrom.c	2009-06-24 08:18:38 UTC (rev 628)
+++ trunk/flashrom.c	2009-06-24 08:20:45 UTC (rev 629)
@@ -276,13 +276,16 @@
 int verify_range(struct flashchip *flash, uint8_t *cmpbuf, int start, int len, char *message)
 {
 	int i, j, starthere, lenhere, ret = 0;
-	chipaddr bios = flash->virtual_memory;
 	int page_size = flash->page_size;
 	uint8_t *readbuf = malloc(page_size);
 
 	if (!len)
 		goto out_free;
 
+	if (!flash->read) {
+		fprintf(stderr, "ERROR: flashrom has no read function for this flash chip.\n");
+		return 1;
+	}
 	if (!readbuf) {
 		fprintf(stderr, "Could not allocate memory!\n");
 		exit(1);
@@ -312,7 +315,7 @@
 		starthere = max(start, i * page_size);
 		/* Length of bytes in the range in this page. */
 		lenhere = min(start + len, (i + 1) * page_size) - starthere;
-		chip_readn(readbuf, bios + starthere, lenhere);
+		flash->read(flash, readbuf, starthere, lenhere);
 		for (j = 0; j < lenhere; j++) {
 			if (cmpbuf[starthere - start + j] != readbuf[j]) {
 				fprintf(stderr, "%s FAILED at 0x%08x! "
@@ -384,44 +387,17 @@
 
 int verify_flash(struct flashchip *flash, uint8_t *buf)
 {
-	int idx;
+	int ret;
 	int total_size = flash->total_size * 1024;
-	uint8_t *buf2 = (uint8_t *) calloc(total_size, sizeof(char));
-	if (!flash->read) {
-		printf("FAILED!\n");
-		fprintf(stderr, "ERROR: flashrom has no read function for this flash chip.\n");
-		return 1;
-	} else
-		flash->read(flash, buf2, 0, total_size);
 
 	printf("Verifying flash... ");
 
-	if (verbose)
-		printf("address: 0x00000000\b\b\b\b\b\b\b\b\b\b");
+	ret = verify_range(flash, buf, 0, total_size, NULL);
 
-	for (idx = 0; idx < total_size; idx++) {
-		if (verbose && ((idx & 0xfff) == 0xfff))
-			printf("0x%08x", idx);
+	if (!ret)
+		printf("VERIFIED.          \n");
 
-		if (*(buf2 + idx) != *(buf + idx)) {
-			if (verbose)
-				printf("0x%08x FAILED!", idx);
-			else
-				printf("FAILED at 0x%08x!", idx);
-			printf("  Expected=0x%02x, Read=0x%02x\n",
-			       *(buf + idx), *(buf2 + idx));
-			return 1;
-		}
-
-		if (verbose && ((idx & 0xfff) == 0xfff))
-			printf("\b\b\b\b\b\b\b\b\b\b");
-	}
-	if (verbose)
-		printf("\b\b\b\b\b\b\b\b\b\b ");
-
-	printf("VERIFIED.          \n");
-
-	return 0;
+	return ret;
 }
 
 int read_flash(struct flashchip *flash, char *filename)





More information about the coreboot mailing list