summaryrefslogtreecommitdiff
path: root/Board/EM/Platform/SMBIOSUpdateData
diff options
context:
space:
mode:
authorraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
committerraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
commitb7c51c9cf4864df6aabb99a1ae843becd577237c (patch)
treeeebe9b0d0ca03062955223097e57da84dd618b9a /Board/EM/Platform/SMBIOSUpdateData
downloadzprj-master.tar.xz
init. 1AQQW051HEADmaster
Diffstat (limited to 'Board/EM/Platform/SMBIOSUpdateData')
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c731
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.cif12
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs49
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak77
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.sdl24
-rw-r--r--Board/EM/Platform/SMBIOSUpdateData/SmbiosUpdateDataProtocol.h100
6 files changed, 993 insertions, 0 deletions
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c
new file mode 100644
index 0000000..65f67fc
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c
@@ -0,0 +1,731 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//*************************************************************************
+// $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c 1 2/09/12 12:35a Yurenlai $
+//
+// $Revision: 1 $
+//
+// $Date: 2/09/12 12:35a $
+//*************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.c $
+//
+// 1 2/09/12 12:35a Yurenlai
+// Initial check in.
+//
+//*************************************************************************
+
+
+#include "Tiano.h"
+#include "EfiDriverLib.h"
+#include <Protocol\SMBios.h>
+#include <Protocol\SmbiosGetFlashDataProtocol.h>
+#include "SmbiosUpdateDataProtocol.h"
+
+EFI_GUID gEfiSmbiosProtocolGuid = EFI_SMBIOS_PROTOCOL_GUID;
+EFI_SMBIOS_PROTOCOL *gSmbiosProtocol;
+
+EFI_GUID gEfiSmbiosUpdateDataProtocolGuid = EFI_SMBIOS_UPDATE_DATA_PROTOCOL_GUID;
+
+EFI_SMBIOS_UPDATE_DATA_PROTOCOL SmbiosUpdateDataProtocol = {SMBIOS_GetFreeHandle,
+ SMBIOS_FindStructure,
+ SMBIOS_GetStructureBase,
+ SMBIOS_DeleteStructure,
+ SMBIOS_CopyStructure,
+ SMBIOS_InsertStructure};
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetStructureLength
+//
+// Description: Returns the length of the structure pointed by BufferStart
+// in bytes
+//
+// Input: UINT8 *BufferStart
+//
+// Output: Structure Size
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+GetStructureLength(
+ IN UINT8 *BufferStart
+)
+{
+ UINT8 *BufferEnd = BufferStart;
+
+ BufferEnd += ((SMBIOS_STRUCTURE_HEADER*)BufferStart)->Length;
+ while (*(UINT16*)BufferEnd != 0) {
+ BufferEnd++;
+ }
+ return (UINT16)(BufferEnd + 2 - BufferStart); // +2 for double zero terminator
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetTotalStructureSize
+//
+// Description: Returns the total structure size
+//
+// Input: UINT8 *Buffer
+//
+// Output: Total structure size
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+GetTotalStructureSize(
+ IN UINT8 *Buffer
+)
+{
+ UINT16 Length = 0;
+ UINT16 BlockSize;
+
+ while (((SMBIOS_STRUCTURE_HEADER*)Buffer)->Type != 127) {
+ BlockSize = GetStructureLength(Buffer);
+ Length = Length +BlockSize;
+ Buffer += BlockSize;
+ }
+ Length = Length+ GetStructureLength(Buffer);
+ return Length;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: FindStructureByType
+//
+// Description: Find structure type starting from memory location pointed by
+// Buffer
+//
+// Input: UINT8 **Buffer
+// UINT8 **StructureFoundPtr
+// UINT8 SearchType
+// UINT8 Instance
+//
+// Output: If SearchType is found:
+// UINT8 **Buffer - Points to the next structure
+// UINT8 **StructureFoundPtr - Points to the structure
+// that was found
+// If SearchType is not found:
+// UINT8 **Buffer - No change
+// UINT8 **StructureFoundPtr = NULL
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+FindStructureByType(
+ IN OUT UINT8 **Buffer,
+ IN OUT UINT8 **StructureFoundPtr,
+ IN UINT8 SearchType,
+ IN UINT8 Instance // 1-based
+)
+{
+ UINT8 *BufferPtr = *Buffer;
+ BOOLEAN FindStatus = FALSE;
+
+ *StructureFoundPtr = NULL;
+ while (((SMBIOS_STRUCTURE_HEADER*)BufferPtr)->Type != 127) {
+ if (((SMBIOS_STRUCTURE_HEADER*)BufferPtr)->Type == SearchType) {
+ // If this instance, set the find status flag and update the Buffer pointer
+ if (--Instance == 0) {
+ FindStatus = TRUE;
+ *StructureFoundPtr = BufferPtr;
+ *Buffer = BufferPtr + GetStructureLength(BufferPtr);
+ break;
+ }
+ }
+ BufferPtr += GetStructureLength(BufferPtr);
+ }
+ if ((FindStatus == FALSE) && (SearchType == 127)) {
+ FindStatus = TRUE;
+ *StructureFoundPtr = BufferPtr;
+ *Buffer = BufferPtr + GetStructureLength(BufferPtr);
+ }
+ return FindStatus;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: FindStructureByHandle
+//
+// Description: Find structure handle starting from memory location pointed
+// by Buffer
+//
+// Input: UINT8 **Buffer
+// UINT16 Handle
+//
+// Output: If SearchType is found:
+// UINT8 **Buffer - Points to the structure that was found
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+BOOLEAN
+FindStructureByHandle(
+ IN OUT UINT8 **Buffer,
+ IN UINT16 Handle
+)
+{
+ while (((SMBIOS_STRUCTURE_HEADER*)*Buffer)->Handle != Handle) {
+ if (((SMBIOS_STRUCTURE_HEADER*)*Buffer)->Type == 127) {
+ return FALSE;
+ }
+ *Buffer += GetStructureLength(*Buffer);
+ }
+ return TRUE;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetNumberOfStructures
+//
+// Description: Returns the number of structures starting from Buffer til
+// (and including) type 127 structure.
+//
+// Input: UINT8 *Buffer
+//
+// Output: Number of structures
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+GetNumberOfStructures(
+ IN UINT8 *Buffer
+)
+{
+ UINT8 *BufferPtr = Buffer;
+ UINT16 SmbiosStrucCount = 1;
+
+ while (((SMBIOS_STRUCTURE_HEADER*)BufferPtr)->Type != 127) {
+ ++SmbiosStrucCount;
+ BufferPtr += GetStructureLength(BufferPtr);
+ }
+ return SmbiosStrucCount;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: GetLargestStructureSize
+//
+// Description: Returns the largest structure size
+//
+// Input: UINT8 *Buffer
+//
+// Output: Largest structure size
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+GetLargestStructureSize(
+ IN UINT8 *Buffer
+)
+{
+ UINT8 *BufferPtr = Buffer;
+ UINT8 *LastBufferPtr;
+ UINT16 LargestStructureSize = 0;
+ UINT16 CurrentStructureSize;
+
+ while (((SMBIOS_STRUCTURE_HEADER*)BufferPtr)->Type != 127) {
+ LastBufferPtr = BufferPtr;
+ BufferPtr += ((SMBIOS_STRUCTURE_HEADER*)BufferPtr)->Length;
+ while (TRUE) {
+ if ((*(UINT16*)BufferPtr) == 0) {
+ BufferPtr += 2;
+ break;
+ }
+ BufferPtr++;
+ }
+ CurrentStructureSize = (UINT16)(BufferPtr - LastBufferPtr);
+ if (CurrentStructureSize > LargestStructureSize) {
+ LargestStructureSize = CurrentStructureSize;
+ }
+ }
+ return LargestStructureSize;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SmbiosCheckSum
+//
+// Description: Returns the checksum of "length" bytes starting from the
+// "*ChecksumSrc"
+//
+// Input: UINT8 *ChecksumSrc
+// UINT8 length
+//
+// Output: Checksum value
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT8
+SmbiosCheckSum(
+ IN UINT8 *ChecksumSrc,
+ IN UINT8 length
+)
+{
+ UINT8 Checksum = 0;
+ UINT8 i;
+
+ for (i = 0; i < length; i++) {
+ Checksum = Checksum + *ChecksumSrc++;
+ }
+ return (0 - Checksum);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: UpdateEPSHeader
+//
+// Description: Updates the SMBIOS Entry Point Header
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+//
+// Output: None
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+UpdateEPSHeader(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+)
+{
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress;
+
+ // Updating EPS Header
+ // Update SMBIOS Data Structure Table length in EPS Header
+ pSmbiosTableEntryPoint->TableLength = GetTotalStructureSize(SmbiosDataTableAddr);
+
+ // Find and update number of SMBios Structures in EPS Header
+ pSmbiosTableEntryPoint->NumberOfSmbiosStructures = GetNumberOfStructures(SmbiosDataTableAddr);
+
+ // Find and update largest SMBios Structure in EPS Header
+ pSmbiosTableEntryPoint->MaxStructureSize = GetLargestStructureSize((UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress);
+
+ // Update Checksums in EPS Header
+ pSmbiosTableEntryPoint->IntermediateChecksum = 0;
+ pSmbiosTableEntryPoint->IntermediateChecksum = SmbiosCheckSum((UINT8*)pSmbiosTableEntryPoint + 0x10, 15);
+ pSmbiosTableEntryPoint->EntryPointStructureChecksum = 0;
+ pSmbiosTableEntryPoint->EntryPointStructureChecksum = SmbiosCheckSum((UINT8*)pSmbiosTableEntryPoint,
+ pSmbiosTableEntryPoint->EntryPointLength);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_GetFreeHandle
+//
+// Description: SMBIOSUpdateData protocol - Searches available handle
+// of Smbios Data Table
+//
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+//
+// Output: UINT16 Handle or -1(if not found)
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+SMBIOS_GetFreeHandle(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+)
+{
+ EFI_STATUS FoundStatus;
+
+ UINT16 Handle = 0;
+ UINT8 *StructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress;
+
+ //Count Handle form 0 to 0xFFFF to find available Handle
+ for(Handle = 0; Handle < 0xFFFF; Handle++){
+ StructurePtr = SmbiosDataTableAddr;
+ FoundStatus = FindStructureByHandle(&StructurePtr,Handle);
+ if(!FoundStatus){
+ return Handle;
+ }
+ }
+
+ return (UINT16)-1; // No available Handle to use;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_FindStructure
+//
+// Description: SMBIOSUpdateData protocol - Searches handle of Smbios Table by Type
+//
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+// UINT8 Type
+// UINT8 Index
+//
+// Output: UINT16 Handle or -1(if not found)
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT16
+SMBIOS_FindStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 Type,
+ IN UINT8 Index
+)
+{
+ EFI_STATUS FoundStatus;
+
+ UINT16 Handle = 0;
+ UINT8 *StructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress;
+
+ FoundStatus = FindStructureByType(&SmbiosDataTableAddr, &StructurePtr, Type, Index);
+ Handle = ((SMBIOS_STRUCTURE_HEADER*)StructurePtr)->Handle;
+
+ // Return Handle of found structure
+ if(FoundStatus){
+ return Handle;
+ } else{
+ return (UINT16)-1;
+ }
+
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_GetStructureBase
+//
+// Description: SMBIOSUpdateData protocol - Get structure address by Handle
+//
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+// UINT8 *StructureFoundPtr
+// UINT16 Handle
+//
+// Output: UINT8 * or NULL - Points to the structure that was found
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT8 *
+SMBIOS_GetStructureBase(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+)
+{
+ EFI_STATUS FoundStatus;
+
+ UINT8 *FoundStructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress;
+ FoundStructurePtr = SmbiosDataTableAddr;
+
+ FoundStatus = FindStructureByHandle(&FoundStructurePtr, Handle);
+
+ if(FoundStatus){
+ return FoundStructurePtr;
+ } else{
+ return NULL;
+ }
+
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_DeleteStructure
+//
+// Description: SMBIOSUpdateData protocol - Delete SMBIOS structure by handle
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+// UINT16 Handle
+//
+// Output: EFI_STATUS
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+SMBIOS_DeleteStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+)
+{
+/*
+ EFI_STATUS FoundStatus;
+
+ UINT16 BufferSize = 0;
+ UINT8 *StructurePtr = NULL;
+ UINT8 *NextStructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)pSmbiosTableEntryPoint->TableAddress;
+ StructurePtr = SmbiosDataTableAddr;
+
+ FoundStatus = FindStructureByHandle(&StructurePtr, Handle);
+
+ if (FoundStatus){
+ // Calculate data size which we want to move
+ BufferSize = GetTotalStructureSize(StructurePtr) - GetStructureLength(StructurePtr);
+
+ // Calculate next structure address
+ NextStructurePtr = StructurePtr + GetStructureLength(StructurePtr);
+
+ // Copy Structure
+ gBS->CopyMem(StructurePtr, NextStructurePtr, BufferSize);
+
+ UpdateEPSHeader(pSmbiosTableEntryPoint);
+ }
+
+ return FoundStatus;
+*/
+ return gSmbiosProtocol->SmbiosDeleteStructure(Handle);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_CopyStructure
+//
+// Description: SMBIOSUpdateData protocol - Copy SMBIOS structure by Handle
+// to a new allocated memory
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+// UINT16 Handle
+//
+// Output: UINT8 * or NULL - Points to the new structure address
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+UINT8 *
+SMBIOS_CopyStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+)
+{
+ EFI_STATUS FoundStatus;
+
+ UINT16 BufferSize;
+ UINT8 *BufferPtrTemp;
+ UINT8 *FoundStructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)(UINTN)pSmbiosTableEntryPoint->TableAddress;
+ FoundStructurePtr = SmbiosDataTableAddr;
+
+ // Check Handle of Structure if exit
+ FoundStatus = FindStructureByHandle(&FoundStructurePtr, Handle);
+
+ if (FoundStatus){
+ BufferSize = GetStructureLength(FoundStructurePtr);
+
+ // Allocate Memory for structure copy
+ gBS->AllocatePool(EfiBootServicesData, BufferSize, &BufferPtrTemp);
+
+ // Copy Structure to memory
+ gBS->CopyMem(BufferPtrTemp, FoundStructurePtr, BufferSize);
+
+ return BufferPtrTemp;
+
+ } else {
+ return NULL;
+ }
+
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMBIOS_InsertStructure
+//
+// Description: SMBIOSUpdateData protocol - Insert SMBIOS structure
+//
+// Input: SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+// UINT8 *SourceStructurePtr
+// UINTN BufferSize
+//
+// Output: EFI_STATUS
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+SMBIOS_InsertStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 *StructurePtrTemp,
+ IN UINT16 BufferSize
+)
+{
+/*
+ EFI_STATUS FoundStatus;
+
+ UINT16 Handle = 0;
+ UINT16 EOSBufferSize = 0;
+ UINT8 *EOSBufferPtrTemp = NULL;
+ UINT8 *FoundStructurePtr = NULL;
+ UINT8 *SmbiosDataTableAddr = NULL;
+
+ // Get Smbios Data Table Address
+ SmbiosDataTableAddr = (UINT8*)pSmbiosTableEntryPoint->TableAddress;
+ EOSBufferPtrTemp = SmbiosDataTableAddr;
+ FoundStructurePtr = SmbiosDataTableAddr;
+
+ // Check Handle of Structure if available
+ Handle = ((SMBIOS_STRUCTURE_HEADER*)StructurePtrTemp)->Handle;
+ FoundStatus = FindStructureByHandle(&FoundStructurePtr, Handle);
+
+ if (!FoundStatus){
+ // Move End-of-table Structure(Type 127) to allocate space for structure copy
+ FindStructureByHandle(&EOSBufferPtrTemp, 127);
+ EOSBufferSize = GetStructureLength(EOSBufferPtrTemp);
+ FoundStructurePtr = EOSBufferPtrTemp + BufferSize;
+ gBS->CopyMem(FoundStructurePtr, EOSBufferPtrTemp, EOSBufferSize);
+
+ // Copy Source Structure form memory
+ gBS->CopyMem(EOSBufferPtrTemp, StructurePtrTemp, BufferSize);
+
+ UpdateEPSHeader(pSmbiosTableEntryPoint);
+ }
+
+ return !FoundStatus;
+*/
+ UINT16 Handle = 0;
+
+ Handle = ((SMBIOS_STRUCTURE_HEADER*)StructurePtrTemp)->Handle;
+ return gSmbiosProtocol->SmbiosAddStrucByHandle(Handle, StructurePtrTemp, BufferSize);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SMIBiosUpdateMemoryRecordDriverEntryPoint
+//
+// Description: Update memory record DXE driver for Intel Tiano SmBiosMemory Driver.
+//
+// Input:
+//
+// Output: EFI_STATUS
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS SMBIOSUpdateDataDriverEntryPoint(
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+)
+{
+ EFI_STATUS Status;
+
+ DxeInitializeDriverLib (ImageHandle, SystemTable);
+
+ Status = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, &gSmbiosProtocol);
+ ASSERT_EFI_ERROR(Status);
+
+ Status = gBS->InstallProtocolInterface(&ImageHandle,
+ &gEfiSmbiosUpdateDataProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &SmbiosUpdateDataProtocol);
+
+ return Status;
+}
+
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.cif b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.cif
new file mode 100644
index 0000000..7e4aa0e
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.cif
@@ -0,0 +1,12 @@
+<component>
+ name = "SMBIOSUpdateData"
+ category = ModulePart
+ LocalRoot = "Board\EM\Platform\SMBIOSUpdateData"
+ RefName = "SMBIOSUpdateData"
+[files]
+"SMBIOSUpdateData.sdl"
+"SMBIOSUpdateData.mak"
+"SMBIOSUpdateData.dxs"
+"SMBIOSUpdateData.c"
+"SmbiosUpdateDataProtocol.h"
+<endComponent>
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs
new file mode 100644
index 0000000..2b87536
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs
@@ -0,0 +1,49 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//*************************************************************************
+// $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs 1 2/09/12 12:35a Yurenlai $
+//
+// $Revision: 1 $
+//
+// $Date: 2/09/12 12:35a $
+//*************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.dxs $
+//
+// 1 2/09/12 12:35a Yurenlai
+// Initial check in.
+//
+//*************************************************************************
+#include <Include\Protocol\Smbus.h>
+#include <protocol\SmbiosGetFlashDataProtocol.h>
+
+DEPENDENCY_START
+ EFI_SMBIOS_PROTOCOL_GUID
+DEPENDENCY_END
+
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak
new file mode 100644
index 0000000..40254b2
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak
@@ -0,0 +1,77 @@
+#*************************************************************************
+#*************************************************************************
+#** **
+#** (C)Copyright 1985-2011, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#*************************************************************************
+#*************************************************************************
+
+#*************************************************************************
+# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak 1 2/09/12 12:35a Yurenlai $
+#
+# $Revision: 1 $
+#
+# $Date: 2/09/12 12:35a $
+#*************************************************************************
+# Revision History
+# ----------------
+# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/SMBIOSUpdateData/SMBIOSUpdateData.mak $
+#
+# 1 2/09/12 12:35a Yurenlai
+# Initial check in.
+#
+#*************************************************************************
+#<AMI_FHDR_START>
+#
+# Name: SMBIOSUpdateData.mak
+#
+# Description: This make file builds SMBIOSUpdateData module PEI & DXE
+# components and link them to respective binary
+#
+#<AMI_FHDR_END>
+#*************************************************************************
+
+
+all : SMBIOSUpdateData
+
+SMBIOSUpdateData : $(BUILD_DIR)\SMBIOSUpdateData.mak SMBIOSUpdateDataBin
+
+$(BUILD_DIR)\SMBIOSUpdateData.mak : $(SMBIOSUpdateData_DIR)\SMBIOSUpdateData.CIF $(SMBIOSUpdateData_DIR)\$(@B).mak $(BUILD_RULES)
+ $(CIF2MAK) $(SMBIOSUpdateData_DIR)\SMBIOSUpdateData.CIF $(CIF2MAK_DEFAULTS)
+
+SMBIOSUpdateData_INCLUDES = \
+ $(EDK_INCLUDES)\
+ /I$(PROJECT_DIR)\
+ /IInclude\
+
+SMBIOSUpdateDataBin : $(EFIDRIVERLIB)
+ $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\
+ /f $(BUILD_DIR)\SMBIOSUpdateData.mak all\
+ NAME=SMBIOSUpdateData\
+ "MY_INCLUDES=$(SMBIOSUpdateData_INCLUDES)"\
+ GUID=B98999A4-E96F-475a-99FC-762126F50F5A\
+ ENTRY_POINT=SMBIOSUpdateDataDriverEntryPoint\
+ DEPEX1=$(SMBIOSUpdateData_DIR)\SMBIOSUpdateData.dxs \
+ DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX \
+ TYPE=BS_DRIVER\
+ COMPRESS=1\
+
+#*************************************************************************
+#*************************************************************************
+#** **
+#** (C)Copyright 1985-2011, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#*************************************************************************
+#*************************************************************************
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.sdl b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.sdl
new file mode 100644
index 0000000..e4b7448
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SMBIOSUpdateData.sdl
@@ -0,0 +1,24 @@
+TOKEN
+ Name = "SMBIOSUpdateData_SUPPORT"
+ Value = "1"
+ TokenType = Boolean
+ TargetEQU = Yes
+ TargetMAK = Yes
+ Master = Yes
+ Help = "Main switch to enable SMBIOSUpdateData support in Project"
+End
+
+MODULE
+ Help = "Includes SMBIOSUpdateData.mak to Project"
+ File = "SMBIOSUpdateData.mak"
+End
+
+PATH
+ Name = "SMBIOSUpdateData_DIR"
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\SMBIOSUpdateData.ffs"
+ Parent = "FV_MAIN"
+ InvokeOrder = AfterParent
+End
diff --git a/Board/EM/Platform/SMBIOSUpdateData/SmbiosUpdateDataProtocol.h b/Board/EM/Platform/SMBIOSUpdateData/SmbiosUpdateDataProtocol.h
new file mode 100644
index 0000000..991c091
--- /dev/null
+++ b/Board/EM/Platform/SMBIOSUpdateData/SmbiosUpdateDataProtocol.h
@@ -0,0 +1,100 @@
+/*++
+Copyright (c) 2009 Intel Corporation. All rights reserved.
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+--*/
+
+#ifndef _EFI_SMBOS_UPDATE_DATA_PROTOCOL_H_
+#define _EFI_SMBOS_UPDATE_DATA_PROTOCOL_H_
+
+#include <Protocol\SMBios.h>
+#include <Protocol\SmbiosGetFlashDataProtocol.h>
+
+#define EFI_SMBIOS_UPDATE_DATA_PROTOCOL_GUID \
+ {0x67269263, 0xaf1, 0x45dd, 0x93, 0xc8, 0x29, 0x99, 0x21, 0xd0, 0xe1, 0xe9}
+
+typedef struct _EFI_SMBIOS_UPDATE_DATA_PROTOCOL EFI_SMBIOS_UPDATE_DATA_PROTOCOL;
+
+typedef UINT16 (EFIAPI *EFI_SMBIOS_UPDATE_DATA_GET_FREE_HANDLE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+);
+
+typedef UINT16 (EFIAPI *EFI_SMBIOS_UPDATE_DATA_FIND_STRUCTURE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 Type,
+ IN UINT8 Index
+);
+
+typedef UINT8 * (EFIAPI *EFI_SMBIOS_UPDATE_DATA_GET_STRUCTURE_BASE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_SMBIOS_UPDATE_DATA_DELETE_STRUCTURE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+typedef UINT8 * (EFIAPI *EFI_SMBIOS_UPDATE_DATA_COPY_STRUCTURE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_SMBIOS_UPDATE_DATA_INSERT_STRUCTURE) (
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 *StructurePtrTemp,
+ IN UINT16 BufferSize
+);
+
+typedef struct _EFI_SMBIOS_UPDATE_DATA_PROTOCOL {
+ EFI_SMBIOS_UPDATE_DATA_GET_FREE_HANDLE SMBIOS_GetFreeHandle;
+ EFI_SMBIOS_UPDATE_DATA_FIND_STRUCTURE SMBIOS_FindStructure;
+ EFI_SMBIOS_UPDATE_DATA_GET_STRUCTURE_BASE SMBIOS_GetStructureBase;
+ EFI_SMBIOS_UPDATE_DATA_DELETE_STRUCTURE SMBIOS_DeleteStructure;
+ EFI_SMBIOS_UPDATE_DATA_COPY_STRUCTURE SMBIOS_CopyStructure;
+ EFI_SMBIOS_UPDATE_DATA_INSERT_STRUCTURE SMBIOS_InsertStructure;
+};
+
+UINT16
+SMBIOS_GetFreeHandle(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint
+);
+
+UINT16
+SMBIOS_FindStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 Type,
+ IN UINT8 Index
+);
+
+UINT8 *
+SMBIOS_GetStructureBase(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+EFI_STATUS
+SMBIOS_DeleteStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+UINT8 *
+SMBIOS_CopyStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT16 Handle
+);
+
+EFI_STATUS
+SMBIOS_InsertStructure(
+ IN SMBIOS_TABLE_ENTRY_POINT *pSmbiosTableEntryPoint,
+ IN UINT8 *StructurePtrTemp,
+ IN UINT16 BufferSize
+);
+
+#endif