mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
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: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
parent
9b32de94f5
commit
9e3a6984da
@ -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[])
|
|||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
24
flashrom.c
24
flashrom.c
@ -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)
|
|||||||
"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
|
|||||||
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
|
|||||||
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 {
|
|||||||
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user