drivers/spi: Winbond specific write-protection enable
Extend the SPI interface to enable write-protection. Tested on Cavium EVB CN81xx using W25Q128. Change-Id: Ie3765b013855538eca37bc7800d3f9d5d09b8402 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/25105 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
		
				
					committed by
					
						
						Philipp Deppenwiese
					
				
			
			
				
	
			
			
			
						parent
						
							61322d7ad2
						
					
				
				
					commit
					e63a5f1e7f
				
			@@ -26,6 +26,25 @@
 | 
			
		||||
 | 
			
		||||
struct spi_flash;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * SPI write protection is enforced by locking the status register.
 | 
			
		||||
 * The following modes are known. It depends on the flash chip if the
 | 
			
		||||
 * mode is actually supported.
 | 
			
		||||
 *
 | 
			
		||||
 * PRESERVE : Keep the previous status register lock-down setting (noop)
 | 
			
		||||
 * NONE     : Status register isn't locked
 | 
			
		||||
 * PIN      : Status register is locked as long as the ~WP pin is active
 | 
			
		||||
 * REBOOT   : Status register is locked until power failure
 | 
			
		||||
 * PERMANENT: Status register is permanently locked
 | 
			
		||||
 */
 | 
			
		||||
enum spi_flash_status_reg_lockdown {
 | 
			
		||||
	SPI_WRITE_PROTECTION_PRESERVE = -1,
 | 
			
		||||
	SPI_WRITE_PROTECTION_NONE = 0,
 | 
			
		||||
	SPI_WRITE_PROTECTION_PIN,
 | 
			
		||||
	SPI_WRITE_PROTECTION_REBOOT,
 | 
			
		||||
	SPI_WRITE_PROTECTION_PERMANENT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Representation of SPI flash operations:
 | 
			
		||||
 * read:	Flash read operation.
 | 
			
		||||
@@ -45,10 +64,26 @@ struct spi_flash_ops {
 | 
			
		||||
	 * Hardware write protection mechanism aren't accounted.
 | 
			
		||||
	 * If the write protection could be changed, due to unlocked status
 | 
			
		||||
	 * register for example, 0 should be returned.
 | 
			
		||||
	 * Returns -1 on error.
 | 
			
		||||
	 * Returns 0 on success.
 | 
			
		||||
	 */
 | 
			
		||||
	int (*get_write_protection)(const struct spi_flash *flash,
 | 
			
		||||
				    const struct region *region);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Enable the status register write protection, if supported on the
 | 
			
		||||
	 * requested region, and optionally enable status register lock-down.
 | 
			
		||||
	 * Returns 0 if the whole region was software write protected.
 | 
			
		||||
	 * Hardware write protection mechanism aren't accounted.
 | 
			
		||||
	 * If the status register is locked and the requested configuration
 | 
			
		||||
	 * doesn't match the selected one, return an error.
 | 
			
		||||
	 * Only a single region is supported !
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return 0 on success
 | 
			
		||||
	 */
 | 
			
		||||
	int
 | 
			
		||||
	(*set_write_protection)(const struct spi_flash *flash,
 | 
			
		||||
				const struct region *region,
 | 
			
		||||
				const bool non_volatile,
 | 
			
		||||
				const enum spi_flash_status_reg_lockdown mode);
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -119,6 +154,27 @@ int spi_flash_status(const struct spi_flash *flash, u8 *reg);
 | 
			
		||||
 */
 | 
			
		||||
int spi_flash_is_write_protected(const struct spi_flash *flash,
 | 
			
		||||
				 const struct region *region);
 | 
			
		||||
/*
 | 
			
		||||
 * Enable the vendor dependent SPI flash write protection. The region not
 | 
			
		||||
 * covered by write-protection will be set to write-able state.
 | 
			
		||||
 * Only a single write-protected region is supported.
 | 
			
		||||
 * Some flash ICs require the region to be aligned in the block size, sector
 | 
			
		||||
 * size or page size.
 | 
			
		||||
 * Some flash ICs require the region to start at TOP or BOTTOM.
 | 
			
		||||
 *
 | 
			
		||||
 * @param flash : A SPI flash device
 | 
			
		||||
 * @param region: A subregion of the device's region
 | 
			
		||||
 * @param non_volatile: Write status register non-volatile
 | 
			
		||||
 * @param mode: Optional lock-down of status register
 | 
			
		||||
 | 
			
		||||
 * @return 0 on success
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
spi_flash_set_write_protected(const struct spi_flash *flash,
 | 
			
		||||
			      const struct region *region,
 | 
			
		||||
			      const bool non_volatile,
 | 
			
		||||
			      const enum spi_flash_status_reg_lockdown mode);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Some SPI controllers require exclusive access to SPI flash when volatile
 | 
			
		||||
 * operations like erase or write are being performed. In such cases,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user