This is a common SPI Flash library used for the Intel platform that supports SPI hardware sequence. This library provides actual SPI flash operation via Intel PCH SPI controller. Signed-off-by: Guo Dong <guo.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Maurice Ma <maurice.ma@intel.com> Cc: Benjamin You <benjamin.you@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Benjamin You <benjamin.you@intel.com>
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  PCH SPI Common Driver implements the SPI Host Controller Compatibility Interface.
 | 
						|
 | 
						|
  Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef SPI_FLASH_LIB_H_
 | 
						|
#define SPI_FLASH_LIB_H_
 | 
						|
 | 
						|
/**
 | 
						|
  Flash Region Type
 | 
						|
**/
 | 
						|
typedef enum {
 | 
						|
  FlashRegionDescriptor,
 | 
						|
  FlashRegionBios,
 | 
						|
  FlashRegionMe,
 | 
						|
  FlashRegionGbE,
 | 
						|
  FlashRegionPlatformData,
 | 
						|
  FlashRegionDer,
 | 
						|
  FlashRegionAll,
 | 
						|
  FlashRegionMax
 | 
						|
} FLASH_REGION_TYPE;
 | 
						|
 | 
						|
/**
 | 
						|
  Read SFDP data from the flash part.
 | 
						|
 | 
						|
  @param[in] ComponentNumber      The Component Number for chip select
 | 
						|
  @param[in] ByteCount            Number of bytes in SFDP data portion of the SPI cycle, the max number is 64
 | 
						|
  @param[out] SfdpData            The Pointer to caller-allocated buffer containing the SFDP data received
 | 
						|
                                  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashReadSfdp (
 | 
						|
  IN     UINT8              ComponentNumber,
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  OUT    UINT8              *SfdpData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Read Jedec Id from the flash part.
 | 
						|
 | 
						|
  @param[in] ComponentNumber      The Component Number for chip select
 | 
						|
  @param[in] ByteCount            Number of bytes in JedecId data portion of the SPI cycle, the data size is 3 typically
 | 
						|
  @param[out] JedecId             The Pointer to caller-allocated buffer containing JEDEC ID received
 | 
						|
                                  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashReadJedecId (
 | 
						|
  IN     UINT8              ComponentNumber,
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  OUT    UINT8              *JedecId
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Write the status register in the flash part.
 | 
						|
 | 
						|
  @param[in] ByteCount            Number of bytes in Status data portion of the SPI cycle, the data size is 1 typically
 | 
						|
  @param[in] StatusValue          The Pointer to caller-allocated buffer containing the value of Status register writing
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashWriteStatus (
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  IN     UINT8              *StatusValue
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Read status register in the flash part.
 | 
						|
 | 
						|
  @param[in] ByteCount            Number of bytes in Status data portion of the SPI cycle, the data size is 1 typically
 | 
						|
  @param[out] StatusValue         The Pointer to caller-allocated buffer containing the value of Status register received.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashReadStatus (
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  OUT    UINT8              *StatusValue
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Read SC Soft Strap Values
 | 
						|
 | 
						|
  @param[in] SoftStrapAddr        SC Soft Strap address offset from FPSBA.
 | 
						|
  @param[in] ByteCount            Number of bytes in SoftStrap data portion of the SPI cycle
 | 
						|
  @param[out] SoftStrapValue      The Pointer to caller-allocated buffer containing SC Soft Strap Value.
 | 
						|
                                  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiReadPchSoftStrap (
 | 
						|
  IN     UINT32             SoftStrapAddr,
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  OUT    UINT8              *SoftStrapValue
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Read data from the flash part.
 | 
						|
 | 
						|
  @param[in] FlashRegionType      The Flash Region type for flash cycle which is listed in the Descriptor.
 | 
						|
  @param[in] Address              The Flash Linear Address must fall within a region for which BIOS has access permissions.
 | 
						|
  @param[in] ByteCount            Number of bytes in the data portion of the SPI cycle.
 | 
						|
  @param[out] Buffer              The Pointer to caller-allocated buffer containing the dada received.
 | 
						|
                                  It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashRead (
 | 
						|
  IN     FLASH_REGION_TYPE  FlashRegionType,
 | 
						|
  IN     UINT32             Address,
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  OUT    UINT8              *Buffer
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Erase some area on the flash part.
 | 
						|
 | 
						|
  @param[in] FlashRegionType      The Flash Region type for flash cycle which is listed in the Descriptor.
 | 
						|
  @param[in] Address              The Flash Linear Address must fall within a region for which BIOS has access permissions.
 | 
						|
  @param[in] ByteCount            Number of bytes in the data portion of the SPI cycle.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashErase (
 | 
						|
  IN     FLASH_REGION_TYPE  FlashRegionType,
 | 
						|
  IN     UINT32             Address,
 | 
						|
  IN     UINT32             ByteCount
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Write data to the flash part.
 | 
						|
 | 
						|
  @param[in] FlashRegionType      The Flash Region type for flash cycle which is listed in the Descriptor.
 | 
						|
  @param[in] Address              The Flash Linear Address must fall within a region for which BIOS has access permissions.
 | 
						|
  @param[in] ByteCount            Number of bytes in the data portion of the SPI cycle.
 | 
						|
  @param[in] Buffer               Pointer to caller-allocated buffer containing the data sent during the SPI cycle.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiFlashWrite (
 | 
						|
  IN     FLASH_REGION_TYPE  FlashRegionType,
 | 
						|
  IN     UINT32             Address,
 | 
						|
  IN     UINT32             ByteCount,
 | 
						|
  IN     UINT8              *Buffer
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize an SPI library.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The protocol instance was properly initialized
 | 
						|
  @retval EFI_NOT_FOUND           The expected SPI info could not be found
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiConstructor (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get the SPI region base and size, based on the enum type
 | 
						|
 | 
						|
  @param[in] FlashRegionType      The Flash Region type for for the base address which is listed in the Descriptor.
 | 
						|
  @param[out] BaseAddress         The Flash Linear Address for the Region 'n' Base
 | 
						|
  @param[out] RegionSize          The size for the Region 'n'
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Read success
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid region type given
 | 
						|
  @retval EFI_DEVICE_ERROR        The region is not used
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
SpiGetRegionAddress (
 | 
						|
  IN     FLASH_REGION_TYPE  FlashRegionType,
 | 
						|
  OUT    UINT32             *BaseAddress, OPTIONAL
 | 
						|
  OUT    UINT32             *RegionSize OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 | 
						|
 |