diff options
Diffstat (limited to 'Board/EM/TCG2/Common/AmiTcgPlatformDxeLib.c')
-rw-r--r-- | Board/EM/TCG2/Common/AmiTcgPlatformDxeLib.c | 1275 |
1 files changed, 1275 insertions, 0 deletions
diff --git a/Board/EM/TCG2/Common/AmiTcgPlatformDxeLib.c b/Board/EM/TCG2/Common/AmiTcgPlatformDxeLib.c new file mode 100644 index 0000000..4ac3182 --- /dev/null +++ b/Board/EM/TCG2/Common/AmiTcgPlatformDxeLib.c @@ -0,0 +1,1275 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/TCG2/Common/AmiTcgPlatform/AmiTcgPlatformDxe/AmiTcgPlatformDxeLib.c 2 6/09/14 4:58p Fredericko $ +// +// $Revision: 2 $ +// +// $Date: 6/09/14 4:58p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/TCG2/Common/AmiTcgPlatform/AmiTcgPlatformDxe/AmiTcgPlatformDxeLib.c $ +// +// 2 6/09/14 4:58p Fredericko +// Changes for SetVariable vulnerability during Runtime +// +// 1 4/21/14 2:17p Fredericko +// +// 2 3/14/14 3:24p Fredericko +// +// 1 10/08/13 12:04p Fredericko +// Initial Check-In for Tpm-Next module +// +// 1 7/10/13 5:55p Fredericko +// [TAG] EIP120969 +// [Category] New Feature +// [Description] TCG (TPM20) +// +// 7 10/30/12 10:47a Fredericko +// +// 6 5/20/12 2:14p Fredericko +// +// 5 9/27/11 10:33p Fredericko +// [TAG] EIP67286 +// [Category] Improvement +// [Description] changes for Tcg Setup policy +// [Files] Tcg.sdl +// TcgPei.cif +// TcgPei.mak +// xtcgPei.c +// xTcgPeiAfterMem.c +// TcgPeiAfterMem.mak +// TcgDxe.cif +// TcgDxe.mak +// xTcgDxe.c +// AmiTcgPlatformPeilib.c +// AmiTcgPlatformDxelib.c +// +// 4 7/25/11 3:46a Fredericko +// [TAG] EIP65177 +// [Category] Spec Update +// [Severity] Minor +// [Description] Tcg Ppi Spec ver 1.2 update +// +// 3 3/29/11 5:52p Fredericko +// Changes for core 464 and ACPI tables support +// +// 2 3/29/11 2:28p Fredericko +// [TAG] EIP 54642 +// [Category] Improvement +// [Description] 1. Checkin Files related to TCG function override +// 2. Include TCM and TPM auto detection +// [Files] Affects all TCG files +// +// +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: AmiTcgPlatformDxeLib.c +// +// Description: Function file for AmiTcgPlatformDxe library +// +//<AMI_FHDR_END> +//************************************************************************* +#include "AmiTcgPlatformDxeLib.h" + + +EFI_GUID TcgBoardEfiGlobalVariableGuid = TCG_EFI_GLOBAL_VARIABLE_GUID; +EFI_GUID AmitcgefiOsVariableGuid = AMI_TCG_EFI_OS_VARIABLE_GUID; + + +EFI_GUID gSetupGuid = SETUP_GUID; +EFI_GUID gTcgAcpiSupportGuid= EFI_ACPI_SUPPORT_GUID; +EFI_GUID gEfiAmiboardTcgWakeEventDataHobGuid = EFI_TCG_WAKE_EVENT_DATA_HOB_GUID; +EFI_GUID gEfiAmiboardHobListGuid = TCG_EFI_HOB_LIST_GUID; + +static UINT8 TcgAMLDATA; + +EFI_SMM_SYSTEM_TABLE *mSmst; +EFI_SMM_BASE_PROTOCOL *pSmmBase; + +EFI_GUID gDsdtGuid = DSDT_GUID; + +EFI_STATUS getSetupData ( + SETUP_DATA** ppsd, + UINT32 * pattr, + UINTN * psz ); + + + +#define GET_HOB_TYPE( Hob ) ((Hob).Header->HobType) +#define GET_HOB_LENGTH( Hob ) ((Hob).Header->HobLength) +#define GET_NEXT_HOB( Hob ) ((Hob).Raw + GET_HOB_LENGTH( Hob )) +#define END_OF_HOB_LIST( Hob ) (GET_HOB_TYPE( Hob ) == \ + EFI_HOB_TYPE_END_OF_HOB_LIST) +extern +BOOLEAN +__stdcall AutoSupportType (); + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: GetHob +// +// Description: Find instance of a HOB type in a HOB list +// +// +// Input: IN UINT16 Type, +// IN VOID *HobStart +// +// Output: VOID* +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +VOID* GetHob( + IN UINT16 Type, + IN VOID *HobStart ) +{ + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = HobStart; + + // + // Return input if not found + // + if ( HobStart == NULL ) + { + return HobStart; + } + + // + // Parse the HOB list, stop if end of list or matching type found. + // + while ( !END_OF_HOB_LIST( Hob )) + { + if ( Hob.Header->HobType == Type ) + { + break; + } + + Hob.Raw = GET_NEXT_HOB( Hob ); + } + + // + // Return input if not found + // + if ( END_OF_HOB_LIST( Hob )) + { + return HobStart; + } + + return (VOID*)(Hob.Raw); +} + + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: CompareGuid +// +// Description: Compares two input GUIDs +// +// +// Input: IN EFI_GUID *G1, +// IN EFI_GUID *G2 +// +// Output: BOOLEAN +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +BOOLEAN CompareGuid( + IN EFI_GUID *G1, + IN EFI_GUID *G2 ) +{ + UINT32 *p1 = (UINT32*)G1, *p2 = (UINT32*)G2; + UINTN i; + + for ( i = 0; i < 4; ++i ) + { + if ( p1[i] != p2[i] ) + { + return FALSE; + } + } + return TRUE; + ; +} + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: GetNextGuidHob +// +// Description: Find GUID HOB +// +// Input: HobStart A pointer to the start hob. +// Guid A pointer to a guid. +// Output: +// Buffer A pointer to the buffer. +// BufferSize Buffer size. +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +EFI_STATUS GetNextGuidHob( + IN OUT VOID **HobStart, + IN EFI_GUID * Guid, + OUT VOID **Buffer, + OUT UINTN *BufferSize OPTIONAL ) +{ + EFI_STATUS Status; + EFI_PEI_HOB_POINTERS GuidHob; + + if ( Buffer == NULL ) + { + return EFI_INVALID_PARAMETER; + } + + for ( Status = EFI_NOT_FOUND; EFI_ERROR( Status );) + { + GuidHob.Raw = *HobStart; + + if ( END_OF_HOB_LIST( GuidHob )) + { + return EFI_NOT_FOUND; + } + + GuidHob.Raw = GetHob( EFI_HOB_TYPE_GUID_EXTENSION, *HobStart ); + + if ( GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION ) + { + if ( CompareGuid( Guid, &GuidHob.Guid->Name )) + { + Status = EFI_SUCCESS; + *Buffer = (VOID*)((UINT8*)(&GuidHob.Guid->Name) + + sizeof (EFI_GUID)); + + if ( BufferSize != NULL ) + { + *BufferSize = GuidHob.Header->HobLength + - sizeof (EFI_HOB_GUID_TYPE); + } + } + } + + *HobStart = GET_NEXT_HOB( GuidHob ); + } + + return Status; +} + + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: LocateATcgHob +// +// Description: Finds a Tcg HOB +// +// +// Input: IN UINTN NoTableEntries, +// IN EFI_CONFIGURATION_TABLE *ConfigTable, +// IN EFI_GUID *HOB_guid +// +// Output: VOID* +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +VOID* LocateATcgHob( + IN UINTN NoTableEntries, + IN EFI_CONFIGURATION_TABLE *ConfigTable, + IN EFI_GUID *HOB_guid ) +{ + VOID *HobStart; + VOID *PtrHob; + + while ( NoTableEntries > 0 ) + { + NoTableEntries--; + + if ((!MemCmp( + &ConfigTable[NoTableEntries].VendorGuid, + &gEfiAmiboardHobListGuid, sizeof(EFI_GUID) + ))) + { + HobStart = ConfigTable[NoTableEntries].VendorTable; + + if ( !EFI_ERROR( + GetNextGuidHob( &HobStart, HOB_guid, &PtrHob, NULL ) + )) + { + return PtrHob; + } + } + } + return NULL; +} + + + + +//******************************************************************************* +//<AMI_PHDR_START> +// +// Procedure: GetTcgWakeEventType +// +// Description: Reads and Reports the source of the wake-up event. +// +// Input: IN OUT UINT8 *pWake - output parameter returns the indication of the +// type of the wakup source: +// one of the following: +// SMBIOS_WAKEUP_TYPE_OTHERS +// SMBIOS_WAKEUP_TYPE_UNKNOWN +// SMBIOS_WAKEUP_TYPE_APM_TIMER +// SMBIOS_WAKEUP_TYPE_MODEM_RING +// SMBIOS_WAKEUP_TYPE_LAN_REMOTE +// SMBIOS_WAKEUP_TYPE_POWER_SWITCH +// SMBIOS_WAKEUP_TYPE_PCI_PME +// SMBIOS_WAKEUP_TYPE_AC_POWER_RESTORED +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//****************************************************************************** +EFI_STATUS GetTcgWakeEventType( + IN OUT UINT8 *pWake ) +{ + EFI_BOOT_MODE *BootMode = NULL; + UINTN NoTableEntries; + EFI_CONFIGURATION_TABLE *ConfigTable; + VOID *HobStart; + + *pWake = SMBIOS_WAKEUP_TYPE_UNKNOWN; + + NoTableEntries = pST->NumberOfTableEntries, + ConfigTable = pST->ConfigurationTable; + + while ( NoTableEntries > 0 ) + { + NoTableEntries--; + + if ( !MemCmp( + &ConfigTable[NoTableEntries].VendorGuid, + &gEfiAmiboardHobListGuid, sizeof(EFI_GUID) + )) + { + HobStart = ConfigTable[NoTableEntries].VendorTable; + + if ( !EFI_ERROR( + GetNextGuidHob( &HobStart, + &gEfiAmiboardTcgWakeEventDataHobGuid, + &BootMode, NULL ) + )) + { + break; + } + } + } + + if ( BootMode != NULL ) + { + if ( *BootMode == BOOT_ON_S4_RESUME || *BootMode == BOOT_ON_S5_RESUME + || *BootMode == BOOT_WITH_FULL_CONFIGURATION ) + { + *pWake = (UINT8)SMBIOS_WAKEUP_TYPE_POWER_SWITCH; + } + } + return EFI_SUCCESS; +} + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgGetDSDTTable +// +// Description: Gets Acpi DSDT table +// +// +// Input: +// +// Output: VOID * +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +VOID* TcgGetDSDTTable(EFI_ACPI_SUPPORT_PROTOCOL * mTcgAcpiSupport ) +{ + INTN Index; + PACPI_HDR Table; + UINTN Handle; + EFI_STATUS Status; + EFI_ACPI_TABLE_VERSION Version; + + + if(mTcgAcpiSupport == NULL)return NULL; + + for ( Index = 0;; ++Index ) + { + Status = mTcgAcpiSupport->GetAcpiTable( + mTcgAcpiSupport, + Index, + &Table, + &Version, + &Handle + ); + + if ( EFI_ERROR( Status )) + { + return 0; + } + + if (((PACPI_HDR)Table)->Signature == FACP_SIG ) + { + return (VOID*)(UINTN)((PFACP32)Table )->DSDT; + } + } +} + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgConvertAslName +// +// Description: converts String a to ASL string NAME +// +// +// Input: IN UINT8 *AslName +// +// Output: UINT32 +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +UINT32 TcgConvertAslName( + IN UINT8 *AslName ) +{ + AML_NAME_SEG n; + //Limit to 4 characters + UINTN l = Strlen( AslName ); + + //------------------------- + n.NAME = 0x5F5F5F5F; + MemCpy( &n.Name[0], AslName, l ); + return n.NAME; +} + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgFindAslObjectName +// +// Description: converts String a to ASL string NAME +// +// +// Input: IN UINT8 *Start, +// IN UINT8 *ObjName, +// IN UINTN Len +// +// Output: VOID * +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +VOID* TcgFindAslObjectName( + IN UINT8 *Start, + IN UINT8 *ObjName, + IN UINTN Len ) +{ + unsigned int i; + UINT8 *p; + AML_NAME_SEG *obj, nm; + + //------------------------------ + nm.NAME = TcgConvertAslName( ObjName ); + + p = Start; + + for ( i = 0; i < Len; i++ ) + { + obj = (AML_NAME_SEG*)(&p[i]); + + if ( obj->NAME != nm.NAME ) + { + continue; + } + return &p[i]; + } + return NULL; +} + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgCheckOpCode +// +// Description: converts String a to ASL string NAME +// +// +// Input: IN UINT8 *NameStart, +// IN UINT8 OpCode, +// IN UINT8 ExtOpCode, +// IN OUT ASL_OBJ_INFO *ObjInfo +// +// Output: BOOLEAN +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +BOOLEAN TcgCheckOpCode( + IN UINT8 *NameStart, + IN UINT8 OpCode, + IN UINT8 ExtOpCode, + IN OUT ASL_OBJ_INFO *ObjInfo ) +{ + UINT8 *p; + + //--------------------- + //Maximum number of bytes in PackageLength is 4 + if ((*(NameStart - 1)) == TCGAML_PR_ROOT || (*(NameStart - 1)) == + TCGAML_PR_PARENT ) + { + NameStart--; + } + + //if we Looking For ASL Name Object its a special case. + if ( OpCode == TCGAML_OP_NAME && !ExtOpCode ) + { + p = NameStart - 1; + + if ( *p == OpCode ) + { + ObjInfo->Object = p; + ObjInfo->ObjName = NameStart; + ObjInfo->Length = 0; + return TRUE; + } + return FALSE; + } + + //if we Looking For ASL Name Object its a special case. + if ( OpCode == TCGAML_OP_OPREG && ExtOpCode ) + { + p = NameStart - 2; + + if ( *p == ExtOpCode && *(p + 1) == OpCode ) + { + ObjInfo->Object = p; + ObjInfo->ObjName = NameStart; + ObjInfo->Length = 0; + return TRUE; + } + return FALSE; + } + return FALSE; +} + + +EFI_STATUS TcgSetVariableWithNewAttributes( + IN CHAR16 *Name, IN EFI_GUID *Guid, IN UINT32 Attributes, + IN UINTN DataSize, IN VOID *Data +) +{ + EFI_STATUS Status; + + Status = pRS->SetVariable(Name, Guid, Attributes, DataSize, Data); + if (!EFI_ERROR(Status) || Status != EFI_INVALID_PARAMETER) return Status; + + Status = pRS->SetVariable(Name, Guid, 0, 0, NULL); + if (EFI_ERROR(Status)) return Status; + + return pRS->SetVariable(Name, Guid, Attributes, DataSize, Data); +} + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgGetAslObj +// +// Description: converts String a to ASL string NAME +// +// +// Input: IN UINT8 *Start, +// IN UINTN Length, +// IN UINT8 *Name, +// IN ASL_OBJ_TYPE ObjType, +// IN ASL_OBJ_INFO *ObjInfo +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +EFI_STATUS TcgGetAslObj( + IN UINT8 *Start, + IN UINTN Length, + IN UINT8 *Name, + IN ASL_OBJ_TYPE ObjType, + IN ASL_OBJ_INFO *ObjInfo ) +{ + UINT8 *pn, *s, eop, op; + UINTN l, i; + BOOLEAN objfound = FALSE; + + s = Start; + l = Length; + + while ( !objfound ) + { + pn = TcgFindAslObjectName( s, Name, l ); + + if ( !pn ) + { + return EFI_NOT_FOUND; + } + + //If we found the name let's check if it is the Object we are looking for + //it could be just object referance, or field definition inside the object, + //or double name, or multiple name definition we must filter such situations + // and make sure we have got the actual object but not its reference instance + switch ( ObjType ) + { + case otScope: + i = 0; + eop = 0; + op = TCGAML_OP_SCOPE; + break; + case otName: + i = 0; + eop = 0; + op = TCGAML_OP_NAME; + break; + case otProc: + i = 6; + eop = TCGAML_PR_EXTOP; + op = TCGAML_OP_PROC; + break; + case otTermal: + i = 0; + eop = TCGAML_PR_EXTOP; + op = TCGAML_OP_THERMAL; + break; + case otDevice: + i = 0; + eop = TCGAML_PR_EXTOP; + op = TCGAML_OP_DEVICE; + break; + case otMethod: + i = 1; + eop = 0; + op = TCGAML_OP_METHOD; + break; + case otPwrRes: + i = 3; + eop = TCGAML_PR_EXTOP; + op = TCGAML_OP_PWRRES; + break; + case otOpReg: + i = 0; + eop = TCGAML_PR_EXTOP; + op = TCGAML_OP_OPREG; + break; + + default: return EFI_NOT_FOUND; + } //switch + + objfound = TcgCheckOpCode( pn, op, eop, ObjInfo ); + + if ( !objfound ) + { + l -= (UINTN)( pn - s ) - 4; + s = pn + 4; + continue; + } + ObjInfo->ObjType = ObjType; + ObjInfo->DataStart = pn + i + 4; + + return EFI_SUCCESS; + } + + return EFI_NOT_FOUND; +} + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: LocateACPITableProtocol +// +// Description: Locates ACPI Table Protocol +// +// +// Input: IN EFI_GUID *Protocol, +// OUT VOID **Instance +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +#if !defined(AmiBoardInfo_SUPPORT) || (AmiBoardInfo_SUPPORT==0) +EFI_STATUS LocateACPITableProtocol( + IN EFI_GUID *Protocol, + OUT VOID **Instance ) +{ + EFI_STATUS Status; + EFI_HANDLE *HandleBuffer; + UINTN NumberOfHandles; + EFI_FV_FILETYPE FileType; + UINT32 FvStatus = 0; + EFI_FV_FILE_ATTRIBUTES Attributes; + UINTN Size; + UINTN i; + + + Status = pBS->LocateHandleBuffer( ByProtocol, + Protocol, + NULL, + &NumberOfHandles, + &HandleBuffer ); + + if ( EFI_ERROR( Status )) + { + return Status; + } + + + for ( i = 0; i < NumberOfHandles; i++ ) + { + Status = pBS->HandleProtocol( HandleBuffer[i], Protocol, Instance ); + + if ( EFI_ERROR( Status )) + { + return Status; + } + + Status = ((EFI_FIRMWARE_VOLUME_PROTOCOL*)(*Instance))->ReadFile( + *Instance, + & + gDsdtGuid, + NULL, + &Size, + &FileType, + &Attributes, + &FvStatus ); + + if ( Status == EFI_SUCCESS ) + { + break; + } + } + pBS->FreePool( HandleBuffer ); + return Status; +} +#endif + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: read_PPI_request +// +// Description: Reads and returns TCG PPI requests Value +// +// +// Input: +// +// Output: UINT8 +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +UINT8 ReadPpiRequest( ) +{ + UINTN Size = sizeof(AMI_PPI_NV_VAR); + AMI_PPI_NV_VAR Temp; + EFI_STATUS Status; + + Status = pRS->GetVariable( L"AMITCGPPIVAR", \ + &AmitcgefiOsVariableGuid, \ + NULL, \ + &Size, \ + &Temp ); + + if(Status == EFI_NOT_FOUND) + { + Temp.RQST = 0; + Temp.RCNT = 0; + Temp.ERROR = 0; + Temp.Flag = 0; + Temp.AmiMisc = 0; + + Status = TcgSetVariableWithNewAttributes(L"AMITCGPPIVAR", &AmitcgefiOsVariableGuid, \ + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\ + Size, &Temp ); + } + + return Temp.RQST; +} + + + + + +//**************************************************************************************** +//<AMI_PHDR_START> +// +// Procedure: write_PPI_result +// +// Description: Updates TCG PPI variable in NVRAM +// +// +// Input: IN UINT8 last_op, +// IN UINT16 status +// +// Output: VOID +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//**************************************************************************************** +void WritePpiResult( + IN UINT8 last_op, + IN UINT16 status ) +{ + UINTN Size = sizeof(AMI_PPI_NV_VAR); + AMI_PPI_NV_VAR Temp; + EFI_STATUS Status; + UINT8 Manip = 0; + + Status = pRS->GetVariable( L"AMITCGPPIVAR", \ + &AmitcgefiOsVariableGuid, \ + NULL, \ + &Size, \ + &Temp ); + + //now set variable to data + Temp.RQST = Manip; + Manip = (UINT8)( status & 0xFFFF ); + Temp.ERROR = Manip; + + if(status>0xFF && status<0xFFFF) + { + Temp.AmiMisc = (UINT8)(status >> 8); + }else{ + Temp.AmiMisc = 0; + } + + if ( EFI_ERROR( Status )) + { + TRACE((TRACE_ALWAYS, "Error Setting Return value\n")); + return; + } + + Status = TcgSetVariableWithNewAttributes(L"AMITCGPPIVAR", &AmitcgefiOsVariableGuid, \ + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\ + Size, &Temp ); +} + + + +//**************************************************************************************** +//<AMI_PHDR_START> +// +// Procedure: getSetupData +// +// Description: Retrieved SETUP_DATA structure from NVRAM +// +// +// Input: IN OUT SETUP_DATA** ppsd, +// IN UINT32* pattr, +// IN UINTN* psz +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//**************************************************************************************** +EFI_STATUS getSetupData( + IN OUT SETUP_DATA** ppsd, + IN UINT32 * pattr, + IN UINTN * psz ) +{ + EFI_STATUS Status; + UINTN sz = 0; + + *ppsd = NULL; + Status = pRS->GetVariable( L"Setup", &gSetupGuid, pattr, &sz, *ppsd ); + + if ( !EFI_ERROR( Status )) + { + return Status; + } + + if ( Status == EFI_BUFFER_TOO_SMALL ) + { + Status = pBS->AllocatePool( EfiBootServicesData, sz, ppsd ); + + if ( !(*ppsd)) + { + return EFI_OUT_OF_RESOURCES; + } + Status = pRS->GetVariable( L"Setup", &gSetupGuid, pattr, &sz, *ppsd ); + } + + if ( psz != NULL ) + { + *psz = sz; + } + return Status; +} + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: GetDsdt +// +// Description: Locates ACPI Table Protocol +// +// +// Input: IN OUT mem_in *dsdt +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +#if !defined(AmiBoardInfo_SUPPORT) || (AmiBoardInfo_SUPPORT==0) +EFI_STATUS GetDsdt( + IN OUT mem_in *dsdt ) +{ + EFI_FIRMWARE_VOLUME_PROTOCOL *fv; + EFI_STATUS Status; + UINT32 FvStatus; + + //--------------------------------------------- + Status = pBS->LocateProtocol( &gEfiFirmwareVolumeProtocolGuid, NULL, &fv ); + Status = LocateACPITableProtocol( &gEfiFirmwareVolumeProtocolGuid, &fv ); + + if ( EFI_ERROR( Status )) + { + return EFI_ABORTED; + } + + dsdt->address = 0; + Status + = fv->ReadSection( fv, + &gDsdtGuid, + EFI_SECTION_RAW, + 0, + (VOID**)&dsdt->address, + &((UINTN)dsdt->size), + &FvStatus ); + + + if ( EFI_ERROR( Status )) + { + dsdt->address = 0; + dsdt->datat = 3; + dsdt->size = 0; + } + else { + dsdt->datat = 2; + } + + + return EFI_SUCCESS; +} +#endif + + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgUpdateAslNameObject +// +// Description: Locates ACPI Table Protocol +// +// +// Input: IN PACPI_HDR PDsdt, +// IN UINT8 *ObjName, +// IN UINT64 Value +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +EFI_STATUS TcgUpdateAslNameObject( + IN PACPI_HDR PDsdt, + IN UINT8 *ObjName, + IN UINT64 Value ) +{ + EFI_STATUS Status; + ASL_OBJ_INFO obj; + UINT32 Length; + UINT8 *ptr; + + + Length = PDsdt->Length - sizeof(ACPI_HDR); + ptr = (UINT8*)PDsdt + sizeof(ACPI_HDR); + + Status = TcgGetAslObj( ptr, Length, ObjName, otName, &obj ); + + + switch ( *((UINT8*)obj.DataStart)) + { + case TCGAML_PR_BYTE: { + UINT8 *p = (UINT8*)((UINT8*)obj.DataStart + 1); + //---------------------------------- + *p = (UINT8)Value; + } break; + + case TCGAML_PR_WORD: { + UINT16 *p = (UINT16*)((UINT8*)obj.DataStart + 1); + //---------------------------------- + *p = (UINT16)Value; + } break; + + case TCGAML_PR_DWORD: { + UINT32 *p = (UINT32*)((UINT8*)obj.DataStart + 1); + //---------------------------------- + *p = (UINT32)Value; + } break; + + case TCGAML_PR_QWORD: { + UINT64 *p = (UINT64*)((UINT8*)obj.DataStart + 1); + //---------------------------------- + *p = (UINT64)Value; + } break; + + case TCGAML_ZERO_OP: case TCGAML_ONE_OP: { + if ((Value == 0) || (Value == 1)) + { + UINT8 *p = (UINT8*)((UINT8*)obj.DataStart); + *p = (UINT8)Value; + } + else { + return EFI_INVALID_PARAMETER; + } + } break; + default: { + return EFI_INVALID_PARAMETER; + } + } + return EFI_SUCCESS; +} + + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: TcgUpdateAslObj +// +// Description: Updates TPM acpi variable for TPM support +// +// +// Input: IN EFI_EVENT ev, +// IN VOID *ctx, +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +EFI_STATUS TcgUpdateAslObj( + IN EFI_EVENT ev, + IN VOID *ctx ) +{ + EFI_STATUS Status; + PACPI_HDR DsdtTable; + EFI_ACPI_SUPPORT_PROTOCOL *mTcgAcpiSupport; + + Status = pBS->LocateProtocol( &gTcgAcpiSupportGuid, NULL, &mTcgAcpiSupport ); + + if ( EFI_ERROR( Status )) + { + TRACE((TRACE_ALWAYS, "TcgBoard_c:Unable to locate AcpiSupport\n")); + return Status; + } + + DsdtTable = TcgGetDSDTTable(mTcgAcpiSupport); + + if ( !DsdtTable ) + { + TRACE((TRACE_ALWAYS, "TcgBoard.c::DSDT Table not found.\n")); + return EFI_NOT_FOUND; + } + + Status = TcgUpdateAslNameObject( DsdtTable, "TPMF", TcgAMLDATA ); + + //also update TCM flags + if(AutoSupportType()){ + TcgAMLDATA = 0x1; + Status = TcgUpdateAslNameObject( DsdtTable, "TCMF", TcgAMLDATA ); + }else{ + TcgAMLDATA = 0x0; + Status = TcgUpdateAslNameObject( DsdtTable, "TCMF", TcgAMLDATA ); + } + + TRACE((TRACE_ALWAYS, "TcgBoard_c:TCGUpdateAslNameOpject_DONE\n")); + + return Status; +} + + + + + +//********************************************************************** +//<AMI_PHDR_START> +// +// Procedure: UpDateASL +// +// Description: Update TCG ASL Support in ACPI base +// +// +// Input: IN UINT8 TcgSupport +// +// Output: EFI_STATUS +// +// Modified: +// +// Referrals: +// +// Notes: +//<AMI_PHDR_END> +//********************************************************************** +EFI_STATUS UpDateASL( + IN UINT8 TcgSupport ) +{ + EFI_EVENT ev; + static VOID *reg; + EFI_STATUS Status; + VOID *ctx; + EFI_ACPI_SUPPORT_PROTOCOL *mTcgAcpiSupport; + + TcgAMLDATA = TcgSupport; + + Status = pBS->LocateProtocol( &gTcgAcpiSupportGuid, NULL, &mTcgAcpiSupport ); + + if ( EFI_ERROR( Status )) + { + Status = pBS->CreateEvent( EFI_EVENT_NOTIFY_SIGNAL, + EFI_TPL_DRIVER, TcgUpdateAslObj, ®, &ev ); + ASSERT( !EFI_ERROR( Status )); + Status = pBS->RegisterProtocolNotify( &gTcgAcpiSupportGuid, ev, ® ); + + return Status; + } + ev = NULL; + ctx = NULL; + + Status = TcgUpdateAslObj( ev, ctx ); + return Status; +} +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** |