mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-10-31 05:10:41 +01:00 
			
		
		
		
	Add support for Winbond W39F010/W39L010/W39L020
W39F010 is a 128kB parallel 5V flash chip, 16k bootblocks. W39L010 is a 128kB parallel 3.3V flash chip, 8k bootblocks. W39L020 is a 256kB parallel 3.3V flash chip, 64k/16k bootblocks. The W39F010 code was tested with a satasii programmer. The first write attempt after an erase returned with verify failure, but the second write attempt was succesful: http://paste.flashrom.org/view.php?id=1418 Corresponding to flashrom svn r1620. Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Acked-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
This commit is contained in:
		 Kyösti Mälkki
					Kyösti Mälkki
				
			
				
					committed by
					
						 Stefan Tauner
						Stefan Tauner
					
				
			
			
				
	
			
			
			 Stefan Tauner
						Stefan Tauner
					
				
			
						parent
						
							78ffbeaa02
						
					
				
				
					commit
					c31243e173
				
			| @@ -143,6 +143,9 @@ int printlock_sst_fwhub(struct flashctx *flash); | |||||||
| int unlock_sst_fwhub(struct flashctx *flash); | int unlock_sst_fwhub(struct flashctx *flash); | ||||||
|  |  | ||||||
| /* w39.c */ | /* w39.c */ | ||||||
|  | int printlock_w39f010(struct flashctx * flash); | ||||||
|  | int printlock_w39l010(struct flashctx * flash); | ||||||
|  | int printlock_w39l020(struct flashctx * flash); | ||||||
| int printlock_w39l040(struct flashctx * flash); | int printlock_w39l040(struct flashctx * flash); | ||||||
| int printlock_w39v040a(struct flashctx *flash); | int printlock_w39v040a(struct flashctx *flash); | ||||||
| int printlock_w39v040b(struct flashctx *flash); | int printlock_w39v040b(struct flashctx *flash); | ||||||
|   | |||||||
							
								
								
									
										87
									
								
								flashchips.c
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								flashchips.c
									
									
									
									
									
								
							| @@ -9434,6 +9434,93 @@ const struct flashchip flashchips[] = { | |||||||
| 		.voltage	= {4500, 5500}, | 		.voltage	= {4500, 5500}, | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	{ | ||||||
|  | 		.vendor		= "Winbond", | ||||||
|  | 		.name		= "W39F010", | ||||||
|  | 		.bustype	= BUS_PARALLEL, | ||||||
|  | 		.manufacture_id	= WINBOND_ID, | ||||||
|  | 		.model_id	= WINBOND_W39F010, | ||||||
|  | 		.total_size	= 128, | ||||||
|  | 		.page_size	= 4 * 1024, | ||||||
|  | 		.feature_bits	= FEATURE_EITHER_RESET, | ||||||
|  | 		.tested		= TEST_OK_PREW, | ||||||
|  | 		.probe		= probe_jedec, | ||||||
|  | 		.probe_timing	= 10, | ||||||
|  | 		.block_erasers	= | ||||||
|  | 		{ | ||||||
|  | 			{ | ||||||
|  | 				.eraseblocks = { {4 * 1024, 32} }, | ||||||
|  | 				.block_erase = erase_block_jedec, | ||||||
|  | 			}, { | ||||||
|  | 				.eraseblocks = { {128 * 1024, 1} }, | ||||||
|  | 				.block_erase = erase_chip_block_jedec, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		.printlock	= printlock_w39f010, | ||||||
|  | 		.write		= write_jedec_1, | ||||||
|  | 		.read		= read_memmapped, | ||||||
|  | 		.voltage	= {4500, 5500}, | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	{ | ||||||
|  | 		.vendor		= "Winbond", | ||||||
|  | 		.name		= "W39L010", | ||||||
|  | 		.bustype	= BUS_PARALLEL, | ||||||
|  | 		.manufacture_id	= WINBOND_ID, | ||||||
|  | 		.model_id	= WINBOND_W39L010, | ||||||
|  | 		.total_size	= 128, | ||||||
|  | 		.page_size	= 4 * 1024, | ||||||
|  | 		.feature_bits	= FEATURE_EITHER_RESET, | ||||||
|  | 		.tested		= TEST_UNTESTED, | ||||||
|  | 		.probe		= probe_jedec, | ||||||
|  | 		.probe_timing	= 10, | ||||||
|  | 		.block_erasers	= | ||||||
|  | 		{ | ||||||
|  | 			{ | ||||||
|  | 				.eraseblocks = { {4 * 1024, 32} }, | ||||||
|  | 				.block_erase = erase_block_jedec, | ||||||
|  | 			}, { | ||||||
|  | 				.eraseblocks = { {128 * 1024, 1} }, | ||||||
|  | 				.block_erase = erase_chip_block_jedec, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		.printlock	= printlock_w39l010, | ||||||
|  | 		.write		= write_jedec_1, | ||||||
|  | 		.read		= read_memmapped, | ||||||
|  | 		.voltage	= {3000, 3600}, | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	{ | ||||||
|  | 		.vendor		= "Winbond", | ||||||
|  | 		.name		= "W39L020", | ||||||
|  | 		.bustype	= BUS_PARALLEL, | ||||||
|  | 		.manufacture_id	= WINBOND_ID, | ||||||
|  | 		.model_id	= WINBOND_W39L020, | ||||||
|  | 		.total_size	= 256, | ||||||
|  | 		.page_size	= 4 * 1024, | ||||||
|  | 		.feature_bits	= FEATURE_EITHER_RESET, | ||||||
|  | 		.tested		= TEST_UNTESTED, | ||||||
|  | 		.probe		= probe_jedec, | ||||||
|  | 		.probe_timing	= 10, | ||||||
|  | 		.block_erasers	= | ||||||
|  | 		{ | ||||||
|  | 			{ | ||||||
|  | 				.eraseblocks = { {4 * 1024, 64} }, | ||||||
|  | 				.block_erase = erase_block_jedec, | ||||||
|  | 			}, { | ||||||
|  | 				.eraseblocks = { {64 * 1024, 4} }, | ||||||
|  | 				.block_erase = erase_sector_jedec, | ||||||
|  | 			}, { | ||||||
|  | 				.eraseblocks = { {256 * 1024, 1} }, | ||||||
|  | 				.block_erase = erase_chip_block_jedec, | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 		.printlock	= printlock_w39l020, | ||||||
|  | 		.write		= write_jedec_1, | ||||||
|  | 		.read		= read_memmapped, | ||||||
|  | 		.voltage	= {3000, 3600}, | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	{ | 	{ | ||||||
| 		.vendor		= "Winbond", | 		.vendor		= "Winbond", | ||||||
| 		.name		= "W39L040", | 		.name		= "W39L040", | ||||||
|   | |||||||
| @@ -653,6 +653,7 @@ | |||||||
| #define WINBOND_W29C020		0x45    /* Same as W29C020C, W29C022 and ASD AE29F2008 */ | #define WINBOND_W29C020		0x45    /* Same as W29C020C, W29C022 and ASD AE29F2008 */ | ||||||
| #define WINBOND_W29C040		0x46    /* Same as W29C040P */ | #define WINBOND_W29C040		0x46    /* Same as W29C040P */ | ||||||
| #define WINBOND_W29C512A	0xC8    /* Same as W29EE512 */ | #define WINBOND_W29C512A	0xC8    /* Same as W29EE512 */ | ||||||
|  | #define WINBOND_W39F010		0xA1 | ||||||
| #define WINBOND_W39L010		0x31 | #define WINBOND_W39L010		0x31 | ||||||
| #define WINBOND_W39L020		0xB5 | #define WINBOND_W39L020		0xB5 | ||||||
| #define WINBOND_W39L040		0xB6 | #define WINBOND_W39L040		0xB6 | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								w39.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								w39.c
									
									
									
									
									
								
							| @@ -115,6 +115,15 @@ static int printlock_w39_tblwp(uint8_t lock) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int printlock_w39_single_bootblock(uint8_t lock, uint16_t kB) | ||||||
|  | { | ||||||
|  | 	msg_cdbg("Software %d kB bootblock locking is %sactive.\n", kB, (lock & 0x03) ? "" : "not "); | ||||||
|  | 	if (lock & 0x03) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int printlock_w39_bootblock_64k16k(uint8_t lock) | static int printlock_w39_bootblock_64k16k(uint8_t lock) | ||||||
| { | { | ||||||
| 	msg_cdbg("Software 64 kB bootblock locking is %sactive.\n", | 	msg_cdbg("Software 64 kB bootblock locking is %sactive.\n", | ||||||
| @@ -160,6 +169,54 @@ static int unlock_w39_fwh(struct flashctx *flash) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int printlock_w39f010(struct flashctx *flash) | ||||||
|  | { | ||||||
|  | 	uint8_t lock; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x00002); | ||||||
|  | 	msg_cdbg("Bottom boot block:\n"); | ||||||
|  | 	ret = printlock_w39_single_bootblock(lock, 16); | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x1fff2); | ||||||
|  | 	msg_cdbg("Top boot block:\n"); | ||||||
|  | 	ret |= printlock_w39_single_bootblock(lock, 16); | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int printlock_w39l010(struct flashctx *flash) | ||||||
|  | { | ||||||
|  | 	uint8_t lock; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x00002); | ||||||
|  | 	msg_cdbg("Bottom boot block:\n"); | ||||||
|  | 	ret = printlock_w39_single_bootblock(lock, 8); | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x1fff2); | ||||||
|  | 	msg_cdbg("Top boot block:\n"); | ||||||
|  | 	ret |= printlock_w39_single_bootblock(lock, 8); | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int printlock_w39l020(struct flashctx *flash) | ||||||
|  | { | ||||||
|  | 	uint8_t lock; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x00002); | ||||||
|  | 	msg_cdbg("Bottom boot block:\n"); | ||||||
|  | 	ret = printlock_w39_bootblock_64k16k(lock); | ||||||
|  |  | ||||||
|  | 	lock = w39_idmode_readb(flash, 0x3fff2); | ||||||
|  | 	msg_cdbg("Top boot block:\n"); | ||||||
|  | 	ret |= printlock_w39_bootblock_64k16k(lock); | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
| int printlock_w39l040(struct flashctx *flash) | int printlock_w39l040(struct flashctx *flash) | ||||||
| { | { | ||||||
| 	uint8_t lock; | 	uint8_t lock; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user