diff options
Diffstat (limited to 'Board/EM/FixedBootOrder/FixedBootOrderHII.c')
-rw-r--r-- | Board/EM/FixedBootOrder/FixedBootOrderHII.c | 888 |
1 files changed, 888 insertions, 0 deletions
diff --git a/Board/EM/FixedBootOrder/FixedBootOrderHII.c b/Board/EM/FixedBootOrder/FixedBootOrderHII.c new file mode 100644 index 0000000..5cf8669 --- /dev/null +++ b/Board/EM/FixedBootOrder/FixedBootOrderHII.c @@ -0,0 +1,888 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* +//*****************************************************************// +// $Archive: /Alaska/BIN/Modules/Template/FixedBootOrder Demo/Board/em/FixedBootOrder/FixedBootOrderHII.c $ +// +// $Author: Easonchen $ +// +// $Revision: 4 $ +// +// $Date: 8/12/13 4:20a $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/BIN/Modules/Template/FixedBootOrder Demo/Board/em/FixedBootOrder/FixedBootOrderHII.c $ +// +// 4 8/12/13 4:20a Easonchen +// [TAG] N/A +// [Category] Improvement +// [Description] CppCheck error fix. +// [Files] FixedBootOrderHII.c +// +// 3 11/09/12 2:40a Easonchen +// [TAG] N/A +// [Category] Improvement +// [Description] Enhance function CreateHiiOneOfOptionItem() +// [Files] FixedBootOrderHii.c +// +// 2 6/28/12 11:33a Easonchen +// Make a new FixedBootOrder module by utilizing 4.6.4.1 BDS functionality +// +// 1 6/28/12 11:23a Easonchen +// +//*****************************************************************// + + +//<AMI_FHDR_START> +//********************************************************************** +// +// Name: FixedBootOrderHII.c +// +// Description: HiiDatabase Related Functions +// +//********************************************************************** +//<AMI_FHDR_END> + +#include <efi.h> +#include <AmiDxeLib.h> +#include <token.h> + +#if EFI_SPECIFICATION_VERSION>0x20000 +#include <Protocol/HiiConfigAccess.h> +#include <Protocol/HiiString.h> +#include <Protocol/HiiDatabase.h> +#else +#include <Protocol/FormCallback.h> +#include <HIIDB.h> +#include <Protocol/ExtHii.h> +#endif + +#include <Setup.h> +#include <SetupStrTokens.h> +#include <AUTOID.h> + +#include "FixedBootOrderHII.h" + +UINTN FormPackageLength=10; +VOID *hiiFormPackage=NULL; + +#if EFI_SPECIFICATION_VERSION>0x20000 +#pragma pack(1) + +typedef struct _EFI_IFR_GUID_LABEL { + EFI_IFR_OP_HEADER Header; + EFI_GUID Guid; + UINT8 ExtendOpCode; + UINT16 Number; +} EFI_IFR_GUID_LABEL; +#pragma pack() +// +// GUIDed opcodes defined for Tiano +// +#define EFI_IFR_TIANO_GUID \ + { 0xf0b1735, 0x87a0, 0x4193, 0xb2, 0x66, 0x53, 0x8c, 0x38, 0xaf, 0x48, 0xce } + +EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID; + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: EfiCompareGuid +// +// Description: To avoid including EDK libs. +// +// Input: IN EFI_GUID *Guid1, IN EFI_GUID *Guid2 +// +// Output: BOOLEAN +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN +EfiCompareGuid ( + IN EFI_GUID *Guid1, + IN EFI_GUID *Guid2 + ) +{ + return (BOOLEAN)(0==MemCmp((UINT8*)Guid1,(UINT8*)Guid2,sizeof(EFI_GUID))); +} + +EFI_STATUS +GetPackageDataFromPackageList ( + IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList, + IN UINT32 PackageIndex, + OUT UINT32 *BufferLen, + OUT EFI_HII_PACKAGE_HEADER **Buffer + ) +{ + UINT32 Index; + EFI_HII_PACKAGE_HEADER *Package; + UINT32 Offset; + UINT32 PackageListLength; + EFI_HII_PACKAGE_HEADER PackageHeader = {0, 0}; + + ASSERT(HiiPackageList != NULL); + + if ((BufferLen == NULL) || (Buffer == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Package = NULL; + Index = 0; + Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + pBS->CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); + while (Offset < PackageListLength) { + Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset); + pBS->CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + if (Index == PackageIndex) { + break; + } + Offset += PackageHeader.Length; + Index++; + } + if (Offset >= PackageListLength) { + // + // no package found in this Package List + // + return EFI_NOT_FOUND; + } + + *BufferLen = PackageHeader.Length; + *Buffer = Package; + return EFI_SUCCESS; +} + +EFI_STATUS +UpdateFormPackageData ( + IN EFI_GUID *FormSetGuid, + IN EFI_FORM_ID FormId, + IN EFI_HII_PACKAGE_HEADER *Package, + IN UINT32 PackageLength, + IN UINT16 Label, + IN BOOLEAN Insert, + IN EFI_HII_UPDATE_DATA *Data, + OUT UINT8 **TempBuffer, + OUT UINT32 *TempBufferSize + ) +{ + UINT8 *BufferPos; + EFI_HII_PACKAGE_HEADER PackageHeader; + UINT32 Offset; + EFI_IFR_OP_HEADER *IfrOpHdr; + BOOLEAN GetFormSet; + BOOLEAN GetForm; + UINT8 ExtendOpCode; + UINT16 LabelNumber; + BOOLEAN Updated; + + if ((TempBuffer == NULL) || (TempBufferSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *TempBufferSize = PackageLength; + if (Data != NULL) { + *TempBufferSize += Data->Offset; + } + *TempBuffer = Malloc (*TempBufferSize); + if (*TempBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + pBS->CopyMem (*TempBuffer, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + *TempBufferSize = sizeof (EFI_HII_PACKAGE_HEADER); + BufferPos = *TempBuffer + sizeof (EFI_HII_PACKAGE_HEADER); + + pBS->CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER)); + Offset = sizeof (EFI_HII_PACKAGE_HEADER); + GetFormSet = (FormSetGuid == NULL) ? TRUE : FALSE; + GetForm = FALSE; + Updated = FALSE; + + while (!Updated && Offset < PackageHeader.Length) { + pBS->CopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length); + BufferPos += IfrOpHdr->Length; + *TempBufferSize += IfrOpHdr->Length; + + switch (IfrOpHdr->OpCode) { + case EFI_IFR_FORM_SET_OP : + if (FormSetGuid != NULL) { + if (MemCmp (&((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, FormSetGuid, sizeof (EFI_GUID)) == 0) { + GetFormSet = TRUE; + } else { + GetFormSet = FALSE; + } + } + break; + + case EFI_IFR_FORM_OP: + if (MemCmp (&((EFI_IFR_FORM *) IfrOpHdr)->FormId, &FormId, sizeof (EFI_FORM_ID)) == 0) { + GetForm = TRUE; + } else { + GetForm = FALSE; + } + break; + + case EFI_IFR_GUID_OP : + if (!GetFormSet || !GetForm) { + // + // Go to the next Op-Code + // + break; + } +TRACE((-1,"EFI_IFR_GUID_OP 1\n")); +// TraceOutData( (UINT8*) &((EFI_IFR_GUID *) IfrOpHdr)->Guid, sizeof(EFI_GUID) ); + if (!EfiCompareGuid (&((EFI_IFR_GUID *) IfrOpHdr)->Guid, &mIfrVendorGuid)) { + // + // GUID mismatch, skip this op-code + // + break; + } + + + ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode; + pBS->CopyMem (&LabelNumber, &((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Number, sizeof (UINT16)); + +TRACE((-1,"EFI_IFR_GUID_OP 2 ExtendOpCode=%x LabelNumber=%x Label=%x\n",ExtendOpCode, LabelNumber, Label)); + + if ((ExtendOpCode != EFI_IFR_EXTEND_OP_LABEL) || (LabelNumber != Label)) { + // + // Go to the next Op-Code + // + break; + } + + if (Insert) { + // + // Insert data after current Label, skip myself + // +TRACE((-1,"EFI_IFR_GUID_OP 3\n")); + Offset += IfrOpHdr->Length; + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + } else { + // + // Replace data between two paired Label, try to find the next Label. + // + while (TRUE) { + Offset += IfrOpHdr->Length; + // + // Search the next label and Fail if not label found. + // + if (Offset >= PackageHeader.Length) { + goto Fail; + } + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + if (IfrOpHdr->OpCode == EFI_IFR_GUID_OP) { + ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode; + if (EfiCompareGuid (&((EFI_IFR_GUID *) IfrOpHdr)->Guid, &mIfrVendorGuid) && ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) { + break; + } + } + } + } + + // + // Fill in the update data + // + if (Data != NULL) { +TRACE((-1,"EFI_IFR_GUID_OP 4\n")); + pBS->CopyMem (BufferPos, Data->Data, Data->Offset); + BufferPos += Data->Offset; + *TempBufferSize += Data->Offset; + } + + // + // Copy the reset data + // + pBS->CopyMem (BufferPos, IfrOpHdr, PackageHeader.Length - Offset); + *TempBufferSize += PackageHeader.Length - Offset; + + Updated = TRUE; + break; + default : + break; + } + + // + // Go to the next Op-Code + // + Offset += IfrOpHdr->Length; + IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length); + } + + // + // Update the package length. + // + PackageHeader.Length = *TempBufferSize; + pBS->CopyMem (*TempBuffer, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER)); + +Fail: + if (!Updated) { + pBS->FreePool (*TempBuffer); + *TempBufferSize = 0; + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + + + + +EFI_STATUS +IfrLibUpdateForm ( + IN EFI_HII_HANDLE Handle, + IN EFI_GUID *FormSetGuid, OPTIONAL + IN EFI_FORM_ID FormId, + IN UINT16 Label, + IN BOOLEAN Insert, + IN EFI_HII_UPDATE_DATA *Data + ) +/*++ + +Routine Description: + This function allows the caller to update a form that has + previously been registered with the EFI HII database. + +Arguments: + Handle - Hii Handle + FormSetGuid - The formset should be updated. + FormId - The form should be updated. + Label - Update information starting immediately after this label in the IFR + Insert - If TRUE and Data is not NULL, insert data after Label. + If FALSE, replace opcodes between two labels with Data + Data - The adding data; If NULL, remove opcodes between two Label. + +Returns: + EFI_SUCCESS - Update success. + Other - Update fail. + +--*/ +{ + EFI_STATUS Status; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; + UINT32 Index; + EFI_HII_PACKAGE_LIST_HEADER *UpdateBuffer; + UINTN BufferSize; + UINT8 *UpdateBufferPos; + EFI_HII_PACKAGE_HEADER PackageHeader; + EFI_HII_PACKAGE_HEADER *Package; + UINT32 PackageLength; + EFI_HII_PACKAGE_HEADER *TempBuffer; + UINT32 TempBufferSize; + BOOLEAN Updated; + + if (Data == NULL) { + return EFI_INVALID_PARAMETER; + } + +// LocateHiiProtocols (); + Status = pBS->LocateProtocol(&gEfiHiiDatabaseProtocolGuid, NULL, &HiiDatabase); + //HiiDatabase = gIfrLibHiiDatabase; + + // + // Get the orginal package list + // + BufferSize = 0; + HiiPackageList = NULL; + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (Status == EFI_BUFFER_TOO_SMALL) { + HiiPackageList = Malloc (BufferSize); + ASSERT (HiiPackageList != NULL); + + Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList); + if (EFI_ERROR (Status)) { + pBS->FreePool (HiiPackageList); + return Status; + } + } + + // + // Calculate and allocate space for retrieval of IFR data + // + BufferSize += Data->Offset; + UpdateBuffer = Malloc (BufferSize); + if (UpdateBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + UpdateBufferPos = (UINT8 *) UpdateBuffer; + + // + // copy the package list header + // + pBS->CopyMem (UpdateBufferPos, HiiPackageList, sizeof (EFI_HII_PACKAGE_LIST_HEADER)); + UpdateBufferPos += sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + Updated = FALSE; + for (Index = 0; ; Index++) { + Status = GetPackageDataFromPackageList (HiiPackageList, Index, &PackageLength, &Package); + if (Status == EFI_SUCCESS) { + pBS->CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER)); + if ((PackageHeader.Type == EFI_HII_PACKAGE_FORMS) && !Updated) { + Status = UpdateFormPackageData (FormSetGuid, FormId, Package, PackageLength, Label, Insert, Data, (UINT8 **)&TempBuffer, &TempBufferSize); + if (!EFI_ERROR(Status)) { + if (FormSetGuid == NULL) { + Updated = TRUE; + } + pBS->CopyMem (UpdateBufferPos, TempBuffer, TempBufferSize); + UpdateBufferPos += TempBufferSize; + pBS->FreePool (TempBuffer); + continue; + } + } + + pBS->CopyMem (UpdateBufferPos, Package, PackageLength); + UpdateBufferPos += PackageLength; + } else if (Status == EFI_NOT_FOUND) { + break; + } else { + pBS->FreePool (HiiPackageList); + return Status; + } + } + + // + // Update package list length + // + BufferSize = UpdateBufferPos - (UINT8 *) UpdateBuffer; + pBS->CopyMem (&UpdateBuffer->PackageLength, &BufferSize, sizeof (UINT32)); + + pBS->FreePool (HiiPackageList); + + Status = HiiDatabase->UpdatePackageList (HiiDatabase, Handle, UpdateBuffer); + + pBS->FreePool(UpdateBuffer); + + return Status; +} +#endif //#if EFI_SPECIFICATION_VERSION>0x20000 + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiOneOfItem +// +// Description: Create a Hii OneOf Item. +// +// Input: +// UINT8 **IfrBufferPtr, +// UINT16 VarStoreId, +// UINT16 VarOffset, +// UINT16 CallBackKey, +// STRING_REF StrTokenId, +// STRING_REF StrTokenHelpId, +// UINT8 Flags +// +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiOneOfItem( + UINT8 **IfrBufferPtr, + UINT16 VarStoreId, + UINT16 VarOffset, + UINT16 CallBackKey, + STRING_REF StrTokenId, + STRING_REF StrTokenHelpId, + UINT8 Flags) +{ + EFI_IFR_ONE_OF IfrOneOf; + + IfrOneOf.Header.OpCode = EFI_IFR_ONE_OF_OP; + IfrOneOf.Header.Length = sizeof(EFI_IFR_ONE_OF); + IfrOneOf.Header.Scope = TRUE; + IfrOneOf.Question.Header.Prompt = StrTokenId; + IfrOneOf.Question.Header.Help = StrTokenHelpId; + IfrOneOf.Question.QuestionId = CallBackKey; //CallBack Key. + IfrOneOf.Question.VarStoreId = VarStoreId; //Variable ID + IfrOneOf.Question.VarStoreInfo.VarOffset = VarOffset; + IfrOneOf.Question.Flags = 04; //EFI_IFR_FLAG_INTERACTIVE + IfrOneOf.Flags = Flags; + IfrOneOf.data.u64.MinValue = 0; + IfrOneOf.data.u64.MaxValue = 0; + IfrOneOf.data.u64.Step = 0; + + pBS->CopyMem( *IfrBufferPtr, &IfrOneOf, sizeof(EFI_IFR_ONE_OF) ); + *IfrBufferPtr += sizeof(EFI_IFR_ONE_OF); + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiOneOfOptionItem +// +// Description: Create a Hii OneOf Option Item. +// +// Input: +// UINT8 **IfrBufferPtr +// UINT8 Type +// UINT16 Index +// STRING_REF StrTokenId +// +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiOneOfOptionItem(UINT8 **IfrBufferPtr, UINT8 Type, UINT16 Index, STRING_REF StrTokenId) +{ + EFI_IFR_ONE_OF_OPTION IfrOneOfOptiopn; + + IfrOneOfOptiopn.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP; + IfrOneOfOptiopn.Header.Length = sizeof(EFI_IFR_ONE_OF_OPTION); + IfrOneOfOptiopn.Header.Scope = FALSE; + IfrOneOfOptiopn.Option = StrTokenId; + IfrOneOfOptiopn.Flags = 0; + IfrOneOfOptiopn.Type = Type; + + switch( Type ) + { + case 0: + IfrOneOfOptiopn.Value.u8 = (UINT8)Index; + break; + case 1: + IfrOneOfOptiopn.Value.u16 = Index; + break; + + } + + pBS->CopyMem ( *IfrBufferPtr, &IfrOneOfOptiopn, sizeof(EFI_IFR_ONE_OF_OPTION) ); + *IfrBufferPtr += sizeof(EFI_IFR_ONE_OF_OPTION); + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiRefItem +// +// Description: Create a Hii Ref Item. +// +// Input: +// UINT8 **IfrBufferPtr +// UINT16 FromID +// STRING_REF StrTokenId1 +// STRING_REF StrTokenId2 +// +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiRefItem(UINT8 **IfrBufferPtr, UINT16 FromID, STRING_REF StrTokenId1, STRING_REF StrTokenId2) +{ + EFI_IFR_REF IfrRef; + + IfrRef.Header.OpCode = EFI_IFR_REF_OP; + IfrRef.Header.Length = sizeof(EFI_IFR_REF); + IfrRef.Header.Scope = FALSE; + IfrRef.Question.Header.Prompt = StrTokenId1; + IfrRef.Question.Header.Help = StrTokenId2; + IfrRef.Question.QuestionId = 0x10; //CallBack Key. + IfrRef.Question.VarStoreId = 0; //Setup Variable ID + IfrRef.Question.VarStoreInfo.VarOffset = 0xFFFF; + IfrRef.Question.Flags = 00; //INTERACTIVE; + IfrRef.FormId = FromID; + + pBS->CopyMem ( *IfrBufferPtr, &IfrRef, sizeof(EFI_IFR_REF) ); + *IfrBufferPtr += sizeof(EFI_IFR_REF); + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiIfrEndItem +// +// Description: Create a Ifr End Item. +// +// Input: +// UINT8 **IfrBufferPtr +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiIfrEndItem(UINT8 **IfrBufferPtr) +{ + EFI_IFR_END IfrEnd; + + IfrEnd.Header.OpCode = EFI_IFR_END_OP; + IfrEnd.Header.Length = sizeof(EFI_IFR_END); + IfrEnd.Header.Scope = FALSE; + + pBS->CopyMem( *IfrBufferPtr, &IfrEnd, sizeof(EFI_IFR_END) ); + *IfrBufferPtr += sizeof(EFI_IFR_END); + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiSubtitleItem +// +// Description: Create a Subtitle Item. +// +// Input: +// UINT8 **IfrBufferPtr +// STRING_REF StrTokenId +// STRING_REF HelpStrTokenId +// UINT8 Flags +// +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiSubtitleItem(UINT8 **IfrBufferPtr, STRING_REF StrTokenId, STRING_REF HelpStrTokenId, UINT8 Flags ) +{ + EFI_IFR_SUBTITLE IfrSubtitle; + IfrSubtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP; + IfrSubtitle.Header.Length = sizeof(EFI_IFR_SUBTITLE); + IfrSubtitle.Header.Scope = TRUE; + IfrSubtitle.Statement.Prompt = StrTokenId; + IfrSubtitle.Statement.Help = HelpStrTokenId; + IfrSubtitle.Flags = Flags; + + pBS->CopyMem( *IfrBufferPtr, &IfrSubtitle, sizeof(EFI_IFR_SUBTITLE) ); + *IfrBufferPtr += sizeof(EFI_IFR_SUBTITLE); + return EFI_SUCCESS; +}; + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateHiiIfrFormItem +// +// Description: Create a Form Item. +// +// Input: +// UINT8 **IfrBufferPtr +// UINT16 FromID +// STRING_REF StrTokenId +// +// Output: +// EFI_STATUS +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateHiiIfrFormItem(UINT8 **IfrBufferPtr, UINT16 FromID, STRING_REF StrTokenId) +{ + EFI_IFR_FORM IfrForm; + + IfrForm.Header.OpCode = EFI_IFR_FORM_OP; + IfrForm.Header.Length = sizeof(EFI_IFR_FORM); + IfrForm.Header.Scope = TRUE; + IfrForm.FormId = FromID; + IfrForm.FormTitle = StrTokenId; + + pBS->CopyMem( *IfrBufferPtr, &IfrForm, sizeof(EFI_IFR_FORM) ); + *IfrBufferPtr += sizeof(EFI_IFR_FORM); + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: InitHiiData +// +// Description: Use HiiDatabaseProtocol get hii data package to buffer +// +// Input: +// EFI_HANDLE HiiHandle +// +// Output: +// NONE +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +void InitHiiData(EFI_HANDLE HiiHandle) +{ + +EFI_GUID gEfiHiiDatabaseProtocolGuid = EFI_HII_DATABASE_PROTOCOL_GUID; +EFI_HII_DATABASE_PROTOCOL *gHiiDatabase; +EFI_STATUS status; + + + status = pBS->LocateProtocol(&gEfiHiiDatabaseProtocolGuid, NULL, &gHiiDatabase); + if(EFI_ERROR(status)) return; + hiiFormPackage = Malloc(FormPackageLength); + status = gHiiDatabase->ExportPackageLists(gHiiDatabase, HiiHandle, &FormPackageLength, hiiFormPackage); + TRACE((-1,"[FBOHii.c] ExportPackageLists...%r\n", status)); + + if( status == EFI_BUFFER_TOO_SMALL) + { + + pBS->FreePool(hiiFormPackage); + // + // Allocate space for retrieval of IFR data + // + hiiFormPackage = Malloc(FormPackageLength); + + if (hiiFormPackage == NULL) + { + hiiFormPackage = NULL; + return; + } + // + // Get all the packages associated with this HiiHandle + // + status = gHiiDatabase->ExportPackageLists (gHiiDatabase, HiiHandle, &FormPackageLength, hiiFormPackage); + TRACE((-1,"[FBOHii.c] Again ExportPackageLists...%r size=%x\n", status, FormPackageLength)); +// TraceOutData( (UINT8 *)hiiFormPackage, FormPackageLength); + } + +} + +void FreeHiiData() +{ + if(hiiFormPackage) + pBS->FreePool(hiiFormPackage); +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: FIndVariableID +// +// Description: Search Hii Form Package Data of variable ID. +// +// Input: +// CHAR8 *VarName +// Output: +// UINT16 VarID +// Modified: +// NONE +// Referrals: +// NONE +// Notes: +// NONE +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT16 FIndVariableID(CHAR8 *VarName ) +{ + EFI_HII_PACKAGE_HEADER *pkgHdr; + + + UINT32 offset = 0; + + EFI_IFR_OP_HEADER *IfrData; + UINT32 SeekSize=0; + UINT32 FormSize=0; + + if( hiiFormPackage == NULL ) return 0; + + offset = sizeof(EFI_HII_PACKAGE_LIST_HEADER); + + while( offset < ((EFI_HII_PACKAGE_LIST_HEADER*)hiiFormPackage)->PackageLength ) + { + UINT8 *pkgOffset; + pkgOffset = ((UINT8*)hiiFormPackage) + offset; + pkgHdr = (EFI_HII_PACKAGE_HEADER*)pkgOffset; + + TRACE((-1,"[FixedBootOrderHII.c] pkgHdr=%x Type=%x Length=%x\n", (UINT8*)pkgHdr-(UINT8*)hiiFormPackage, + pkgHdr->Type, + pkgHdr->Length )); + + switch(pkgHdr->Type) + { + case EFI_HII_PACKAGE_FORMS: + IfrData = (EFI_IFR_OP_HEADER*) ((UINT8 *)pkgHdr+sizeof(EFI_HII_PACKAGE_HEADER)); + FormSize=pkgHdr->Length; + while(1) + { + if(IfrData->OpCode == EFI_IFR_VARSTORE_OP) + { + +// TRACE((-1,"[FixedBootOrderHii.c] VarID=%x Name=%s\n", ((EFI_IFR_VARSTORE*)IfrData)->VarStoreId, +// ((EFI_IFR_VARSTORE*)IfrData)->Name )); + + + if( !Strcmp(VarName, ((EFI_IFR_VARSTORE*)IfrData)->Name) ) + return ((EFI_IFR_VARSTORE*)IfrData)->VarStoreId; + } + SeekSize+=IfrData->Length; + (UINT8 *)IfrData+=IfrData->Length; + + if(!IfrData->Length) break; + if(SeekSize >= FormSize) break; + } + return 0; + break; + + case EFI_HII_PACKAGE_END: + return 0; + break; + + default: + break; + } + offset += pkgHdr->Length; + } + return 0; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* |