https://svn.code.sf.net/p/edk2/code/trunk/edk2/, which are for MinnowBoard MAX open source project. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Wei <david.wei@intel.com> Reviewed-by: Mike Wu <mike.wu@intel.com> Reviewed-by: Hot Tian <hot.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16599 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			267 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			267 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
**/
 | 
						|
/**
 | 
						|
 | 
						|
Copyright (c) 2012  - 2014, Intel Corporation. All rights reserved
 | 
						|
 | 
						|
  This program and the accompanying materials are licensed and made available under
 | 
						|
  the terms and conditions of the BSD License that accompanies this distribution.
 | 
						|
  The full text of the license may be found at
 | 
						|
  http://opensource.org/licenses/bsd-license.php.
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
  @file
 | 
						|
  Spi.h
 | 
						|
 | 
						|
  @brief
 | 
						|
  This file defines the EFI SPI Protocol which implements the
 | 
						|
  Intel(R) ICH SPI Host Controller Compatibility Interface.
 | 
						|
 | 
						|
**/
 | 
						|
#ifndef _EFI_SPI_H_
 | 
						|
#define _EFI_SPI_H_
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
#define EFI_SPI_PROTOCOL_GUID \
 | 
						|
  { \
 | 
						|
    0x1156efc6, 0xea32, 0x4396, 0xb5, 0xd5, 0x26, 0x93, 0x2e, 0x83, 0xc3, 0x13 \
 | 
						|
  }
 | 
						|
#define EFI_SMM_SPI_PROTOCOL_GUID \
 | 
						|
  { \
 | 
						|
    0xD9072C35, 0xEB8F, 0x43ad, 0xA2, 0x20, 0x34, 0xD4, 0x0E, 0x2A, 0x82, 0x85 \
 | 
						|
  }
 | 
						|
extern EFI_GUID                   gEfiSpiProtocolGuid;
 | 
						|
extern EFI_GUID                   gEfiSmmSpiProtocolGuid;
 | 
						|
 | 
						|
///
 | 
						|
/// Forward reference for ANSI C compatibility
 | 
						|
///
 | 
						|
typedef struct _EFI_SPI_PROTOCOL  EFI_SPI_PROTOCOL;
 | 
						|
 | 
						|
///
 | 
						|
/// SPI protocol data structures and definitions
 | 
						|
///
 | 
						|
///
 | 
						|
/// Number of Prefix Opcodes allowed on the SPI interface
 | 
						|
///
 | 
						|
#define SPI_NUM_PREFIX_OPCODE 2
 | 
						|
 | 
						|
///
 | 
						|
/// Number of Opcodes in the Opcode Menu
 | 
						|
///
 | 
						|
#define SPI_NUM_OPCODE  8
 | 
						|
 | 
						|
///
 | 
						|
/// Opcode Type
 | 
						|
///    EnumSpiOpcodeCommand: Command without address
 | 
						|
///    EnumSpiOpcodeRead: Read with address
 | 
						|
///    EnumSpiOpcodeWrite: Write with address
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  EnumSpiOpcodeReadNoAddr,
 | 
						|
  EnumSpiOpcodeWriteNoAddr,
 | 
						|
  EnumSpiOpcodeRead,
 | 
						|
  EnumSpiOpcodeWrite,
 | 
						|
  EnumSpiOpcodeMax
 | 
						|
} SPI_OPCODE_TYPE;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  EnumSpiCycle20MHz,
 | 
						|
  EnumSpiCycle33MHz,
 | 
						|
  EnumSpiCycle66MHz,  /// Not supported by VLV
 | 
						|
  EnumSpiCycle50MHz,
 | 
						|
  EnumSpiCycleMax
 | 
						|
} SPI_CYCLE_FREQUENCY;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  EnumSpiRegionAll,
 | 
						|
  EnumSpiRegionBios,
 | 
						|
  EnumSpiRegionSeC,
 | 
						|
  EnumSpiRegionDescriptor,
 | 
						|
  EnumSpiRegionPlatformData,
 | 
						|
  EnumSpiRegionMax
 | 
						|
} SPI_REGION_TYPE;
 | 
						|
 | 
						|
///
 | 
						|
/// Hardware Sequencing required operations (as listed in Valleyview EDS "Hardware
 | 
						|
/// Sequencing Commands and Opcode Requirements"
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  EnumSpiOperationWriteStatus,
 | 
						|
  EnumSpiOperationProgramData_1_Byte,
 | 
						|
  EnumSpiOperationProgramData_64_Byte,
 | 
						|
  EnumSpiOperationReadData,
 | 
						|
  EnumSpiOperationWriteDisable,
 | 
						|
  EnumSpiOperationReadStatus,
 | 
						|
  EnumSpiOperationWriteEnable,
 | 
						|
  EnumSpiOperationFastRead,
 | 
						|
  EnumSpiOperationEnableWriteStatus,
 | 
						|
  EnumSpiOperationErase_256_Byte,
 | 
						|
  EnumSpiOperationErase_4K_Byte,
 | 
						|
  EnumSpiOperationErase_8K_Byte,
 | 
						|
  EnumSpiOperationErase_64K_Byte,
 | 
						|
  EnumSpiOperationFullChipErase,
 | 
						|
  EnumSpiOperationJedecId,
 | 
						|
  EnumSpiOperationDualOutputFastRead,
 | 
						|
  EnumSpiOperationDiscoveryParameters,
 | 
						|
  EnumSpiOperationOther,
 | 
						|
  EnumSpiOperationMax
 | 
						|
} SPI_OPERATION;
 | 
						|
 | 
						|
///
 | 
						|
/// SPI Command Configuration
 | 
						|
///   Frequency       The expected frequency to be used (value to be programmed to the SSFC
 | 
						|
///                   Register)
 | 
						|
///   Operation       Which Hardware Sequencing required operation this opcode respoinds to.
 | 
						|
///                   The required operations are listed in EDS Table 5-55: "Hardware
 | 
						|
///                   Sequencing Commands and Opcode Requirements"
 | 
						|
///                   If the opcode does not corresponds to any operation listed, use
 | 
						|
///                   EnumSpiOperationOther, and provides TYPE and Code for it in
 | 
						|
///                   SpecialOpcodeEntry.
 | 
						|
///
 | 
						|
typedef struct _SPI_OPCODE_MENU_ENTRY {
 | 
						|
  SPI_OPCODE_TYPE     Type;
 | 
						|
  UINT8               Code;
 | 
						|
  SPI_CYCLE_FREQUENCY Frequency;
 | 
						|
  SPI_OPERATION       Operation;
 | 
						|
} SPI_OPCODE_MENU_ENTRY;
 | 
						|
 | 
						|
//
 | 
						|
// Initialization data table loaded to the SPI host controller
 | 
						|
//    VendorId        Vendor ID of the SPI device
 | 
						|
//    DeviceId0       Device ID0 of the SPI device
 | 
						|
//    DeviceId1       Device ID1 of the SPI device
 | 
						|
//    PrefixOpcode    Prefix opcodes which are loaded into the SPI host controller
 | 
						|
//    OpcodeMenu      Opcodes which are loaded into the SPI host controller Opcode Menu
 | 
						|
//    BiosStartOffset The offset of the start of the BIOS image relative to the flash device.
 | 
						|
//                    Please note this is a Flash Linear Address, NOT a memory space address.
 | 
						|
//                    This value is platform specific and depends on the system flash map.
 | 
						|
//                    This value is only used on non Descriptor mode.
 | 
						|
//    BiosSize        The the BIOS Image size in flash. This value is platform specific
 | 
						|
//                    and depends on the system flash map. Please note BIOS Image size may
 | 
						|
//                    be smaller than BIOS Region size (in Descriptor Mode) or the flash size
 | 
						|
//                    (in Non Descriptor Mode), and in this case, BIOS Image is supposed to be
 | 
						|
//                    placed at the top end of the BIOS Region (in Descriptor Mode) or the flash
 | 
						|
//                    (in Non Descriptor Mode)
 | 
						|
//
 | 
						|
typedef struct _SPI_INIT_TABLE {
 | 
						|
  UINT8                 VendorId;
 | 
						|
  UINT8                 DeviceId0;
 | 
						|
  UINT8                 DeviceId1;
 | 
						|
  UINT8                 PrefixOpcode[SPI_NUM_PREFIX_OPCODE];
 | 
						|
  SPI_OPCODE_MENU_ENTRY OpcodeMenu[SPI_NUM_OPCODE];
 | 
						|
  UINTN                 BiosStartOffset;
 | 
						|
  UINTN                 BiosSize;
 | 
						|
} SPI_INIT_TABLE;
 | 
						|
 | 
						|
//
 | 
						|
// Protocol member functions
 | 
						|
//
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SPI_INIT) (
 | 
						|
  IN EFI_SPI_PROTOCOL     * This,
 | 
						|
  IN SPI_INIT_TABLE       * InitTable
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
  @brief
 | 
						|
  Initializes the host controller to execute SPI commands.
 | 
						|
 | 
						|
  @param[in] This                 Pointer to the EFI_SPI_PROTOCOL instance.
 | 
						|
  @param[in] InitData             Pointer to caller-allocated buffer containing the SPI
 | 
						|
                                  interface initialization table.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Opcode initialization on the SPI host controller completed.
 | 
						|
  @retval EFI_ACCESS_DENIED       The SPI configuration interface is locked.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Not enough resource available to initialize the device.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, operation failed.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SPI_LOCK) (
 | 
						|
  IN EFI_SPI_PROTOCOL     * This
 | 
						|
  );
 | 
						|
/**
 | 
						|
 | 
						|
  @brief
 | 
						|
  Initializes the host controller to execute SPI commands.
 | 
						|
 | 
						|
  @param[in] This                 Pointer to the EFI_SPI_PROTOCOL instance.
 | 
						|
  @param[in] InitData             Pointer to caller-allocated buffer containing the SPI
 | 
						|
                                  interface initialization table.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Opcode initialization on the SPI host controller completed.
 | 
						|
  @retval EFI_ACCESS_DENIED       The SPI configuration interface is locked.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Not enough resource available to initialize the device.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, operation failed.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SPI_EXECUTE) (
 | 
						|
  IN     EFI_SPI_PROTOCOL   * This,
 | 
						|
  IN     UINT8              OpcodeIndex,
 | 
						|
  IN     UINT8              PrefixOpcodeIndex,
 | 
						|
  IN     BOOLEAN            DataCycle,
 | 
						|
  IN     BOOLEAN            Atomic,
 | 
						|
  IN     BOOLEAN            ShiftOut,
 | 
						|
  IN     UINTN              Address,
 | 
						|
  IN     UINT32             DataByteCount,
 | 
						|
  IN OUT UINT8              *Buffer,
 | 
						|
  IN     SPI_REGION_TYPE    SpiRegionType
 | 
						|
  );
 | 
						|
/**
 | 
						|
 | 
						|
  @brief
 | 
						|
  Execute SPI commands from the host controller.
 | 
						|
 | 
						|
  @param[in] This                 Pointer to the EFI_SPI_PROTOCOL instance.
 | 
						|
  @param[in] OpcodeIndex          Index of the command in the OpCode Menu.
 | 
						|
  @param[in] PrefixOpcodeIndex    Index of the first command to run when in an atomic cycle sequence.
 | 
						|
  @param[in] DataCycle            TRUE if the SPI cycle contains data
 | 
						|
  @param[in] Atomic               TRUE if the SPI cycle is atomic and interleave cycles are not allowed.
 | 
						|
  @param[in] ShiftOut             If DataByteCount is not zero, TRUE to shift data out and FALSE to shift data in.
 | 
						|
  @param[in] Address              In Descriptor Mode, for Descriptor Region, GbE Region, ME Region and Platform
 | 
						|
                                  Region, this value specifies the offset from the Region Base; for BIOS Region,
 | 
						|
                                  this value specifies the offset from the start of the BIOS Image. In Non
 | 
						|
                                  Descriptor Mode, this value specifies the offset from the start of the BIOS Image.
 | 
						|
                                  Please note BIOS Image size may be smaller than BIOS Region size (in Descriptor
 | 
						|
                                  Mode) or the flash size (in Non Descriptor Mode), and in this case, BIOS Image is
 | 
						|
                                  supposed to be placed at the top end of the BIOS Region (in Descriptor Mode) or
 | 
						|
                                  the flash (in Non Descriptor Mode)
 | 
						|
  @param[in] DataByteCount        Number of bytes in the data portion of the SPI cycle.
 | 
						|
  @param[in] Buffer               Pointer to caller-allocated buffer containing the dada received or sent during the SPI cycle.
 | 
						|
  @param[in] SpiRegionType        SPI Region type. Values EnumSpiRegionBios, EnumSpiRegionGbE, EnumSpiRegionMe,
 | 
						|
                                  EnumSpiRegionDescriptor, and EnumSpiRegionPlatformData are only applicable in
 | 
						|
                                  Descriptor mode. Value EnumSpiRegionAll is applicable to both Descriptor Mode
 | 
						|
                                  and Non Descriptor Mode, which indicates "SpiRegionOffset" is actually relative
 | 
						|
                                  to base of the 1st flash device (i.e., it is a Flash Linear Address).
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             Command succeed.
 | 
						|
  @retval EFI_INVALID_PARAMETER   The parameters specified are not valid.
 | 
						|
  @exception EFI_UNSUPPORTED      Command not supported.
 | 
						|
  @retval EFI_DEVICE_ERROR        Device error, command aborts abnormally.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
///
 | 
						|
/// Protocol definition
 | 
						|
///
 | 
						|
struct _EFI_SPI_PROTOCOL {
 | 
						|
  EFI_SPI_INIT    Init;
 | 
						|
  EFI_SPI_LOCK    Lock;
 | 
						|
  EFI_SPI_EXECUTE Execute;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 |