/**
* TrEEPei.h - TrEE (TCG Resource Extended Environment) PEI Module
*
* Module: TrEEPei.efi (PEI TPM Driver)
* Index: 0387
* SHA256: 398419b1597f9f8019c6bdd0a25168e09ff0e7c90129804ff02380f28215d943
* Arch: IA32 (32-bit PEI)
* Base: 0xFFE0DE28
* Size: 0x98E0
* Source: e:\hs\AmiModulePkg\TCG2\Common\TcgPei\TrEEPei.c
* e:\hs\AmiModulePkg\TCG2\CRB_lib\Tpm20CRBLib.c
*
* This module handles TPM 2.0 discovery, initialization, command transmit
* (TIS/CRB), hashing (SHA-1/SHA-256/SHA-384/SHA-512), and TCG event log
* creation during the PEI phase.
*/
#ifndef __TREEPEI_H__
#define __TREEPEI_H__
#include <UEFI.h>
#include <PEI.h>
/*============================================================================
* TPM 2.0 Constants
*============================================================================*/
#define TPM_CRB_REG_BASE 0xFED40000
#define TPM2_ST_NO_SESSIONS 0x8001
#define TPM2_ST_SESSIONS 0x8002
#define TPM2_CC_Startup 0x0144
#define TPM2_CC_SelfTest 0x0143
#define TPM2_CC_HierarchyControl 0x0122
#define TPM2_CC_PCR_Extend 0x0185
#define TPM2_CC_HashSequenceStart 0x0186
#define TPM2_CC_HashSequenceUpdate 0x0187
#define TPM2_CC_HashSequenceComplete 0x0188
#define TPM_ALG_SHA1 0x0004
#define TPM_ALG_SHA256 0x000B
#define TPM_ALG_SHA384 0x000C
#define TPM_ALG_SHA512 0x0012
#define TPM_IFACE_NONE 0
#define TPM_IFACE_TIS 1
#define TPM_IFACE_CRB 2
#define TPM_CRB_CMD_BUFFER_SIZE 0x0280
#define TPM_CRB_RSP_BUFFER_SIZE 0x0280
#define TIS_TIMEOUT_A 7500
#define TIS_TIMEOUT_B 30000
#define TIS_TIMEOUT_C 30000
#define TIS_TIMEOUT_D 30000
#define CRB_TIMEOUT_CMD_READY 15000
#define CRB_TIMEOUT_IDLE 15000
/*============================================================================
* TPM 2.0 Structures
*============================================================================*/
#pragma pack(push, 1)
typedef struct {
UINT16 Tag;
UINT32 CommandSize;
UINT32 CommandCode;
} TPM2_COMMAND_HEADER;
typedef struct {
UINT16 Tag;
UINT32 ResponseSize;
UINT32 ResponseCode;
} TPM2_RESPONSE_HEADER;
typedef struct {
TPM2_COMMAND_HEADER Header;
UINT16 StartupType;
} TPM2_STARTUP_COMMAND;
typedef struct {
TPM2_COMMAND_HEADER Header;
UINT8 FullTest;
} TPM2_SELFTEST_COMMAND;
typedef struct {
TPM2_COMMAND_HEADER Header;
UINT32 PCRIndex;
} TPM2_PCR_EXTEND_COMMAND;
typedef struct {
TPM2_COMMAND_HEADER Header;
UINT16 HashAlg;
} TPM2_HASH_SEQUENCE_START_COMMAND;
typedef struct {
UINT16 HashAlg;
UINT8 Digest[64]; /* max 64 bytes for SHA-512 */
} TPMT_HA;
#pragma pack(pop)
/*============================================================================
* TrEE PEI PPI Structure
*============================================================================*/
typedef struct _TREE_PEI_PPI TREE_PEI_PPI;
typedef
UINT32
(EFIAPI *TREE_PEI_GET_INTERFACE_INFO)(
TREE_PEI_PPI *This,
UINT32 *InterfaceVersion,
UINT32 *InterfaceFlags
);
typedef
UINT32
(EFIAPI *TREE_PEI_TRANSMIT)(
TREE_PEI_PPI *This,
UINT8 InterfaceType,
VOID *CommandBuffer,
UINT32 *CommandSize
);
typedef
UINT32
(EFIAPI *TREE_PEI_HASH_SEQUENCE_EXTEND)(
TREE_PEI_PPI *This,
UINT32 Operation,
UINT64 *LogLocation,
UINT32 *TcgLog,
UINT8 *OutInterfaceType
);
struct _TREE_PEI_PPI {
UINT64 Signature;
TREE_PEI_GET_INTERFACE_INFO GetInterfaceInfo;
TREE_PEI_TRANSMIT Transmit;
TREE_PEI_HASH_SEQUENCE_EXTEND HashSequenceExtend;
};
/*============================================================================
* Module Global Variables
*============================================================================*/
extern volatile UINT8 InterfaceType; /* 0xFFE174E4 */
extern volatile UINT32 dword_FFE174E0; /* TCG log HOB pointer */
extern volatile UINT64 qword_FFE174E8; /* TCG log HOB base */
extern UINT8 byte_FFE174DC; /* TPM interface type byte */
/*============================================================================
* Function Declarations
*============================================================================*/
/* --- Module Entry --- */
EFI_STATUS
EFIAPI
_ModuleEntryPoint(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);
/* --- PEI Entry & Init --- */
INT32
TrEEPeiEntry(
INT32 SystemTable,
INT32 *PeiServices
);
INT32
TrEEPeiInstallPpi(
INT32 *PpiDescriptor
);
INT32
ProcessTpmSupportDisabled(
VOID *This
);
/* --- TPM Device Detection --- */
UINT8
Tpm20IsSupportedVidDid(
VOID
);
UINT8
Tpm20IsPresent(
VOID
);
UINT8
Tpm20GetInterfaceType(
VOID
);
UINT8
Tpm20GetDeviceType(
VOID
);
UINT8
Tpm20ProbeMemory(
VOID
);
/* --- Interface Selection --- */
INT32
SelectAndLockInterface(
INT32 SystemTable,
UINT8 DesiredInterface
);
INT32
Tpm20GetDeviceInfo(
INT32 a1,
UINT32 *Info1,
UINT32 *Info2
);
/* --- TrEE PPI --- */
INT32
TrEEGetInterfaceInfo(
TREE_PEI_PPI *This,
UINT32 *InterfaceVersion,
UINT32 *InterfaceFlags
);
/* --- TPM Command Init --- */
INT32
Tpm20CmdInit(
UINT32 CommandCode,
INT32 a2,
UINT8 *ResponseBuf,
UINT8 *WorkBuf
);
/* --- CRB Transmit --- */
UINT32
TrEECRBPeiTransmit(
INT32 a1,
UINT8 a2,
INT32 a3,
UINT32 *a4
);
INT32
TrEECRBTransmitInner(
INT32 a1,
UINT8 *CmdBuffer,
UINT32 CmdSize,
UINT8 a4,
INT32 a5
);
INT32
TrEECRBTransfer(
INT32 a1,
INT32 a2,
INT32 a3,
INT32 a4,
INT32 a5,
INT32 a6,
INT32 *Src,
UINT8 *ResponseBuf
);
/* --- CRB Memory Access --- */
UINT8
CrbMemoryBlockRead(
UINT8 *Dst,
INT32 Size,
UINT8 *Src
);
UINT8
CrbMemoryBlockWrite(
INT32 Dst,
INT32 Size,
UINT8 *Src
);
UINT8
CrbGetIdleFlag(
VOID
);
UINT8
CrbCheckStatus(
UINT32 *CrbStatus
);
INT32
CrbWaitCmdReady(
VOID *CrbRegs
);
INT32
CrbWaitIdle(
VOID *CrbRegs
);
UINT8
CrbGetState(
VOID *CrbRegs
);
INT32
CrbSetStateCmdReady(
VOID *CrbRegs
);
INT32
CrbSetStateIdle(
VOID *CrbRegs
);
INT32
CrbSendCommand(
UINT8 *CmdBuffer,
INT32 CmdSize
);
INT32
CrbReceiveResponse(
UINT8 *ResponseBuf,
INT32 *ResponseSize
);
/* --- Transmit Layer --- */
INT32
TrEECRBTransmit(
INT32 a1,
INT32 n12,
INT16 *CmdBuffer,
INT32 n10,
UINT8 *ResponseBuf
);
INT32
TrEETisTransmit(
INT32 a1,
INT32 n12,
INT16 *CmdBuffer,
INT32 n10,
UINT8 *ResponseBuf
);
INT32
TrEETransmitTisOrCrb(
INT32 a1,
INT32 a2,
UINT8 InterfaceType,
UINT8 *Buffer,
INT32 *Size
);
INT32
TrEETransmitPrep(
INT32 a1,
INT32 a2,
INT32 a3,
INT32 a4,
INT32 *a5
);
INT32
TrEEParseResponse(
INT32 a1,
INT32 a2,
INT32 a3,
INT64 a4,
INT32 a5,
INT32 a6,
INT32 a7
);
/* --- TIS Transport --- */
INT32
Tpm20TisTransmit(
UINT8 *CmdBuffer,
UINT32 CmdSize,
UINT32 a3,
INT32 a4,
INT32 a5
);
INT32
Tpm20TisWriteCmd(
UINT8 *CmdBuffer,
UINT8 *Buffer,
INT32 Size,
UINT8 a4
);
UINT32
Tpm20TisReadResponse(
INT32 a1,
UINT8 *ResponseBuf,
UINT32 *ResponseSize
);
UINT32
Tpm20TisReadFifo(
UINT8 *Dest,
UINT32 Size
);
INT32
Tpm20TisWaitReady(
VOID
);
INT32
Tpm20CmdReadyWait(
VOID
);
INT32
Tpm20BurstCountWait(
VOID
);
INT32
Tpm20TisTimeoutWait(
INT32 Mode
);
/* --- Command Execution --- */
INT32
TrEEExecuteCmd(
INT16 *CmdBuffer,
INT32 CmdSize,
UINT8 *ResponseBuf,
INT32 *ResponseSize
);
/* --- Command Building --- */
INT32
TrEESerializeCmdHeader(
INT32 a1,
INT32 a2
);
INT32
TrEEBuildExtendCmd(
INT32 a1,
UINT32 a2,
UINT32 *Digest
);
/* --- Hash Sequence --- */
INT32
TrEEHashSequenceExecute(
UINT8 *Data,
UINT32 DataSize,
UINT8 *Digest
);
INT32
TrEESequenceUpdate(
INT32 a1,
UINT16 *Count
);
INT32
TrEESequenceComplete(
INT32 a1,
UINT8 *HashOutput
);
UINT32
TrEEHashSequenceExtend(
INT32 a1,
INT32 a2,
UINT64 *LogLocation,
UINT32 *TcgLog,
UINT8 *OutInterfaceType
);
/* --- TPM2 Protocol --- */
INT32
Tpm2Startup(
VOID *This
);
INT32
Tpm2SelfTest(
VOID *This
);
INT32
Tpm2HierarchyControl(
INT32 a1,
INT32 a2,
UINT32 a3
);
INT32
Tpm2ExtendPcr(
VOID *This,
UINT32 PCRIndex,
UINT32 *DigestList,
UINT8 InterfaceType
);
/* --- Hash/Log/Extend --- */
INT32
Tpm2HashLogExtendPcr(
VOID *This,
UINT32 PCRIndex,
UINT8 InterfaceType
);
/* --- HOB --- */
INT32
TrEECreateTcgHob(
INT32 This,
UINT32 *HobAddr,
INT32 HobSize,
INT32 *OutHob
);
/* --- Hashing --- */
VOID
Sha1Init(
VOID *Context
);
VOID
Sha1Update(
VOID *Context,
const UINT8 *Data,
UINT32 DataSize
);
VOID
Sha1Final(
VOID *Context,
UINT8 *Digest
);
VOID
Sha256Hash(
INT32 Data,
UINT16 Count
);
INT32
Sha1UpdateInternal(
INT32 a1,
UINT8 *Src,
UINT32 Size
);
INT32
Sha1FinalInternal(
VOID *Context,
UINT8 *Digest
);
INT32
Sha256FinalInternal(
INT32 a1,
UINT8 *Digest
);
INT32
Sha256HashAll(
UINT32 *Size,
UINT8 *Digest
);
INT32
Sha384UpdateInternal(
UINT8 *a1,
UINT8 *Src,
UINT32 Size
);
INT32
Sha384FinalInternal(
INT32 a1,
INT32 a2
);
INT32
Sha1HashAllInternal(
UINT32 Size,
UINT8 *Digest
);
INT32
Sha384HashAllInternal(
INT32 a1,
UINT32 Size,
UINT8 *Digest
);
INT32
Sha512HashAllInternal(
INT32 a1,
UINT32 Size,
UINT8 *Digest
);
/* --- Hash Dispatch --- */
INT32
Tpm20HashAllSha1(
VOID *Context
);
INT32
Tpm20HashAllSha256(
VOID *Context
);
INT32
Tpm20HashAllSha384(
VOID *Context
);
/* --- Digest Helpers --- */
UINT32
Tpm20MapHashAlg(
UINT8 *HashAlg,
UINT32 MapType
);
UINT32
Tpm20GetHashFromDigest(
UINT8 *Dest,
UINT32 Source,
UINT32 Size
);
INT32
Tpm20CopyDigest(
INT32 a1,
UINT32 a2
);
/* --- PPI Helpers --- */
INT32
Tpm20GetPpi(
VOID *Context
);
INT32
Tpm20NotifyPpi(
INT32 Context
);
INT32
GetPpiDescriptor(
VOID *Guid,
VOID **Descriptor
);
/* --- Global State --- */
UINT8
GetGlobalState(
VOID
);
VOID
SetGlobalState(
UINT8 State
);
UINT32
GetGlobalState2(
VOID
);
/* --- Progress / Debug --- */
VOID
Tpm20ProgressLog(
UINT32 Phase,
UINT32 EventId
);
VOID
DebugPrint(
UINT32 ErrorLevel,
const CHAR8 *Format,
...
);
VOID
DebugAssert(
INT32 FileName,
INT32 LineNumber,
INT32 Description
);
/* --- Memory --- */
INT32
CopyMemChecked(
UINT8 *Dst,
const UINT8 *Src,
UINT32 Count
);
INT32
AllocatePool(
VOID *Buffer,
UINT32 Size
);
INT32
ReallocatePool(
VOID *OldBuffer,
UINT32 OldSize,
UINT32 NewSize
);
VOID
GetBootServicesTable(
VOID
);
INT32
GetDebugLib(
VOID
);
/* --- Utilities --- */
UINT32
SwapBytes32(
UINT32 Value
);
UINT16
SwapBytes16(
UINT16 Value
);
UINT8
ReadUnaligned8(
UINT8 *Pointer
);
VOID
WriteUnaligned8(
UINT8 *Pointer,
UINT8 Value
);
UINT16
ReadUnaligned16(
VOID *Pointer
);
VOID
WriteUnaligned32(
VOID *Pointer,
UINT32 Value
);
UINT64
RightRotate64(
UINT64 Value,
UINT8 Shift
);
CHAR8
HIBYTE_w(
UINT16 Value
);
INT32
TpmReturnUnsupported(
VOID
);
#endif /* __TREEPEI_H__ */