- Change check_max_decode() to return the number of (common) busses where the flash chip exceeds the supported size of the programmer. - Refine its signature to use a flashctx only. - Move CLI-related bits to cli_classic.c. - Rename check_max_decode() to count_max_decode_exceedings() to better reflect what it (now) really does. - Refine the messages printed by the caller to better integrate with the new setup, and simplify them.
Signed-off-by: Stefan Tauner stefan.tauner@alumni.tuwien.ac.at --- cli_classic.c | 16 ++++++++++++---- flashrom.c | 24 ++++++++---------------- programmer.h | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/cli_classic.c b/cli_classic.c index 54b0d07..db76fbc 100644 --- a/cli_classic.c +++ b/cli_classic.c @@ -158,7 +158,6 @@ static void check_chip_supported(const struct flashchip *chip)
int main(int argc, char *argv[]) { - unsigned long size; /* Probe for up to three flash chips. */ const struct flashchip *chip = NULL; struct flashctx flashes[3] = {{0}}; @@ -568,9 +567,18 @@ int main(int argc, char *argv[])
check_chip_supported(fill_flash->chip);
- size = fill_flash->chip->total_size * 1024; - if (check_max_decode(fill_flash->pgm->buses_supported & fill_flash->chip->bustype, size) && (!force)) { - msg_cerr("Chip is too big for this programmer (-V gives details). Use --force to override.\n"); + unsigned int limitexceeded = count_max_decode_exceedings(fill_flash); + if (limitexceeded > 0 && !force) { + enum chipbustype commonbuses = fill_flash->pgm->buses_supported & fill_flash->chip->bustype; + + /* Sometimes chip and programmer have more than one bus in common, + * and the limit is not exceeded on all buses. Tell the user. */ + if ((bitcount(commonbuses) > limitexceeded)) { + msg_pdbg("There is at least one interface available which could support the size of\n" + "the selected flash chip.\n"); + } + msg_cerr("This flash chip is too big for this programmer (--verbose/-V gives details).\n" + "Use --force/-f to override at your own risk.\n"); ret = 1; goto out_shutdown; } diff --git a/flashrom.c b/flashrom.c index 5a07e79..31d352a 100644 --- a/flashrom.c +++ b/flashrom.c @@ -995,9 +995,13 @@ int generate_testpattern(uint8_t *buf, uint32_t size, int variant) return 0; }
-int check_max_decode(enum chipbustype buses, uint32_t size) +/* Returns the number of busses commonly supported by the current programmer and flash chip where the latter + * can not be completely accessed due to size/address limits of the programmer. */ +unsigned int count_max_decode_exceedings(struct flashctx *flash) { - int limitexceeded = 0; + unsigned int limitexceeded = 0; + uint32_t size = flash->chip->total_size * 1024; + enum chipbustype buses = flash->pgm->buses_supported & flash->chip->bustype;
if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) { limitexceeded++; @@ -1031,17 +1035,7 @@ int check_max_decode(enum chipbustype buses, uint32_t size) "probe/read/erase/write may fail. ", size / 1024, max_rom_decode.spi / 1024, "SPI"); } - if (!limitexceeded) - return 0; - /* Sometimes chip and programmer have more than one bus in common, - * and the limit is not exceeded on all buses. Tell the user. - */ - if (bitcount(buses) > limitexceeded) - /* FIXME: This message is designed towards CLI users. */ - msg_pdbg("There is at least one common chip/programmer " - "interface which can support a chip of this size. " - "You can try --force at your own risk.\n"); - return 1; + return limitexceeded; }
int probe_flash(struct registered_programmer *pgm, int startchip, struct flashctx *flash, int force) @@ -1065,9 +1059,6 @@ int probe_flash(struct registered_programmer *pgm, int startchip, struct flashct continue; }
- size = chip->total_size * 1024; - check_max_decode(buses_common, size); - /* Start filling in the dynamic data. */ flash->chip = calloc(1, sizeof(struct flashchip)); if (!flash->chip) { @@ -1077,6 +1068,7 @@ int probe_flash(struct registered_programmer *pgm, int startchip, struct flashct memcpy(flash->chip, chip, sizeof(struct flashchip)); flash->pgm = pgm;
+ size = chip->total_size * 1024; base = flashbase ? flashbase : (0xffffffff - size + 1); flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
diff --git a/programmer.h b/programmer.h index 867eee9..2a5322f 100644 --- a/programmer.h +++ b/programmer.h @@ -503,7 +503,7 @@ struct decode_sizes { extern struct decode_sizes max_rom_decode; extern int programmer_may_write; extern unsigned long flashbase; -int check_max_decode(enum chipbustype buses, uint32_t size); +unsigned int count_max_decode_exceedings(struct flashctx *flash); char *extract_programmer_param(const char *param_name);
/* spi.c */