[coreboot] r3291 - trunk/util/flashrom

svn at coreboot.org svn at coreboot.org
Thu May 8 02:31:45 CEST 2008


Author: stuge
Date: 2008-05-08 02:31:44 +0200 (Thu, 08 May 2008)
New Revision: 3291

Modified:
   trunk/util/flashrom/flashrom.c
Log:
flashrom: Probe for up to 3 flash chips.

Currently there is an ongoing technology migration from LPC/FWH to SPI chips.
For this reason some boards have multiple chips of different technologies
onboard. This patch makes flashrom probe for up to 3 chips and if more than
one chip is found flashrom exits, asking the user to specify -c.

[root at localhost src]# ./flashrom
...
Multiple flash chips were detected: SST49LF008A M25P16 at ICH9
Please specify which chip to use with the -c <chipname> option.
[root at localhost src]# 

Signed-off-by: Claus Gindhart <claus.gindhart at kontron.com>
Signed-off-by: Peter Stuge <peter at stuge.se>
Acked-by: Claus Gindhart <claus.gindhart at kontron.com>


Modified: trunk/util/flashrom/flashrom.c
===================================================================
--- trunk/util/flashrom/flashrom.c	2008-05-07 21:57:12 UTC (rev 3290)
+++ trunk/util/flashrom/flashrom.c	2008-05-08 00:31:44 UTC (rev 3291)
@@ -246,11 +246,12 @@
 	uint8_t *buf;
 	unsigned long size;
 	FILE *image;
-	struct flashchip *flash;
+	/* Probe for up to three flash chips. */
+	struct flashchip *flash, *flashes[3];
 	int opt;
 	int option_index = 0;
 	int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0;
-	int ret = 0;
+	int ret = 0, i;
 
 	static struct option long_options[] = {
 		{"read", 0, 0, 'r'},
@@ -405,12 +406,27 @@
 
 	board_flash_enable(lb_vendor, lb_part);
 
-	if ((flash = probe_flash(flashchips)) == NULL) {
+	for (i = 0; i < ARRAY_SIZE(flashes); i++) {
+		flashes[i] = probe_flash(i ? flashes[i - 1] + 1 : flashchips);
+		if (!flashes[i])
+			for (i++; i < ARRAY_SIZE(flashes); i++)
+				flashes[i] = NULL;
+	}
+
+	if (flashes[1]) {
+		printf("Multiple flash chips were detected:");
+		for (i = 0; i < ARRAY_SIZE(flashes) && flashes[i]; i++)
+			printf(" %s", flashes[i]->name);
+		printf("\nPlease specify which chip to use with the -c <chipname> option.\n");
+		exit(1);
+	} else if (!flashes[0]) {
 		printf("No EEPROM/flash device found.\n");
 		// FIXME: flash writes stay enabled!
 		exit(1);
 	}
 
+	flash = flashes[0];
+
 	printf("Flash part is %s (%d KB).\n", flash->name, flash->total_size);
 	if (TEST_OK_MASK != (flash->tested & TEST_OK_MASK)) {
 		printf("===\n");





More information about the coreboot mailing list