mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-10-31 21:30:42 +01: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:
		| @@ -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 */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stefan Tauner
					Stefan Tauner