Commit 9e3a6984 authored by Stefan Tauner's avatar Stefan Tauner
Browse files

Refine handling chips that exceed maximum programmer sizes


 - 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 pointer 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.

Corresponding to flashrom svn r1842.
Signed-off-by: default avatarStefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: default avatarCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
parent 9b32de94
...@@ -91,7 +91,6 @@ static int check_filename(char *filename, char *type) ...@@ -91,7 +91,6 @@ static int check_filename(char *filename, char *type)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
unsigned long size;
/* Probe for up to three flash chips. */ /* Probe for up to three flash chips. */
const struct flashchip *chip = NULL; const struct flashchip *chip = NULL;
struct flashctx flashes[6] = {{0}}; struct flashctx flashes[6] = {{0}};
...@@ -501,9 +500,18 @@ int main(int argc, char *argv[]) ...@@ -501,9 +500,18 @@ int main(int argc, char *argv[])
print_chip_support_status(fill_flash->chip); print_chip_support_status(fill_flash->chip);
size = fill_flash->chip->total_size * 1024; unsigned int limitexceeded = count_max_decode_exceedings(fill_flash);
if (check_max_decode(fill_flash->mst->buses_supported & fill_flash->chip->bustype, size) && (!force)) { if (limitexceeded > 0 && !force) {
msg_cerr("Chip is too big for this programmer (-V gives details). Use --force to override.\n"); enum chipbustype commonbuses = fill_flash->mst->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; ret = 1;
goto out_shutdown; goto out_shutdown;
} }
......
...@@ -1009,9 +1009,13 @@ int generate_testpattern(uint8_t *buf, uint32_t size, int variant) ...@@ -1009,9 +1009,13 @@ int generate_testpattern(uint8_t *buf, uint32_t size, int variant)
return 0; 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(const struct flashctx *flash)
{ {
int limitexceeded = 0; unsigned int limitexceeded = 0;
uint32_t size = flash->chip->total_size * 1024;
enum chipbustype buses = flash->mst->buses_supported & flash->chip->bustype;
if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) { if ((buses & BUS_PARALLEL) && (max_rom_decode.parallel < size)) {
limitexceeded++; limitexceeded++;
...@@ -1045,17 +1049,7 @@ int check_max_decode(enum chipbustype buses, uint32_t size) ...@@ -1045,17 +1049,7 @@ int check_max_decode(enum chipbustype buses, uint32_t size)
"probe/read/erase/write may fail. ", size / 1024, "probe/read/erase/write may fail. ", size / 1024,
max_rom_decode.spi / 1024, "SPI"); max_rom_decode.spi / 1024, "SPI");
} }
if (!limitexceeded) return 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;
} }
int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force) int probe_flash(struct registered_master *mst, int startchip, struct flashctx *flash, int force)
...@@ -1079,9 +1073,6 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f ...@@ -1079,9 +1073,6 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f
continue; continue;
} }
size = chip->total_size * 1024;
check_max_decode(buses_common, size);
/* Start filling in the dynamic data. */ /* Start filling in the dynamic data. */
flash->chip = calloc(1, sizeof(struct flashchip)); flash->chip = calloc(1, sizeof(struct flashchip));
if (!flash->chip) { if (!flash->chip) {
...@@ -1091,6 +1082,7 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f ...@@ -1091,6 +1082,7 @@ int probe_flash(struct registered_master *mst, int startchip, struct flashctx *f
memcpy(flash->chip, chip, sizeof(struct flashchip)); memcpy(flash->chip, chip, sizeof(struct flashchip));
flash->mst = mst; flash->mst = mst;
size = flash->chip->total_size * 1024;
base = flashbase ? flashbase : (0xffffffff - size + 1); base = flashbase ? flashbase : (0xffffffff - size + 1);
flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size); flash->virtual_memory = (chipaddr)programmer_map_flash_region("flash chip", base, size);
......
...@@ -513,7 +513,7 @@ struct decode_sizes { ...@@ -513,7 +513,7 @@ struct decode_sizes {
extern struct decode_sizes max_rom_decode; extern struct decode_sizes max_rom_decode;
extern int programmer_may_write; extern int programmer_may_write;
extern unsigned long flashbase; extern unsigned long flashbase;
int check_max_decode(enum chipbustype buses, uint32_t size); unsigned int count_max_decode_exceedings(const struct flashctx *flash);
char *extract_programmer_param(const char *param_name); char *extract_programmer_param(const char *param_name);
/* spi.c */ /* spi.c */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment