[coreboot] flashrom: Probe for up to 3 flash chips. [was: Fix ambiguity, if a board is equipped with more than one chip]
Peter Stuge
peter at stuge.se
Mon May 5 17:49:03 CEST 2008
On Mon, May 05, 2008 at 05:07:45PM +0200, Carl-Daniel Hailfinger wrote:
> Can we support probing for an arbitrary number of chips instead?
I think that is overly ambitious.
flashrom assumes that flash chips are top-aligned at 4GB so there
will not be very many flash chips actually connected in a way that
flashrom understands today.
> By using an array flash[] instead of flash, flash2 and flash3 this
> could be done in a loop without limits on the number of detected
> chips.
I thought [] too, but I set a fixed size. It's simple and cheap to
increase the size should there be need, and the code will deal.
> What happens if there are multiple flash chips of the same
> technology?
If same name, then same size and at same address => larger problem.
> Overall, I really like what the patch does.
Yes, me too.
Claus, can you please test the attached patch and send an Acked-by
line it if it works, then I'll commit.
Thanks!
//Peter
-------------- next part --------------
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.
Signed-off-by: Claus Gindhart <claus.gindhart at kontron.com>
Signed-off-by: Peter Stuge <peter at stuge.se>
Index: flashrom.multichip/flashrom.c
===================================================================
--- flashrom.multichip/flashrom.c (revision 3277)
+++ flashrom.multichip/flashrom.c (working copy)
@@ -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