From b7c51c9cf4864df6aabb99a1ae843becd577237c Mon Sep 17 00:00:00 2001 From: raywu Date: Fri, 15 Jun 2018 00:00:50 +0800 Subject: init. 1AQQW051 --- .../EM/Platform/FirmwareVerInfo/FirmwareVerInfo.c | 218 +++++++++++++++++++++ .../Platform/FirmwareVerInfo/FirmwareVerInfo.cif | 11 ++ .../Platform/FirmwareVerInfo/FirmwareVerInfo.dxs | 50 +++++ .../Platform/FirmwareVerInfo/FirmwareVerInfo.mak | 29 +++ .../Platform/FirmwareVerInfo/FirmwareVerInfo.sdl | 80 ++++++++ 5 files changed, 388 insertions(+) create mode 100644 Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.c create mode 100644 Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.cif create mode 100644 Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.dxs create mode 100644 Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.mak create mode 100644 Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.sdl (limited to 'Board/EM/Platform/FirmwareVerInfo') diff --git a/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.c b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.c new file mode 100644 index 0000000..404a2cf --- /dev/null +++ b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.c @@ -0,0 +1,218 @@ +/** @file +**/ + +#include +#include + +#include EFI_GUID_DEFINITION(DataHubRecords) +#include EFI_PROTOCOL_CONSUMER(DataHub) +#include EFI_PROTOCOL_CONSUMER(ExitPmAuth) +#include + +#include + + +#pragma pack(1) + +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Handle; + UINT8 GroupName; +} SMBIOS_TYPE14_STRUCTURE_HDR; + +typedef struct { + UINT8 Type; + UINT16 Handle; +} SMBIOS_TYPE14_STRUCTURE_ITEM; + +#pragma pack() + +VOID CreateFirmwareVerInfo(IN EFI_EVENT Event, IN VOID *Context); + +EFI_SMBIOS_PROTOCOL *gSmbiosProtocol = NULL; + +/** + The user Entry Point for DXE driver. The user code starts with this function + as the real entry point for the image goes into a library that calls this + function. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +FirmwareVerInfoEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + EFI_STATUS Status; + EFI_GUID gEfiSmbiosProtocolGuid = EFI_SMBIOS_PROTOCOL_GUID; + EFI_EVENT Event; + + DxeInitializeDriverLib (ImageHandle, SystemTable); + + Status = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, &gSmbiosProtocol); + ASSERT_EFI_ERROR(Status); + if (!EFI_ERROR(Status)) + { + Status = EfiCreateEventReadyToBoot( + EFI_TPL_CALLBACK, + CreateFirmwareVerInfo, + NULL, + &Event + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} + + +EFI_STATUS BuildFviStruct(BOOLEAN GroupAssociation, EFI_DATA_RECORD_HEADER *Record) +{ + static VOID *FviStructBuffer = NULL; + static UINTN FviStructBufferSize = 0; + static UINTN FviStructSize = 0; + static UINTN ElementCount = 0; + + EFI_STATUS Status; + EFI_SUBCLASS_TYPE1_HEADER *DataHeader = NULL; + FVI_HEADER *FviHeader = NULL; + UINT16 BufferSize = 0; + SMBIOS_TYPE14_STRUCTURE_HDR *SmbiosHdr = NULL; + SMBIOS_TYPE14_STRUCTURE_ITEM *ItemPtr = NULL; + CHAR8 GroupName[] = "Firmware Version Info\0"; + + if (GroupAssociation) + { + if ((FviStructBuffer == NULL) && (FviStructSize > sizeof(SMBIOS_TYPE14_STRUCTURE_HDR))) + { + return EFI_UNSUPPORTED; + } + + SmbiosHdr = (SMBIOS_TYPE14_STRUCTURE_HDR *)FviStructBuffer; + + SmbiosHdr->Type = 14; + SmbiosHdr->Length = (UINT8)FviStructSize; + SmbiosHdr->Handle = 0xFFFF; + + SmbiosHdr->GroupName = 0x01; + EfiAsciiStrCpy((CHAR8 *)((UINT8 *)FviStructBuffer+FviStructSize), GroupName); + FviStructSize += sizeof(GroupName); + + Status = gSmbiosProtocol->SmbiosAddStructure((UINT8 *)SmbiosHdr, (UINT16)(FviStructSize)); + if (!EFI_ERROR(Status)) + { + gBS->FreePool(FviStructBuffer); + FviStructBuffer = NULL; + } + + return Status; + } + + if (Record == NULL) + { + return EFI_INVALID_PARAMETER; + } + + if (FviStructBuffer == NULL) + { + FviStructBufferSize = 0x2000; + FviStructBuffer = EfiLibAllocateZeroPool(FviStructBufferSize); + FviStructSize = sizeof(SMBIOS_TYPE14_STRUCTURE_HDR); + } + + SmbiosHdr = (SMBIOS_TYPE14_STRUCTURE_HDR *)FviStructBuffer; + ItemPtr = (SMBIOS_TYPE14_STRUCTURE_ITEM *)(SmbiosHdr + 1); + ItemPtr += ElementCount; + + if (EfiCompareGuid(&Record->DataRecordGuid, &gMiscSubClassName)) + { + DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1); + FviHeader = (FVI_HEADER *)(UINT8 *)(DataHeader + 1); + + if (FviHeader->Header.Type == FVI_SMBIOS_TYPE) + { + FviHeader->Header.Handle = 0xFFFF; + BufferSize = (UINT16)(Record->RecordSize - sizeof(EFI_DATA_RECORD_HEADER) - sizeof(EFI_SUBCLASS_TYPE1_HEADER)); + Status = gSmbiosProtocol->SmbiosAddStructure((UINT8 *)FviHeader, BufferSize); + if (!EFI_ERROR(Status)) + { + ItemPtr->Type = FviHeader->Header.Type; + ItemPtr->Handle = FviHeader->Header.Handle; + FviStructSize += sizeof(SMBIOS_TYPE14_STRUCTURE_ITEM); + ElementCount++; + } + } + } + + return EFI_SUCCESS; +} + + +VOID CreateFirmwareVerInfo(IN EFI_EVENT Event, IN VOID *Context) +{ + EFI_STATUS Status; + EFI_HANDLE DataHubHandle; + UINTN HandleSize; + EFI_DATA_HUB_PROTOCOL *DataHub = NULL; + EFI_DATA_RECORD_HEADER *Record = NULL; + UINT64 MonotonicCount = 0; + + HandleSize = sizeof (EFI_HANDLE); + + Status = gBS->LocateHandle ( + ByProtocol, + &gEfiDataHubProtocolGuid, + NULL, + &HandleSize, + &DataHubHandle + ); + if (EFI_ERROR (Status)) + { + return; + } + + Status = gBS->HandleProtocol ( + DataHubHandle, + &gEfiDataHubProtocolGuid, + &DataHub + ); + if (EFI_ERROR (Status)) + { + return; + } + + do { + Status = DataHub->GetNextRecord ( + DataHub, + &MonotonicCount, + NULL, + &Record); + if (!EFI_ERROR (Status)) + { + if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) + { + BuildFviStruct(FALSE, Record); + } + } + } while (!EFI_ERROR (Status) && (MonotonicCount != 0)); + + Status = BuildFviStruct(TRUE, NULL); + if (EFI_ERROR(Status)) + { + DEBUG((EFI_D_ERROR, "!!!Firmware Version Information Error!!!\n")); + DEBUG((EFI_D_ERROR, "!!!Type 14 ¡V Group Associations Indicator!!!\n")); + } + + if (Event != NULL) + { + gBS->CloseEvent(Event); + } +} diff --git a/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.cif b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.cif new file mode 100644 index 0000000..5113f3e --- /dev/null +++ b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.cif @@ -0,0 +1,11 @@ + + name = "FirmwareVerInfo" + category = ModulePart + LocalRoot = "Board\EM\Platform\FirmwareVerInfo" + RefName = "FirmwareVerInfo" +[files] +"FirmwareVerInfo.sdl" +"FirmwareVerInfo.mak" +"FirmwareVerInfo.dxs" +"FirmwareVerInfo.c" + diff --git a/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.dxs b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.dxs new file mode 100644 index 0000000..ea6c9fb --- /dev/null +++ b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.dxs @@ -0,0 +1,50 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (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/FirmwareVerInfo/FirmwareVerInfo.dxs 1 6/13/12 8:38a Yurenlai $ +// +// $Revision: 1 $ +// +// $Date: 6/13/12 8:38a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/FirmwareVerInfo/FirmwareVerInfo.dxs $ +// +// 1 6/13/12 8:38a Yurenlai +// [TAG] None +// [Category] Improvement +// [Description] Support Firmware Version Information. +// [Files] AcpiPlatform.cif, Board/EM/Platform/FirmwareVerInfo/*.* +// +//************************************************************************* + +DEPENDENCY_START + AFTER {0xEDA39402, 0xF375, 0x4496, 0x92, 0xD3, 0x83, 0xB4, 0x3C, 0xB8, 0xA7, 0x6A} +DEPENDENCY_END + +//************************************************************************* +//************************************************************************* +//** ** +//** (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/FirmwareVerInfo/FirmwareVerInfo.mak b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.mak new file mode 100644 index 0000000..1d0c956 --- /dev/null +++ b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.mak @@ -0,0 +1,29 @@ +# /*++ +# +# --*/ +all : FirmwareVerInfo + +FirmwareVerInfo : $(BUILD_DIR)\FirmwareVerInfo.mak FirmwareVerInfoBin + +$(BUILD_DIR)\FirmwareVerInfo.mak : $(FirmwareVerInfo_DIR)\FirmwareVerInfo.cif $(FirmwareVerInfo_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(FirmwareVerInfo_DIR)\FirmwareVerInfo.cif $(CIF2MAK_DEFAULTS) + +FirmwareVerInfo_INCLUDES = \ + $(EDK_INCLUDES)\ + /I Include\ + $(INTEL_PCH_INCLUDES) + +FirmwareVerInfo_LIB_LINKS =\ + $(EFIDRIVERLIB) + +FirmwareVerInfoBin : $(FirmwareVerInfo_LIB_LINKS) + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\FirmwareVerInfo.mak all\ + NAME=FirmwareVerInfo\ + "MY_INCLUDES=$(FirmwareVerInfo_INCLUDES)"\ + GUID=132A6630-FEB5-4ba2-85FB-FD2635379257\ + ENTRY_POINT=FirmwareVerInfoEntryPoint\ + DEPEX1=$(FirmwareVerInfo_DIR)\FirmwareVerInfo.dxs \ + DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX \ + TYPE=BS_DRIVER\ + COMPRESS=1 diff --git a/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.sdl b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.sdl new file mode 100644 index 0000000..4cddc59 --- /dev/null +++ b/Board/EM/Platform/FirmwareVerInfo/FirmwareVerInfo.sdl @@ -0,0 +1,80 @@ +#************************************************************************* +#************************************************************************* +#** ** +#** (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/FirmwareVerInfo/FirmwareVerInfo.sdl 2 11/20/12 7:22a Alanlin $ +# +# $Revision: 2 $ +# +# $Date: 11/20/12 7:22a $ +#************************************************************************* +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/Platform/FirmwareVerInfo/FirmwareVerInfo.sdl $ +# +# 2 11/20/12 7:22a Alanlin +# +# 1 6/13/12 8:38a Yurenlai +# [TAG] None +# [Category] Improvement +# [Description] Support Firmware Version Information. +# [Files] AcpiPlatform.cif, Board/EM/Platform/FirmwareVerInfo/*.* +# +#************************************************************************* +TOKEN + Name = "FirmwareVerInfo_SUPPORT" + Value = "0" + Help = "Main switch to enable FirmwareVerInfo support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes + Token = "PI_SPECIFICATION_VERSION" ">=" "0x10000" +End + +TOKEN + Name = "FVI_SMBIOS_TYPE" + Value = "0xDD" + TokenType = Integer + TargetH = Yes +End + +PATH + Name = "FirmwareVerInfo_DIR" +End + +MODULE + Help = "Includes FirmwareVerInfo.mak to Project" + File = "FirmwareVerInfo.mak" +End + +ELINK + Name = "$(BUILD_DIR)\FirmwareVerInfo.ffs" + Parent = "FV_MAIN" + InvokeOrder = AfterParent +End + +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2011, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* -- cgit v1.2.3