+++ /dev/null
-/** @file\r
-\r
-Copyright (c) 2006 - 2010, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- DataHubGen.c\r
-\r
-Abstract:\r
-\r
-**/\r
-\r
-#include "DataHubGen.h"\r
-EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
-\r
-extern UINT8 DataHubGenDxeStrings[];\r
-\r
-EFI_DATA_HUB_PROTOCOL *gDataHub;\r
-EFI_HII_HANDLE gStringHandle;\r
-\r
-VOID *\r
-GetSmbiosTablesFromHob (\r
- VOID\r
- )\r
-{\r
- EFI_PHYSICAL_ADDRESS *Table;\r
- EFI_PEI_HOB_POINTERS GuidHob;\r
- //\r
- // Get Hob List\r
- //\r
- GuidHob.Raw = GetFirstGuidHob (&gEfiSmbiosTableGuid);\r
- if (GuidHob.Raw != NULL) {\r
- Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
- if (Table != NULL) {\r
- return (VOID *)(UINTN)*Table;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {\r
- EFI_PROCESSOR_SUBCLASS_VERSION, // Version\r
- sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
- 0, // Instance, Initialize later\r
- EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
- 0 // RecordType, Initialize later\r
-};\r
-\r
-VOID\r
-InstallProcessorDataHub (\r
- IN VOID *Smbios\r
- )\r
-{\r
- EFI_STATUS Status;\r
- SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
- EFI_CPU_DATA_RECORD DataRecord;\r
- CHAR8 *AString;\r
- CHAR16 *UString;\r
- STRING_REF Token;\r
-\r
- //\r
- // Processor info (TYPE 4)\r
- // \r
- SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
- if (SmbiosTable.Raw == NULL) {\r
- DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
- return ;\r
- }\r
-\r
- //\r
- // Record Header\r
- //\r
- CopyMem (&DataRecord, &mCpuDataRecordHeader, sizeof (DataRecord.DataRecordHeader));\r
-\r
- //\r
- // Record Type 1\r
- //\r
- DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
- DataRecord.VariableRecord.ProcessorCoreFrequency.Value = SmbiosTable.Type4->CurrentSpeed;\r
- DataRecord.VariableRecord.ProcessorCoreFrequency.Exponent = 6;\r
-\r
- Status = gDataHub->LogData (\r
- gDataHub,\r
- &gEfiProcessorSubClassGuid,\r
- &gEfiCallerIdGuid,\r
- EFI_DATA_RECORD_CLASS_DATA,\r
- &DataRecord,\r
- sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Record Type 3\r
- //\r
- AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
- UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
- ASSERT (UString != NULL);\r
- AsciiStrToUnicodeStr (AString, UString);\r
-\r
- Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
- if (Token == 0) {\r
- gBS->FreePool (UString);\r
- return ;\r
- }\r
- gBS->FreePool (UString);\r
-\r
- DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
- DataRecord.VariableRecord.ProcessorVersion = Token;\r
-\r
- Status = gDataHub->LogData (\r
- gDataHub,\r
- &gEfiProcessorSubClassGuid,\r
- &gEfiCallerIdGuid,\r
- EFI_DATA_RECORD_CLASS_DATA,\r
- &DataRecord,\r
- sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- return ;\r
-}\r
-\r
-VOID\r
-InstallCacheDataHub (\r
- IN VOID *Smbios\r
- )\r
-{\r
- return ;\r
-}\r
-\r
-EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader = {\r
- EFI_MEMORY_SUBCLASS_VERSION, // Version\r
- sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
- 0, // Instance, Initialize later\r
- EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
- 0 // RecordType, Initialize later\r
-};\r
-\r
-VOID\r
-InstallMemoryDataHub (\r
- IN VOID *Smbios\r
- )\r
-{\r
- SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
- EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord;\r
-\r
- //\r
- // Generate Memory Array Mapped Address info (TYPE 19)\r
- //\r
- SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
- if (SmbiosTable.Raw == NULL) {\r
- DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
- return ;\r
- }\r
-\r
- //\r
- // Record Header\r
- //\r
- CopyMem (&DataRecord, &mMemorySubclassDriverDataHeader, sizeof (DataRecord.Header));\r
- \r
- //\r
- // Record Type 4\r
- //\r
- DataRecord.Header.RecordType = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
- DataRecord.Record.ArrayStartAddress.MemoryArrayStartAddress = LShiftU64(SmbiosTable.Type19->StartingAddress, 10);\r
- DataRecord.Record.ArrayStartAddress.MemoryArrayEndAddress = LShiftU64((UINT64) SmbiosTable.Type19->EndingAddress + 1, 10) - 1;\r
- \r
- CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiCallerIdGuid);\r
- DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance = 0;\r
- DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
- DataRecord.Record.ArrayStartAddress.MemoryArrayPartitionWidth = (UINT16)(SmbiosTable.Type19->PartitionWidth); \r
-\r
- gDataHub->LogData (\r
- gDataHub,\r
- &gEfiMemorySubClassGuid,\r
- &gEfiCallerIdGuid,\r
- EFI_DATA_RECORD_CLASS_DATA,\r
- &DataRecord,\r
- sizeof (DataRecord.Header) + sizeof (DataRecord.Record.ArrayStartAddress)\r
- );\r
-\r
- return ;\r
-}\r
-\r
-EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader = {\r
- EFI_MISC_SUBCLASS_VERSION, // Version\r
- sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
- 0, // Instance, Initialize later\r
- EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
- 0 // RecordType, Initialize later\r
-};\r
-\r
-VOID\r
-InstallMiscDataHub (\r
- IN VOID *Smbios\r
- )\r
-{\r
- EFI_STATUS Status;\r
- SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
- EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord;\r
- CHAR8 *AString;\r
- CHAR16 *UString;\r
- STRING_REF Token;\r
-\r
- //\r
- // BIOS information (TYPE 0)\r
- // \r
- SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
- if (SmbiosTable.Raw == NULL) {\r
- DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
- return ;\r
- }\r
-\r
- //\r
- // Record Header\r
- //\r
- CopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));\r
-\r
- //\r
- // Record Type 2\r
- //\r
- AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
- UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
- ASSERT (UString != NULL);\r
- CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
- AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
-\r
- Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
- if (Token == 0) {\r
- gBS->FreePool (UString);\r
- return ;\r
- }\r
- gBS->FreePool (UString);\r
-\r
- DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;\r
- DataRecord.Record.MiscBiosVendor.BiosVendor = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosVersion = Token;\r
- DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;\r
-// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};\r
-// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};\r
- DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;\r
- DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;\r
-\r
- Status = gDataHub->LogData (\r
- gDataHub,\r
- &gEfiMiscSubClassGuid,\r
- &gEfiCallerIdGuid,\r
- EFI_DATA_RECORD_CLASS_DATA,\r
- &DataRecord,\r
- sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // System information (TYPE 1)\r
- // \r
- SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
- if (SmbiosTable.Raw == NULL) {\r
- DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
- return ;\r
- }\r
-\r
- //\r
- // Record Type 3\r
- //\r
- AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
- UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
- ASSERT (UString != NULL);\r
- CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
- AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
-\r
- Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
- if (Token == 0) {\r
- gBS->FreePool (UString);\r
- return ;\r
- }\r
- gBS->FreePool (UString);\r
-\r
- DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
- DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
- DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
- DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
- DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
-// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
- DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
- DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
- DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
-\r
- Status = gDataHub->LogData (\r
- gDataHub,\r
- &gEfiMiscSubClassGuid,\r
- &gEfiCallerIdGuid,\r
- EFI_DATA_RECORD_CLASS_DATA,\r
- &DataRecord,\r
- sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return ;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DataHubGenEntrypoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- VOID *Smbios;\r
-\r
- Smbios = GetSmbiosTablesFromHob ();\r
- if (Smbios == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDataHubProtocolGuid,\r
- NULL,\r
- (VOID**)&gDataHub\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiDatabaseProtocolGuid,\r
- NULL,\r
- (VOID**)&gHiiDatabase\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- \r
- gStringHandle = HiiAddPackages (\r
- &gEfiCallerIdGuid,\r
- NULL,\r
- DataHubGenDxeStrings,\r
- NULL\r
- );\r
- ASSERT (gStringHandle != NULL);\r
-\r
- InstallProcessorDataHub (Smbios);\r
- InstallCacheDataHub (Smbios);\r
- InstallMemoryDataHub (Smbios);\r
- InstallMiscDataHub (Smbios);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-//\r
-// Internal function\r
-//\r
-\r
-UINTN\r
-SmbiosTableLength (\r
- IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
- )\r
-{\r
- CHAR8 *AChar;\r
- UINTN Length;\r
-\r
- AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
- while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
- AChar ++;\r
- }\r
- Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
- \r
- return Length;\r
-}\r
-\r
-SMBIOS_STRUCTURE_POINTER\r
-GetSmbiosTableFromType (\r
- IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
- IN UINT8 Type,\r
- IN UINTN Index\r
- )\r
-{\r
- SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
- UINTN SmbiosTypeIndex;\r
- \r
- SmbiosTypeIndex = 0;\r
- SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
- if (SmbiosTable.Raw == NULL) {\r
- return SmbiosTable;\r
- }\r
- while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
- if (SmbiosTable.Hdr->Type == 127) {\r
- SmbiosTable.Raw = NULL;\r
- return SmbiosTable;\r
- }\r
- if (SmbiosTable.Hdr->Type == Type) {\r
- SmbiosTypeIndex ++;\r
- }\r
- SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
- }\r
-\r
- return SmbiosTable;\r
-}\r
-\r
-CHAR8 *\r
-GetSmbiosString (\r
- IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
- IN SMBIOS_TABLE_STRING String\r
- )\r
-{\r
- CHAR8 *AString;\r
- UINT8 Index;\r
-\r
- Index = 1;\r
- AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
- while (Index != String) {\r
- while (*AString != 0) {\r
- AString ++;\r
- }\r
- AString ++;\r
- if (*AString == 0) {\r
- return AString;\r
- }\r
- Index ++;\r
- }\r
-\r
- return AString;\r
-}\r