X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Vlv2TbltDevicePkg%2FPlatformSetupDxe%2FSetupInfoRecords.c;fp=Vlv2TbltDevicePkg%2FPlatformSetupDxe%2FSetupInfoRecords.c;h=0000000000000000000000000000000000000000;hp=c404ada58803af9423a1a41a341c0a0898a45ac0;hb=5347c48016f27061475fdb053e867a06ce73492f;hpb=96ef5a8e30a8da33eaab09f13cc8d752342717a5 diff --git a/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c b/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c deleted file mode 100644 index c404ada588..0000000000 --- a/Vlv2TbltDevicePkg/PlatformSetupDxe/SetupInfoRecords.c +++ /dev/null @@ -1,1855 +0,0 @@ -/** @file - - Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - - - - -Module Name: - - SetupInfoRecords.c - -Abstract: - - This is the filter driver to retrieve data hub entries. - -Revision History: ---*/ - -#include "PlatformSetupDxe.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Valleyview.h" -#include "VlvAccess.h" -#include "PchAccess.h" -#include "SetupMode.h" -#include "PchCommonDefinitions.h" -#include - - -typedef struct { - UINT8 ID; - CHAR8 String[16]; -} VLV_REV; - -typedef struct { - UINT8 RevId; - CHAR8 String[16]; -} SB_REV; - -// -// Silicon Steppings -// -SB_REV SBRevisionTable[] = { - {V_PCH_LPC_RID_0, "(A0 Stepping)"}, - {V_PCH_LPC_RID_1, "(A0 Stepping)"}, - {V_PCH_LPC_RID_2, "(A1 Stepping)"}, - {V_PCH_LPC_RID_3, "(A1 Stepping)"}, - {V_PCH_LPC_RID_4, "(B0 Stepping)"}, - {V_PCH_LPC_RID_5, "(B0 Stepping)"}, - {V_PCH_LPC_RID_6, "(B1 Stepping)"}, - {V_PCH_LPC_RID_7, "(B1 Stepping)"}, - {V_PCH_LPC_RID_8, "(B2 Stepping)"}, - {V_PCH_LPC_RID_9, "(B2 Stepping)"}, - {V_PCH_LPC_RID_A, "(B3 Stepping)"}, - {V_PCH_LPC_RID_B, "(B3 Stepping)"}, - {V_PCH_LPC_RID_C, "(C0 Stepping)"}, - {V_PCH_LPC_RID_D, "(C0 Stepping)"} -}; - -#define LEFT_JUSTIFY 0x01 -#define PREFIX_SIGN 0x02 -#define PREFIX_BLANK 0x04 -#define COMMA_TYPE 0x08 -#define LONG_TYPE 0x10 -#define PREFIX_ZERO 0x20 - -#define ICH_REG_REV 0x08 -#define MSR_IA32_PLATFORM_ID 0x17 - - -BOOLEAN mSetupInfoDone = FALSE; -UINT8 mUseProductKey = 0; -EFI_EXP_BASE10_DATA mProcessorFrequency; -EFI_EXP_BASE10_DATA mProcessorFsbFrequency; - -EFI_GUID mProcessorProducerGuid; -EFI_HII_HANDLE mHiiHandle; -EFI_PLATFORM_CPU_INFO mPlatformCpuInfo; -SYSTEM_CONFIGURATION mSystemConfiguration; -EFI_PLATFORM_INFO_HOB *mPlatformInfo; - - -#define memset SetMem - -UINT16 mMemorySpeed = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelASlot0 = 0; -UINT16 mMemorySpeedChannelASlot0 = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelASlot1 = 0; -UINT16 mMemorySpeedChannelASlot1 = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelBSlot0 = 0; -UINT16 mMemorySpeedChannelBSlot0 = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelBSlot1 = 0; -UINT16 mMemorySpeedChannelBSlot1 = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelCSlot0 = 0; -UINT16 mMemorySpeedChannelCSlot0 = 0xffff; -EFI_PHYSICAL_ADDRESS mMemorySizeChannelCSlot1 = 0; -UINT16 mMemorySpeedChannelCSlot1 = 0xffff; -UINTN mMemoryMode = 0xff; - -#define CHARACTER_NUMBER_FOR_VALUE 30 - typedef struct { - EFI_STRING_TOKEN MemoryDeviceLocator; - EFI_STRING_TOKEN MemoryBankLocator; - EFI_STRING_TOKEN MemoryManufacturer; - EFI_STRING_TOKEN MemorySerialNumber; - EFI_STRING_TOKEN MemoryAssetTag; - EFI_STRING_TOKEN MemoryPartNumber; - EFI_INTER_LINK_DATA MemoryArrayLink; - EFI_INTER_LINK_DATA MemorySubArrayLink; - UINT16 MemoryTotalWidth; - UINT16 MemoryDataWidth; - UINT64 MemoryDeviceSize; - EFI_MEMORY_FORM_FACTOR MemoryFormFactor; - UINT8 MemoryDeviceSet; - EFI_MEMORY_ARRAY_TYPE MemoryType; - EFI_MEMORY_TYPE_DETAIL MemoryTypeDetail; - UINT16 MemorySpeed; - EFI_MEMORY_STATE MemoryState; -} EFI_MEMORY_ARRAY_LINK; - - -typedef struct { - EFI_PHYSICAL_ADDRESS MemoryArrayStartAddress; - EFI_PHYSICAL_ADDRESS MemoryArrayEndAddress; - EFI_INTER_LINK_DATA PhysicalMemoryArrayLink; - UINT16 MemoryArrayPartitionWidth; -} EFI_MEMORY_ARRAY_START_ADDRESS; - - -typedef enum { - PCH_SATA_MODE_IDE = 0, - PCH_SATA_MODE_AHCI, - PCH_SATA_MODE_RAID, - PCH_SATA_MODE_MAX -} PCH_SATA_MODE; - -/** - Acquire the string associated with the Index from smbios structure and return it. - The caller is responsible for free the string buffer. - - @param OptionalStrStart The start position to search the string - @param Index The index of the string to extract - @param String The string that is extracted - - @retval EFI_SUCCESS The function returns EFI_SUCCESS always. - -**/ -EFI_STATUS -GetOptionalStringByIndex ( - IN CHAR8 *OptionalStrStart, - IN UINT8 Index, - OUT CHAR16 **String - ) -{ - UINTN StrSize; - - if (Index == 0) { - *String = AllocateZeroPool (sizeof (CHAR16)); - return EFI_SUCCESS; - } - - StrSize = 0; - do { - Index--; - OptionalStrStart += StrSize; - StrSize = AsciiStrSize (OptionalStrStart); - } while (OptionalStrStart[StrSize] != 0 && Index != 0); - - if ((Index != 0) || (StrSize == 1)) { - // - // Meet the end of strings set but Index is non-zero, or - // Find an empty string - // - return EFI_NOT_FOUND; - } else { - *String = AllocatePool (StrSize * sizeof (CHAR16)); - AsciiStrToUnicodeStr (OptionalStrStart, *String); - } - - return EFI_SUCCESS; -} - -/** - VSPrint worker function that prints a Value as a decimal number in Buffer - - @param Buffer Location to place ascii decimal number string of Value. - @param Value Decimal value to convert to a string in Buffer. - @param Flags Flags to use in printing decimal string, see file header for details. - @param Width Width of hex value. - - Number of characters printed. - -**/ -UINTN -EfiValueToString ( - IN OUT CHAR16 *Buffer, - IN INT64 Value, - IN UINTN Flags, - IN UINTN Width - ) -{ - CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE]; - CHAR16 *TempStr; - CHAR16 *BufferPtr; - UINTN Count; - UINTN ValueCharNum; - UINTN Remainder; - CHAR16 Prefix; - UINTN Index; - BOOLEAN ValueIsNegative; - UINT64 TempValue; - - TempStr = TempBuffer; - BufferPtr = Buffer; - Count = 0; - ValueCharNum = 0; - ValueIsNegative = FALSE; - - if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) { - Width = CHARACTER_NUMBER_FOR_VALUE - 1; - } - - if (Value < 0) { - Value = -Value; - ValueIsNegative = TRUE; - } - - do { - TempValue = Value; - Value = (INT64)DivU64x32 ((UINT64)Value, 10); - Remainder = (UINTN)((UINT64)TempValue - 10 * Value); - *(TempStr++) = (CHAR16)(Remainder + '0'); - ValueCharNum++; - Count++; - if ((Flags & COMMA_TYPE) == COMMA_TYPE) { - if (ValueCharNum % 3 == 0 && Value != 0) { - *(TempStr++) = ','; - Count++; - } - } - } while (Value != 0); - - if (ValueIsNegative) { - *(TempStr++) = '-'; - Count++; - } - - if ((Flags & PREFIX_ZERO) && !ValueIsNegative) { - Prefix = '0'; - } else { - Prefix = ' '; - } - - Index = Count; - if (!(Flags & LEFT_JUSTIFY)) { - for (; Index < Width; Index++) { - *(TempStr++) = Prefix; - } - } - - // - // Reverse temp string into Buffer. - // - if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) { - TempStr = TempBuffer + Width; - } - Index = 0; - while (TempStr != TempBuffer) { - *(BufferPtr++) = *(--TempStr); - Index++; - } - - *BufferPtr = 0; - return Index; -} - -static CHAR16 mHexStr[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', - L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' }; - -/** - VSPrint worker function that prints a Value as a hex number in Buffer - - @param Buffer Location to place ascii hex string of Value. - @param Value Hex value to convert to a string in Buffer. - @param Flags Flags to use in printing Hex string, see file header for details. - @param Width Width of hex value. - - @retval Number of characters printed. - -**/ -UINTN -EfiValueToHexStr ( - IN OUT CHAR16 *Buffer, - IN UINT64 Value, - IN UINTN Flags, - IN UINTN Width - ) -{ - CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE]; - CHAR16 *TempStr; - CHAR16 Prefix; - CHAR16 *BufferPtr; - UINTN Count; - UINTN Index; - - TempStr = TempBuffer; - BufferPtr = Buffer; - - // - // Count starts at one since we will null terminate. Each iteration of the - // loop picks off one nibble. Oh yea TempStr ends up backwards - // - Count = 0; - - if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) { - Width = CHARACTER_NUMBER_FOR_VALUE - 1; - } - - do { - Index = ((UINTN)Value & 0xf); - *(TempStr++) = mHexStr[Index]; - Value = RShiftU64 (Value, 4); - Count++; - } while (Value != 0); - - if (Flags & PREFIX_ZERO) { - Prefix = '0'; - } else { - Prefix = ' '; - } - - Index = Count; - if (!(Flags & LEFT_JUSTIFY)) { - for (; Index < Width; Index++) { - *(TempStr++) = Prefix; - } - } - - // - // Reverse temp string into Buffer. - // - if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) { - TempStr = TempBuffer + Width; - } - Index = 0; - while (TempStr != TempBuffer) { - *(BufferPtr++) = *(--TempStr); - Index++; - } - - *BufferPtr = 0; - return Index; -} - -/*++ - Converts MAC address to Unicode string. - The value is 64-bit and the resulting string will be 12 - digit hex number in pairs of digits separated by dashes. - - @param String string that will contain the value - @param MacAddr add argument and description to function comment - @param AddrSize add argument and description to function comment - -**/ -CHAR16 * -StrMacToString ( - OUT CHAR16 *String, - IN EFI_MAC_ADDRESS *MacAddr, - IN UINT32 AddrSize - ) -{ - UINT32 i; - - for (i = 0; i < AddrSize; i++) { - - EfiValueToHexStr ( - &String[2 * i], - MacAddr->Addr[i] & 0xFF, - PREFIX_ZERO, - 2 - ); - } - - // - // Terminate the string. - // - String[2 * AddrSize] = L'\0'; - - return String; -} - -VOID UpdateLatestBootTime() { - UINTN VarSize; - EFI_STATUS Status; - UINT64 TimeValue; - CHAR16 Buffer[40]; - if (mSystemConfiguration.LogBootTime != 1) { - return; - } - VarSize = sizeof(TimeValue); - Status = gRT->GetVariable( - BOOT_TIME_NAME, - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &TimeValue - ); - if (EFI_ERROR(Status)) { - return; - } - UnicodeSPrint (Buffer, sizeof (Buffer), L"%d ms", (UINT32)TimeValue); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_LOG_BOOT_TIME_VALUE), Buffer, NULL); -} - -/** - Get Cache Type for the specified Cache. This function is invoked when there is data records - available in the Data Hub. - - Get Cache Type function arguments: - - @param Instance The instance number of the subclass with the same ProducerName.. - @param SubInstance The instance number of the RecordType for the same Instance. - @param CacheType Cache type, see definition of EFI_CACHE_TYPE_DATA. - - @retval EFI_STATUS - -**/ -EFI_STATUS -GetCacheType( - IN UINT16 Instance, - IN UINT16 SubInstance, - IN EFI_CACHE_TYPE_DATA* CacheType) -{ - EFI_STATUS Status; - EFI_DATA_HUB_PROTOCOL *DataHub; - EFI_DATA_RECORD_HEADER *Record; - UINT64 MonotonicCount; - EFI_CACHE_VARIABLE_RECORD* CacheVariableRecord; - EFI_SUBCLASS_TYPE1_HEADER *DataHeader; - - Status = gBS->LocateProtocol ( - &gEfiDataHubProtocolGuid, - NULL, - (void **)&DataHub - ); - ASSERT_EFI_ERROR(Status); - - // - // Get all available data records from data hub - // - MonotonicCount = 0; - Record = NULL; - - do { - Status = DataHub->GetNextRecord ( - DataHub, - &MonotonicCount, - NULL, - &Record - ); - if (!EFI_ERROR(Status)) { - if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) { - DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1); - - if(CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && - (DataHeader->RecordType == CacheTypeRecordType) && - (DataHeader->Instance == Instance) && - (DataHeader->SubInstance == SubInstance)) { - CacheVariableRecord = (EFI_CACHE_VARIABLE_RECORD *)(DataHeader + 1); - if(CacheType){ - *CacheType = CacheVariableRecord->CacheType; - return EFI_SUCCESS; - } - } - } - } - } while(!EFI_ERROR(Status) && (MonotonicCount != 0)); - - return EFI_NOT_FOUND; -} - -/** - Setup data filter function. This function is invoked when there is data records - available in the Data Hub. - - - Standard event notification function arguments: - @param Event The event that is signaled. - @param Context Not used here. - - @retval EFI_STATUS - -**/ -VOID -PrepareSetupInformation ( - ) -{ - - EFI_STATUS Status; - EFI_DATA_HUB_PROTOCOL *DataHub; - EFI_DATA_RECORD_HEADER *Record; - UINT8 *SrcData; - EFI_SUBCLASS_TYPE1_HEADER *DataHeader; - CHAR16 *NewString; - CHAR16 *NewString2; - CHAR16 *NewStringToken; - STRING_REF TokenToUpdate; - EFI_PROCESSOR_VERSION_DATA *ProcessorVersion; - UINTN Index; - UINTN DataOutput; - - EFI_PROCESSOR_MICROCODE_REVISION_DATA *CpuUcodeRevisionData; - EFI_MEMORY_ARRAY_START_ADDRESS *MemoryArray; - EFI_MEMORY_ARRAY_LINK *MemoryArrayLink; - UINT64 MonotonicCount; - - CHAR16 Version[100]; //Assuming that strings are < 100 UCHAR - CHAR16 ReleaseDate[100]; //Assuming that strings are < 100 UCHAR - CHAR16 ReleaseTime[100]; //Assuming that strings are < 100 UCHAR - - NewString = AllocateZeroPool (0x100); - NewString2 = AllocateZeroPool (0x100); - SetMem(Version, sizeof(Version), 0); - SetMem(ReleaseDate, sizeof(ReleaseDate), 0); - SetMem(ReleaseTime, sizeof(ReleaseTime), 0); - - // - // Get the Data Hub Protocol. Assume only one instance - // - Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (void **)&DataHub); - ASSERT_EFI_ERROR(Status); - - // - // Get all available data records from data hub - // - MonotonicCount = 0; - Record = NULL; - - do { - Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record); - if (!EFI_ERROR(Status)) { - if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) { - DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1); - SrcData = (UINT8 *)(DataHeader + 1); - - // - // Processor - // - if (CompareGuid(&Record->DataRecordGuid, &gEfiProcessorSubClassGuid)) { - CopyMem (&mProcessorProducerGuid, &Record->ProducerName, sizeof(EFI_GUID)); - switch (DataHeader->RecordType) { - case ProcessorCoreFrequencyRecordType: - CopyMem(&mProcessorFrequency, SrcData, sizeof(EFI_EXP_BASE10_DATA)); - Index = EfiValueToString ( - NewString, - ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)/1000000000, - PREFIX_ZERO, - 0 - ); - StrCat (NewString, L"."); - EfiValueToString ( - NewString + Index + 1, - ((ConvertBase10ToRaw ((EFI_EXP_BASE10_DATA *)SrcData)%1000000000)/10000000), - PREFIX_ZERO, - 0 - ); - StrCat (NewString, L" GHz"); - TokenToUpdate = (STRING_REF)STR_PROCESSOR_SPEED_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - break; - - case ProcessorVersionRecordType: - ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *)SrcData; - NewStringToken = HiiGetPackageString(&mProcessorProducerGuid, *ProcessorVersion, NULL); - TokenToUpdate = (STRING_REF)STR_PROCESSOR_VERSION_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, NewStringToken, NULL); - break; - case CpuUcodeRevisionDataRecordType: - CpuUcodeRevisionData = (EFI_PROCESSOR_MICROCODE_REVISION_DATA *) SrcData; - if (CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber != 0) { - EfiValueToHexStr ( - NewString, - CpuUcodeRevisionData->ProcessorMicrocodeRevisionNumber, - PREFIX_ZERO, - 8 - ); - TokenToUpdate = (STRING_REF)STR_PROCESSOR_MICROCODE_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - } - break; - default: - break; - } - - // - // Cache - // - } else if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && - (DataHeader->RecordType == CacheSizeRecordType)) { - if (DataHeader->SubInstance == EFI_CACHE_L1) { - EFI_CACHE_TYPE_DATA CacheType; - if (EFI_SUCCESS == GetCacheType(DataHeader->Instance, DataHeader->SubInstance,&CacheType)){ - if (CacheType == EfiCacheTypeData) { - TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_DATA_CACHE_VALUE; - } else if (CacheType == EfiCacheTypeInstruction) { - TokenToUpdate = (STRING_REF)STR_PROCESSOR_L1_INSTR_CACHE_VALUE; - } else { - continue; - } - } else { - continue; - } - } - else if (DataHeader->SubInstance == EFI_CACHE_L2) { - TokenToUpdate = (STRING_REF)STR_PROCESSOR_L2_CACHE_VALUE; - } else { - continue; - } - if (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData)) { - DataOutput = ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10; - EfiValueToString (NewString, DataOutput, PREFIX_ZERO, 0); - - StrCat (NewString, L" KB"); - if (DataHeader->SubInstance == EFI_CACHE_L3) { - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - } else if(DataHeader->SubInstance == EFI_CACHE_L2 && mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage > 1){ - // - // Show XxL2 string - // - EfiValueToString ( - NewString2, - mPlatformCpuInfo.CpuPackage.CoresPerPhysicalPackage, - PREFIX_ZERO, - 0 - ); - StrCat(NewString2, L"x "); - StrCat(NewString2, NewString); - HiiSetString(mHiiHandle, TokenToUpdate, NewString2, NULL); - } else { - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - } - } - - // - // Memory - // - } else if (CompareGuid(&Record->DataRecordGuid, &gEfiMemorySubClassGuid)) { - switch (DataHeader->RecordType) { - case EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER: - MemoryArrayLink = (EFI_MEMORY_ARRAY_LINK *)SrcData; - - if (MemoryArrayLink->MemorySpeed > 0) { - // - // Save the lowest speed memory module - // - if (MemoryArrayLink->MemorySpeed < mMemorySpeed) { - mMemorySpeed = MemoryArrayLink->MemorySpeed; - } - switch (DataHeader->SubInstance) { - case 1: - mMemorySpeedChannelASlot0 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelASlot0 = MemoryArrayLink->MemoryDeviceSize; - break; - case 2: - mMemorySpeedChannelASlot1 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelASlot1 = MemoryArrayLink->MemoryDeviceSize; - break; - case 3: - mMemorySpeedChannelBSlot0 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelBSlot0 = MemoryArrayLink->MemoryDeviceSize; - break; - case 4: - mMemorySpeedChannelBSlot1 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelBSlot1 = MemoryArrayLink->MemoryDeviceSize; - break; - case 5: - mMemorySpeedChannelCSlot0 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelCSlot0 = MemoryArrayLink->MemoryDeviceSize; - break; - case 6: - mMemorySpeedChannelCSlot1 = MemoryArrayLink->MemorySpeed; - mMemorySizeChannelCSlot1 = MemoryArrayLink->MemoryDeviceSize; - break; - default: - break; - } - } - break; - - case EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER: - MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS *)SrcData; - if (MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress) { - DataOutput = (UINTN)RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20); - EfiValueToString (NewString, DataOutput / 1024, PREFIX_ZERO, 0); - if(DataOutput % 1024) { - StrCat (NewString, L"."); - DataOutput = ((DataOutput % 1024) * 1000) / 1024; - while(!(DataOutput % 10)) - DataOutput = DataOutput / 10; - EfiValueToString (NewString2, DataOutput, PREFIX_ZERO, 0); - StrCat (NewString, NewString2); - } - StrCat (NewString, L" GB"); - TokenToUpdate = (STRING_REF)STR_TOTAL_MEMORY_SIZE_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - } - break; - - default: - break; - } - } - } - } - } while (!EFI_ERROR(Status) && (MonotonicCount != 0)); - - Status = GetBiosVersionDateTime ( - Version, - ReleaseDate, - ReleaseTime - ); - - DEBUG ((EFI_D_ERROR, "GetBiosVersionDateTime :%s %s %s \n", Version, ReleaseDate, ReleaseTime)); - if (!EFI_ERROR (Status)) { - UINTN Length = 0; - CHAR16 *BuildDateTime; - - Length = StrLen(ReleaseDate) + StrLen(ReleaseTime); - - BuildDateTime = AllocateZeroPool ((Length+2) * sizeof(CHAR16)); - StrCpy (BuildDateTime, ReleaseDate); - StrCat (BuildDateTime, L" "); - StrCat (BuildDateTime, ReleaseTime); - - TokenToUpdate = (STRING_REF)STR_BIOS_VERSION_VALUE; - DEBUG ((EFI_D_ERROR, "update STR_BIOS_VERSION_VALUE\n")); - HiiSetString(mHiiHandle, TokenToUpdate, Version, NULL); - - TokenToUpdate = (STRING_REF)STR_BIOS_BUILD_TIME_VALUE; - DEBUG ((EFI_D_ERROR, "update STR_BIOS_BUILD_TIME_VALUE\n")); - HiiSetString(mHiiHandle, TokenToUpdate, BuildDateTime, NULL); - } - - // - // Calculate and update memory speed display in Main Page - // - // - // Update the overall memory speed - // - if (mMemorySpeed != 0xffff) { - EfiValueToString (NewString, mMemorySpeed, PREFIX_ZERO, 0); - StrCat (NewString, L" MHz"); - - TokenToUpdate = (STRING_REF)STR_SYSTEM_MEMORY_SPEED_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, NewString, NULL); - } - - gBS->FreePool(NewString); - gBS->FreePool(NewString2); - - return; -} - -/** - - Routine Description: update the SETUP info for "Additional Information" which is SMBIOS info. - - @retval EFI_STATUS - -**/ -EFI_STATUS -UpdateAdditionalInformation ( - ) -{ - EFI_STATUS Status; - UINT64 MonotonicCount; - EFI_DATA_HUB_PROTOCOL *DataHub; - EFI_DATA_RECORD_HEADER *Record; - EFI_SUBCLASS_TYPE1_HEADER *DataHeader; - EFI_SMBIOS_PROTOCOL *Smbios; - EFI_SMBIOS_HANDLE SmbiosHandle; - EFI_SMBIOS_TABLE_HEADER *SmbiosRecord; - SMBIOS_TABLE_TYPE0 *Type0Record; - UINT8 StrIndex; - CHAR16 *BiosVersion = NULL; - CHAR16 *IfwiVersion = NULL; - UINT16 SearchIndex; - EFI_STRING_ID TokenToUpdate; -#if defined( RVP_SUPPORT ) && RVP_SUPPORT - EFI_MISC_SYSTEM_MANUFACTURER *SystemManufacturer; -#endif - - Status = gBS->LocateProtocol ( - &gEfiDataHubProtocolGuid, - NULL, - (void **)&DataHub - ); - - ASSERT_EFI_ERROR(Status); - - MonotonicCount = 0; - Record = NULL; - do { - Status = DataHub->GetNextRecord ( - DataHub, - &MonotonicCount, - NULL, - &Record - ); - if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) { - DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1); - - if (CompareGuid(&Record->DataRecordGuid, &gEfiMiscSubClassGuid) && - (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)) { -#if defined( RVP_SUPPORT ) && RVP_SUPPORT - // - // System Information - // - SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER *)(DataHeader + 1); - - // - // UUID (System Information) - // - SMBIOSString = EfiLibAllocateZeroPool (0x100); - GuidToString ( &SystemManufacturer->SystemUuid, SMBIOSString, 0x00 ); - - TokenToUpdate = (STRING_REF)STR_SYSTEM_UUID_VALUE; - HiiSetString(mHiiHandle, TokenToUpdate, SMBIOSString, NULL); - - gBS->FreePool(SMBIOSString); -#endif - } - } - } while (!EFI_ERROR(Status) && (MonotonicCount != 0)); - - Status = gBS->LocateProtocol ( - &gEfiSmbiosProtocolGuid, - NULL, - (VOID **) &Smbios - ); - ASSERT_EFI_ERROR (Status); - - SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; - do { - Status = Smbios->GetNext ( - Smbios, - &SmbiosHandle, - NULL, - &SmbiosRecord, - NULL - ); - if (SmbiosRecord->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) { - Type0Record = (SMBIOS_TABLE_TYPE0 *) SmbiosRecord; - StrIndex = Type0Record->BiosVersion; - GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &BiosVersion); - TokenToUpdate = STRING_TOKEN (STR_BIOS_VERSION_VALUE); - for (SearchIndex = 0x0; SearchIndex < SMBIOS_STRING_MAX_LENGTH; SearchIndex++) { - if (BiosVersion[SearchIndex] == 0x0020) { - BiosVersion[SearchIndex] = 0x0000; - IfwiVersion = (CHAR16 *)(&BiosVersion[SearchIndex+1]); - break; - } else if (BiosVersion[SearchIndex] == 0x0000) { - break; - } - } - HiiSetString (mHiiHandle, TokenToUpdate, BiosVersion, NULL); - - // - // Check IfwiVersion, to avoid no IFWI version in SMBIOS Type 0 strucntion - // - if(IfwiVersion) { - TokenToUpdate = STRING_TOKEN (STR_IFWI_VERSION_VALUE); - HiiSetString (mHiiHandle, TokenToUpdate, IfwiVersion, NULL); - } - } - } while (!EFI_ERROR(Status)); - - UpdateLatestBootTime(); - - return EFI_SUCCESS; -} - -VOID -UpdateCPUInformation () -{ - CHAR16 Buffer[40]; - UINT16 FamilyId; - UINT8 Model; - UINT8 SteppingId; - UINT8 ProcessorType; - EFI_STATUS Status; - EFI_MP_SERVICES_PROTOCOL *MpService; - UINTN MaximumNumberOfCPUs; - UINTN NumberOfEnabledCPUs; - UINT32 Buffer32 = 0xFFFFFFFF; // Keep buffer with unknown device - - EfiCpuVersion (&FamilyId, &Model, &SteppingId, &ProcessorType); - - // - //we need raw Model data - // - Model = Model & 0xf; - - // - //Family/Model/Step - // - UnicodeSPrint (Buffer, sizeof (Buffer), L"%d/%d/%d", FamilyId, Model, SteppingId); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PROCESSOR_ID_VALUE), Buffer, NULL); - - Status = gBS->LocateProtocol ( - &gEfiMpServiceProtocolGuid, - NULL, - (void **)&MpService - ); - if (!EFI_ERROR (Status)) { - // - // Determine the number of processors - // - MpService->GetNumberOfProcessors ( - MpService, - &MaximumNumberOfCPUs, - &NumberOfEnabledCPUs - ); - UnicodeSPrint (Buffer, sizeof (Buffer), L"%d", MaximumNumberOfCPUs); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PROCESSOR_CORE_VALUE), Buffer, NULL); - } - // - // Update Mobile / Desktop / Tablet SKU - // - Buffer32 =(UINT32) RShiftU64 (EfiReadMsr (MSR_IA32_PLATFORM_ID), 50) & 0x07; - - switch(Buffer32){ - case 0x0: - UnicodeSPrint (Buffer, sizeof (Buffer), L"(%d) - ISG SKU SOC", Buffer32); - break; - case 0x01: - UnicodeSPrint (Buffer, sizeof (Buffer), L"(%d) - Mobile SKU SOC", Buffer32); - break; - case 0x02: - UnicodeSPrint (Buffer, sizeof (Buffer), L"(%d) - Desktop SKU SOC", Buffer32); - break; - case 0x03: - UnicodeSPrint (Buffer, sizeof (Buffer), L"(%d) - Mobile SKU SOC", Buffer32); - break; - default: - UnicodeSPrint (Buffer, sizeof (Buffer), L"(%d) - Unknown SKU SOC", Buffer32); - break; - } - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PROCESSOR_SKU_VALUE), Buffer, NULL); - -} - - -EFI_STATUS -SearchChildHandle( - EFI_HANDLE Father, - EFI_HANDLE *Child - ) -{ - EFI_STATUS Status; - UINTN HandleIndex; - EFI_GUID **ProtocolGuidArray = NULL; - UINTN ArrayCount; - UINTN ProtocolIndex; - UINTN OpenInfoCount; - UINTN OpenInfoIndex; - EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo = NULL; - UINTN mHandleCount; - EFI_HANDLE *mHandleBuffer= NULL; - - // - // Retrieve the list of all handles from the handle database - // - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &mHandleCount, - &mHandleBuffer - ); - - for (HandleIndex = 0; HandleIndex < mHandleCount; HandleIndex++) - { - // - // Retrieve the list of all the protocols on each handle - // - Status = gBS->ProtocolsPerHandle ( - mHandleBuffer[HandleIndex], - &ProtocolGuidArray, - &ArrayCount - ); - if (!EFI_ERROR (Status)) - { - for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) - { - Status = gBS->OpenProtocolInformation ( - mHandleBuffer[HandleIndex], - ProtocolGuidArray[ProtocolIndex], - &OpenInfo, - &OpenInfoCount - ); - if (!EFI_ERROR (Status)) - { - for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) - { - if(OpenInfo[OpenInfoIndex].AgentHandle == Father) - { - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) - { - *Child = mHandleBuffer[HandleIndex]; - Status = EFI_SUCCESS; - goto TryReturn; - } - } - } - Status = EFI_NOT_FOUND; - } - } - if(OpenInfo != NULL) - { - FreePool(OpenInfo); - OpenInfo = NULL; - } - } - FreePool (ProtocolGuidArray); - ProtocolGuidArray = NULL; - } -TryReturn: - if(OpenInfo != NULL) - { - FreePool (OpenInfo); - OpenInfo = NULL; - } - if(ProtocolGuidArray != NULL) - { - FreePool(ProtocolGuidArray); - ProtocolGuidArray = NULL; - } - if(mHandleBuffer != NULL) - { - FreePool (mHandleBuffer); - mHandleBuffer = NULL; - } - return Status; -} - -EFI_STATUS -JudgeHandleIsPCIDevice( - EFI_HANDLE Handle, - UINT8 Device, - UINT8 Funs - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH *DPath; - - Status = gBS->HandleProtocol ( - Handle, - &gEfiDevicePathProtocolGuid, - (VOID **) &DPath - ); - if(!EFI_ERROR(Status)) - { - while(!IsDevicePathEnd(DPath)) - { - if((DPath->Type == HARDWARE_DEVICE_PATH) && (DPath->SubType == HW_PCI_DP)) - { - PCI_DEVICE_PATH *PCIPath; - - PCIPath = (PCI_DEVICE_PATH*) DPath; - DPath = NextDevicePathNode(DPath); - if(IsDevicePathEnd(DPath) && (PCIPath->Device == Device) && (PCIPath->Function == Funs)) - { - return EFI_SUCCESS; - } - } - else - { - DPath = NextDevicePathNode(DPath); - } - } - } - return EFI_UNSUPPORTED; -} - -EFI_STATUS -GetDriverName( - EFI_HANDLE Handle, - CHAR16 *Name - ) -{ - EFI_DRIVER_BINDING_PROTOCOL *BindHandle = NULL; - EFI_STATUS Status; - UINT32 Version; - UINT16 *Ptr; - Status = gBS->OpenProtocol( - Handle, - &gEfiDriverBindingProtocolGuid, - (VOID**)&BindHandle, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR(Status)) - { - return EFI_NOT_FOUND; - } - - Version = BindHandle->Version; - Ptr = (UINT16*)&Version; - UnicodeSPrint(Name, 40, L"%d.%d.%d", Version >> 24 , (Version >>16)& 0x0f ,*(Ptr)); - - return EFI_SUCCESS; -} - -EFI_STATUS -GetGOPDriverName( - CHAR16 *Name - ) -{ - UINTN HandleCount; - EFI_HANDLE *Handles= NULL; - UINTN Index; - EFI_STATUS Status; - EFI_HANDLE Child = 0; - - Status = gBS->LocateHandleBuffer( - ByProtocol, - &gEfiDriverBindingProtocolGuid, - NULL, - &HandleCount, - &Handles - ); - for (Index = 0; Index < HandleCount ; Index++) - { - Status = SearchChildHandle(Handles[Index], &Child); - if(!EFI_ERROR(Status)) - { - Status = JudgeHandleIsPCIDevice( - Child, - 0x02, - 0x00 - ); - if(!EFI_ERROR(Status)) - { - return GetDriverName(Handles[Index], Name); - } - } - } - return EFI_UNSUPPORTED; -} - -EFI_STATUS -UpdatePlatformInformation ( - ) -{ - UINT32 MicroCodeVersion; - CHAR16 Buffer[40]; - UINT8 IgdVBIOSRevH; - UINT8 IgdVBIOSRevL; - UINT16 EDX; - EFI_IA32_REGISTER_SET RegSet; - EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL; - EFI_STATUS Status; - UINT8 CpuFlavor=0; - EFI_PEI_HOB_POINTERS GuidHob; - UINTN NumHandles; - EFI_HANDLE *HandleBuffer; - UINTN Index; - DXE_PCH_PLATFORM_POLICY_PROTOCOL *PchPlatformPolicy; - UINTN PciD31F0RegBase; - UINT8 count; - UINT8 Data8; - UINT8 PIDData8; - - CHAR16 Name[40]; - UINT32 MrcVersion; - - // - // Get the HOB list. If it is not present, then ASSERT. - // - GuidHob.Raw = GetHobList (); - if (GuidHob.Raw != NULL) { - if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) { - mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid); - } - } - - // - //VBIOS version - // - Status = gBS->LocateProtocol( - &gEfiLegacyBiosProtocolGuid, - NULL, - (void **)&LegacyBios - ); - if (!EFI_ERROR (Status)) { - RegSet.X.AX = 0x5f01; - Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet); - ASSERT_EFI_ERROR(Status); - - // - // simulate AMI int15 (ax=5f01) handler - // check NbInt15.asm in AMI code for asm edition - // - EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff); - IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F)); - IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F)); - - if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0){ - HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL); - HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL); - } - } - - Status = GetGOPDriverName(Name); - - if (!EFI_ERROR(Status)) - { - HiiSetString(mHiiHandle, STRING_TOKEN(STR_GOP_VALUE), Name, NULL); - } - - - // - // CpuFlavor - // ISG-DC Tablet 000 - // VLV-QC Tablet 001 - // VLV-QC Desktop 010 - // VLV-QC Notebook 011 - // - CpuFlavor = RShiftU64 (EfiReadMsr (MSR_IA32_PLATFORM_ID), 50) & 0x07; - - switch(CpuFlavor){ - case 0x0: - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-DC Tablet", CpuFlavor); - break; - case 0x01: - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Notebook", CpuFlavor); - break; - case 0x02: - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Desktop", CpuFlavor); - break; - case 0x03: - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Notebook", CpuFlavor); - break; - default: - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"Unknown CPU", CpuFlavor); - break; - } - HiiSetString(mHiiHandle,STRING_TOKEN(STR_CPU_FLAVOR_VALUE), Buffer, NULL); - - if ( NULL != mPlatformInfo) { - // - //BoardId - // - switch(mPlatformInfo->BoardId){ - case 0x2: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAY LAKE RVP(%02x)", mPlatformInfo->BoardId); - break; - - case 0x4: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAY LAKE FFRD(%02x)", mPlatformInfo->BoardId); - break; - - case 0x5: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAY ROCK RVP DDR3L (%02x)", mPlatformInfo->BoardId); - break; - - case 0x20: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAYLEY BAY (%02x)", mPlatformInfo->BoardId); - break; - - case 0x30: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAKER SPORT (%02x)", mPlatformInfo->BoardId); - break; - - case 0x0: - UnicodeSPrint (Buffer, sizeof (Buffer), L"ALPINE VALLEY (%x)", mPlatformInfo->BoardId); - break; - - case 0x3: - UnicodeSPrint (Buffer, sizeof (Buffer), L"BAY LAKE FFD8 (%x)", mPlatformInfo->BoardId); - break; - - default: - UnicodeSPrint (Buffer, sizeof (Buffer), L"Unknown BOARD (%02x)", mPlatformInfo->BoardId); - break; - } - HiiSetString(mHiiHandle,STRING_TOKEN(STR_BOARD_ID_VALUE), Buffer, NULL); - - - // - // Get Board FAB ID Info from protocol, update into the NVS area. - // bit0~bit3 are for Fab ID, 0x0F means unknow FAB. - // - if(mPlatformInfo->BoardRev == 0x0F) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", L"Unknown FAB"); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_FAB_ID_VALUE), Buffer, NULL); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%2x", mPlatformInfo->BoardRev); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_FAB_ID_VALUE), Buffer, NULL); - } - } - - // - //Update MRC Version - // - MrcVersion = 0x00000000; - MrcVersion &= 0xffff; - Index = EfiValueToString (Buffer, MrcVersion/100, PREFIX_ZERO, 0); - StrCat (Buffer, L"."); - EfiValueToString (Buffer + Index + 1, (MrcVersion%100)/10, PREFIX_ZERO, 0); - EfiValueToString (Buffer + Index + 2, (MrcVersion%100)%10, PREFIX_ZERO, 0); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_MRC_VERSION_VALUE), Buffer, NULL); - - // - //Update Soc Version - // - - // - // Retrieve all instances of PCH Platform Policy protocol - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gDxePchPlatformPolicyProtocolGuid, - NULL, - &NumHandles, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - // - // Find the matching PCH Policy protocol - // - for (Index = 0; Index < NumHandles; Index++) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gDxePchPlatformPolicyProtocolGuid, - (void **)&PchPlatformPolicy - ); - if (!EFI_ERROR (Status)) { - PciD31F0RegBase = MmPciAddress ( - 0, - PchPlatformPolicy->BusNumber, - PCI_DEVICE_NUMBER_PCH_LPC, - PCI_FUNCTION_NUMBER_PCH_LPC, - 0 - ); - - Data8 = MmioRead8 (PciD31F0RegBase + R_PCH_LPC_RID_CC); - count = ARRAY_SIZE (SBRevisionTable); - for (Index = 0; Index < count; Index++) { - if(Data8 == SBRevisionTable[Index].RevId) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%02x %a", Data8, SBRevisionTable[Index].String); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_SOC_VALUE), Buffer, NULL); - break; - } - } - break; - } - } - } - - // - // Microcode Revision - // - EfiWriteMsr (EFI_MSR_IA32_BIOS_SIGN_ID, 0); - EfiCpuid (EFI_CPUID_VERSION_INFO, NULL); - MicroCodeVersion = (UINT32) RShiftU64 (EfiReadMsr (EFI_MSR_IA32_BIOS_SIGN_ID), 32); - UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", MicroCodeVersion); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PROCESSOR_MICROCODE_VALUE), Buffer, NULL); - - // - // Punit Version - // - Data8 = 0; - UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%x", Data8); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PUNIT_FW_VALUE), Buffer, NULL); - - // - // PMC Version - // - Data8 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>16)&0x00FF); - PIDData8 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>24)&0x00FF); - UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%X_%X",PIDData8, Data8); - HiiSetString(mHiiHandle,STRING_TOKEN(STR_PMC_FW_VALUE), Buffer, NULL); - - return EFI_SUCCESS; -} - -/** - - Update SATA Drivesize Strings for Setup and Boot order - - @param NewString - pointer to string. - @param DeviceSpeed - speed of drive. - -**/ -VOID -GetDeviceSpeedString ( - CHAR16 *NewString, - IN UINTN DeviceSpeed - ) -{ - if (DeviceSpeed == 0x01) { - StrCat (NewString, L"1.5Gb/s"); - } else if (DeviceSpeed == 0x02) { - StrCat (NewString, L"3.0Gb/s"); - } else if (DeviceSpeed == 0x03) { - StrCat (NewString, L"6.0Gb/s"); - } else if (DeviceSpeed == 0x0) { - - } -} - -UINT8 -GetChipsetSataPortSpeed ( - UINTN PortNum - ) -{ - UINT32 DeviceSpeed; - UINT8 DeviceConfigStatus; - UINT32 IdeAhciBar; - EFI_PHYSICAL_ADDRESS MemBaseAddress = 0; - UINT8 FunNum; - - DeviceSpeed = 0x01; // generation 1 - - - // - // Allocate the AHCI BAR - // - FunNum = PCI_FUNCTION_NUMBER_PCH_SATA; - MemBaseAddress = 0x0ffffffff; - gDS->AllocateMemorySpace ( - EfiGcdAllocateMaxAddressSearchBottomUp, - EfiGcdMemoryTypeMemoryMappedIo, - N_PCH_SATA_ABAR_ALIGNMENT, // 2^11: 2K Alignment - V_PCH_SATA_ABAR_LENGTH, // 2K Length - &MemBaseAddress, - mImageHandle, - NULL - ); - IdeAhciBar = MmioRead32 ( - MmPciAddress ( - 0, - 0, - PCI_DEVICE_NUMBER_PCH_SATA, - FunNum, - R_PCH_SATA_ABAR - ) - ); - IdeAhciBar &= 0xFFFFF800; - DeviceConfigStatus = 0; - if (IdeAhciBar == 0) { - DeviceConfigStatus = 1; - IdeAhciBar = (UINT32)MemBaseAddress; - MmioWrite32 ( - MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, FunNum, R_PCH_SATA_ABAR), - IdeAhciBar - ); - MmioOr16 ( - MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, FunNum, R_PCH_SATA_COMMAND), - B_PCH_SATA_COMMAND_MSE - ); - } - - if (mSystemConfiguration.SataType == PCH_SATA_MODE_IDE){ - // - // Program the "Ports Implemented Register" - // - MmioAndThenOr32 (IdeAhciBar + R_PCH_SATA_AHCI_PI, (UINT32)~(B_PCH_SATA_PORT0_IMPLEMENTED + B_PCH_SATA_PORT1_IMPLEMENTED), (UINT32)(B_PCH_SATA_PORT0_IMPLEMENTED + B_PCH_SATA_PORT1_IMPLEMENTED)); - } - - switch (PortNum) - { - case 0: - DeviceSpeed = *(volatile UINT32 *)(UINTN)(IdeAhciBar + R_PCH_SATA_AHCI_P0SSTS); - break; - case 1: - DeviceSpeed = *(volatile UINT32 *)(UINTN)(IdeAhciBar + R_PCH_SATA_AHCI_P1SSTS); - break; - } - - if (MemBaseAddress) { - gDS->FreeMemorySpace ( - MemBaseAddress, - V_PCH_SATA_ABAR_LENGTH - ); - } - - if (DeviceConfigStatus) { - IdeAhciBar = 0; - MmioWrite32 ( - MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, FunNum, R_PCH_SATA_ABAR), - IdeAhciBar - ); - } - - DeviceSpeed = (UINT8)((DeviceSpeed >> 4) & 0x0F); - - return (UINT8)DeviceSpeed; -} - -/** - - IDE data filter function. - -**/ -void -IdeDataFilter (void) -{ - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - EFI_DISK_INFO_PROTOCOL *DiskInfo; - EFI_DEVICE_PATH_PROTOCOL *DevicePath, *DevicePathNode; - PCI_DEVICE_PATH *PciDevicePath; - UINTN Index; - UINT8 Index1; - UINT32 BufferSize; - UINT32 DriveSize; - UINT32 IdeChannel; - UINT32 IdeDevice; - EFI_ATA_IDENTIFY_DATA *IdentifyDriveInfo; - CHAR16 *NewString; - CHAR16 SizeString[20]; - STRING_REF NameToUpdate; - CHAR8 StringBuffer[0x100]; - UINT32 DeviceSpeed; - UINTN PortNumber; - - // - // Assume no line strings is longer than 256 bytes. - // - NewString = AllocateZeroPool (0x100); - PciDevicePath = NULL; - - // - // Fill IDE Infomation - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiDiskInfoProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - - if (EFI_ERROR (Status)) { - return; - } - - for (Index = 0; Index < HandleCount; Index++) { - - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiDevicePathProtocolGuid, - (VOID*)&DevicePath - ); - ASSERT_EFI_ERROR (Status); - - DevicePathNode = DevicePath; - while (!IsDevicePathEnd (DevicePathNode) ) { - if ((DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH) && - ( DevicePathSubType (DevicePathNode) == HW_PCI_DP)) { - PciDevicePath = (PCI_DEVICE_PATH *) DevicePathNode; - break; - } - DevicePathNode = NextDevicePathNode (DevicePathNode); - } - - if (PciDevicePath == NULL) { - continue; - } - - // - // Check for onboard IDE - // - if (PciDevicePath->Device== PCI_DEVICE_NUMBER_PCH_SATA) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiDiskInfoProtocolGuid, - (void **)&DiskInfo - ); - ASSERT_EFI_ERROR (Status); - - Status = DiskInfo->WhichIde ( - DiskInfo, - &IdeChannel, - &IdeDevice - ); - ASSERT_EFI_ERROR (Status); - - IdentifyDriveInfo = AllocatePool (sizeof(EFI_ATA_IDENTIFY_DATA)); - - BufferSize = sizeof(EFI_ATA_IDENTIFY_DATA); - Status = DiskInfo->Identify ( - DiskInfo, - IdentifyDriveInfo, - &BufferSize - ); - ASSERT_EFI_ERROR(Status); - - // - // Onboard SATA Devices - // - if (PciDevicePath->Function == PCI_FUNCTION_NUMBER_PCH_SATA) { - if (IdeChannel == 0 && IdeDevice == 0) { - NameToUpdate = (STRING_REF)STR_SATA0_NAME; - } else if (IdeChannel == 1 && IdeDevice == 0) { - NameToUpdate = (STRING_REF)STR_SATA1_NAME; - } else { - continue; - } - } else { - continue; - } - - ZeroMem(StringBuffer, sizeof(StringBuffer)); - CopyMem( - StringBuffer, - (CHAR8 *)&IdentifyDriveInfo->ModelName, - sizeof(IdentifyDriveInfo->ModelName) - ); - SwapEntries(StringBuffer); - AsciiToUnicode(StringBuffer, NewString); - - // - // Chap it off after 16 characters - // - NewString[16] = 0; - - // - // For HardDisk append the size. Otherwise display atapi - // - if ((IdentifyDriveInfo->config & 0x8000) == 00) { - // - // 48 bit address feature set is supported, get maximum capacity - // - if ((IdentifyDriveInfo->command_set_supported_83 & 0x0400) == 0) { - DriveSize = (((((IdentifyDriveInfo->user_addressable_sectors_hi << 16) + - IdentifyDriveInfo->user_addressable_sectors_lo) / 1000) * 512) / 1000); - } else { - DriveSize = IdentifyDriveInfo->maximum_lba_for_48bit_addressing[0]; - for (Index1 = 1; Index1 < 4; Index1++) { - // - // Lower byte goes first: word[100] is the lowest word, word[103] is highest - // - DriveSize |= LShiftU64(IdentifyDriveInfo->maximum_lba_for_48bit_addressing[Index1], 16 * Index1); - } - DriveSize = (UINT32) DivU64x32(MultU64x32(DivU64x32(DriveSize, 1000), 512), 1000); - } - - StrCat (NewString, L"("); - EfiValueToString (SizeString, DriveSize/1000, PREFIX_BLANK, 0); - StrCat (NewString, SizeString); - StrCat (NewString, L"."); - EfiValueToString (SizeString, (DriveSize%1000)/100, PREFIX_BLANK, 0); - StrCat (NewString, SizeString); - StrCat (NewString, L"GB"); - } else { - StrCat (NewString, L"(ATAPI"); - } - - // - // Update SPEED. - // - PortNumber = (IdeDevice << 1) + IdeChannel; - DeviceSpeed = GetChipsetSataPortSpeed(PortNumber); - - if (DeviceSpeed) { - StrCat (NewString, L"-"); - GetDeviceSpeedString( NewString, DeviceSpeed); - } - - StrCat (NewString, L")"); - - HiiSetString(mHiiHandle, NameToUpdate, NewString, NULL); - - } - } - - if (HandleBuffer != NULL) { - gBS->FreePool (HandleBuffer); - } - - gBS->FreePool(NewString); - - return; -} - - -VOID -EFIAPI -SetupInfo (void) -{ - EFI_STATUS Status; - UINTN VarSize; - EFI_PEI_HOB_POINTERS GuidHob; - - if (mSetupInfoDone) { - return; - } - - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - NORMAL_SETUP_NAME, - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - - if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { - //The setup variable is corrupted - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"SetupRecovery", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - ASSERT_EFI_ERROR (Status); - } - - // - // Update HOB variable for PCI resource information - // Get the HOB list. If it is not present, then ASSERT. - // - GuidHob.Raw = GetHobList (); - if (GuidHob.Raw != NULL) { - if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) { - mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid); - } - } - - - PrepareSetupInformation(); - UpdateAdditionalInformation (); - UpdatePlatformInformation(); - UpdateCPUInformation(); - IdeDataFilter(); - mSetupInfoDone = TRUE; - - return; -} - - -#define EFI_SECURE_BOOT_MODE_NAME L"SecureBoot" - -VOID -CheckSystemConfigLoad(SYSTEM_CONFIGURATION *SystemConfigPtr) -{ - EFI_STATUS Status; - UINT8 SecureBoot; - UINTN DataSize; - - - DataSize = sizeof(SecureBoot); - Status = gRT->GetVariable ( - EFI_SECURE_BOOT_MODE_NAME, - &gEfiGlobalVariableGuid, - NULL, - &DataSize, - &SecureBoot - ); - - if (EFI_ERROR(Status)) { - SystemConfigPtr->SecureBoot = 0; - } else { - SystemConfigPtr->SecureBoot = SecureBoot; - } -} - - -// -// "SecureBootEnable" variable for the Secure boot feature enable/disable. -// -#define EFI_SECURE_BOOT_ENABLE_NAME L"SecureBootEnable" -extern EFI_GUID gEfiSecureBootEnableDisableGuid; - - -VOID -CheckSystemConfigSave(SYSTEM_CONFIGURATION *SystemConfigPtr) -{ - EFI_STATUS Status; - UINT8 SecureBootCfg; - BOOLEAN SecureBootNotFound; - UINTN DataSize; - - - // - // Secure Boot configuration changes - // - DataSize = sizeof(SecureBootCfg); - SecureBootNotFound = FALSE; - Status = gRT->GetVariable ( - EFI_SECURE_BOOT_ENABLE_NAME, - &gEfiSecureBootEnableDisableGuid, - NULL, - &DataSize, - &SecureBootCfg - ); - - if (EFI_ERROR(Status)) { - SecureBootNotFound = TRUE; - } - if (SecureBootNotFound) { - Status = gRT->GetVariable ( - EFI_SECURE_BOOT_ENABLE_NAME, - &gEfiSecureBootEnableDisableGuid, - NULL, - &DataSize, - &SecureBootCfg - ); - ASSERT_EFI_ERROR(Status); - } - if ((SecureBootCfg) != SystemConfigPtr->SecureBoot) { - SecureBootCfg = !SecureBootCfg; - Status = gRT->SetVariable ( - EFI_SECURE_BOOT_ENABLE_NAME, - &gEfiSecureBootEnableDisableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof (UINT8), - &SecureBootCfg - ); - } - -} - -VOID -ConfirmSecureBootTest() -{ - -} -