flashrom: Probe for up to 3 flash chips.
authorClaus Gindhart <claus.gindhart@kontron.com>
Thu, 8 May 2008 00:31:44 +0000 (00:31 +0000)
committerPeter Stuge <peter@stuge.se>
Thu, 8 May 2008 00:31:44 +0000 (00:31 +0000)
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@localhost src]# ./flashrom
...
Multiple flash chips were detected: SST49LF008A M25P16@ICH9
Please specify which chip to use with the -c <chipname> option.
[root@localhost src]#

Signed-off-by: Claus Gindhart <claus.gindhart@kontron.com>
Signed-off-by: Peter Stuge <peter@stuge.se>
Acked-by: Claus Gindhart <claus.gindhart@kontron.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3291 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/flashrom/flashrom.c

index 2f3d7c9083c3d725f7fdce89e176b6d7dd7dd931..dce303ed3f9e47fa3403b01d52472e6b037481e7 100644 (file)
@@ -246,11 +246,12 @@ int main(int argc, char *argv[])
        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 @@ int main(int argc, char *argv[])
 
        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");