mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-11-04 07:00:39 +01:00 
			
		
		
		
	programmer.h: Guard against sending spi commands on non-spi mst
Validate (flash->chip->bustype == BUS_SPI) as ich copies the
chip flags in the opaque master and tries incorrectly
to issue 4BA commands which results in failure.
The issue was detected only in the case of chips >16MB, in
this case 'W25Q256FV' that has the feature bits:
```
 .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN |
                   FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
                   FEATURE_WRSR2,
```
The regression was noticed from,
commit 0741727925 ichspi.c: Read chip ID and use it to populate `flash->chip`
TEST=In the case of 'W25Q256FV' on TigerLake.
Change-Id: I7cce4f9c032d33c01bf616e27a50b9727a40fe1b
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/71269
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Jonathon Hall <jonathon.hall@puri.sm>
Reviewed-by: Sam McNally <sammc@google.com>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Edward O'Callaghan
					
				
			
			
				
	
			
			
			
						parent
						
							e4c51439ac
						
					
				
				
					commit
					c1fb4bd9fd
				
			@@ -1944,7 +1944,7 @@ int prepare_flash_access(struct flashctx *const flash,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Enable/disable 4-byte addressing mode if flash chip supports it */
 | 
						/* Enable/disable 4-byte addressing mode if flash chip supports it */
 | 
				
			||||||
	if (flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_ENTER_EAR7)) {
 | 
						if (spi_chip_4ba(flash)) {
 | 
				
			||||||
		int ret;
 | 
							int ret;
 | 
				
			||||||
		if (spi_master_4ba(flash))
 | 
							if (spi_master_4ba(flash))
 | 
				
			||||||
			ret = spi_enter_4ba(flash);
 | 
								ret = spi_enter_4ba(flash);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -513,6 +513,12 @@ static inline bool spi_master_no_4ba_modes(const struct flashctx *const flash)
 | 
				
			|||||||
	return flash->mst->buses_supported & BUS_SPI &&
 | 
						return flash->mst->buses_supported & BUS_SPI &&
 | 
				
			||||||
		flash->mst->spi.features & SPI_MASTER_NO_4BA_MODES;
 | 
							flash->mst->spi.features & SPI_MASTER_NO_4BA_MODES;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					/* spi_chip feature checks */
 | 
				
			||||||
 | 
					static inline bool spi_chip_4ba(const struct flashctx *const flash)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return flash->chip->bustype == BUS_SPI &&
 | 
				
			||||||
 | 
							(flash->chip->feature_bits & (FEATURE_4BA_ENTER | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_ENTER_EAR7));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* usbdev.c */
 | 
					/* usbdev.c */
 | 
				
			||||||
struct libusb_device_handle;
 | 
					struct libusb_device_handle;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user