3 Copyright (c) 2006 - 2010, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include "DataHubGen.h"
21 EFI_HII_DATABASE_PROTOCOL
*gHiiDatabase
;
23 extern UINT8 DataHubGenDxeStrings
[];
25 EFI_DATA_HUB_PROTOCOL
*gDataHub
;
26 EFI_HII_HANDLE gStringHandle
;
29 GetSmbiosTablesFromHob (
33 EFI_PHYSICAL_ADDRESS
*Table
;
34 EFI_PEI_HOB_POINTERS GuidHob
;
38 GuidHob
.Raw
= GetFirstGuidHob (&gEfiSmbiosTableGuid
);
39 if (GuidHob
.Raw
!= NULL
) {
40 Table
= GET_GUID_HOB_DATA (GuidHob
.Guid
);
42 return (VOID
*)(UINTN
)*Table
;
49 EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader
= {
50 EFI_PROCESSOR_SUBCLASS_VERSION
, // Version
51 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
52 0, // Instance, Initialize later
53 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
54 0 // RecordType, Initialize later
58 InstallProcessorDataHub (
63 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
64 EFI_CPU_DATA_RECORD DataRecord
;
70 // Processor info (TYPE 4)
72 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 4, 0);
73 if (SmbiosTable
.Raw
== NULL
) {
74 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
81 CopyMem (&DataRecord
, &mCpuDataRecordHeader
, sizeof (DataRecord
.DataRecordHeader
));
86 DataRecord
.DataRecordHeader
.RecordType
= ProcessorCoreFrequencyRecordType
;
87 DataRecord
.VariableRecord
.ProcessorCoreFrequency
.Value
= SmbiosTable
.Type4
->CurrentSpeed
;
88 DataRecord
.VariableRecord
.ProcessorCoreFrequency
.Exponent
= 6;
90 Status
= gDataHub
->LogData (
92 &gEfiProcessorSubClassGuid
,
94 EFI_DATA_RECORD_CLASS_DATA
,
96 sizeof (DataRecord
.DataRecordHeader
) + sizeof (DataRecord
.VariableRecord
.ProcessorCoreFrequency
)
98 ASSERT_EFI_ERROR (Status
);
102 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type4
->ProcessorVersion
);
103 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
));
104 ASSERT (UString
!= NULL
);
105 AsciiStrToUnicodeStr (AString
, UString
);
107 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
109 gBS
->FreePool (UString
);
112 gBS
->FreePool (UString
);
114 DataRecord
.DataRecordHeader
.RecordType
= ProcessorVersionRecordType
;
115 DataRecord
.VariableRecord
.ProcessorVersion
= Token
;
117 Status
= gDataHub
->LogData (
119 &gEfiProcessorSubClassGuid
,
121 EFI_DATA_RECORD_CLASS_DATA
,
123 sizeof (DataRecord
.DataRecordHeader
) + sizeof (DataRecord
.VariableRecord
.ProcessorVersion
)
125 ASSERT_EFI_ERROR (Status
);
130 InstallCacheDataHub (
137 EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader
= {
138 EFI_MEMORY_SUBCLASS_VERSION
, // Version
139 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
140 0, // Instance, Initialize later
141 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
142 0 // RecordType, Initialize later
146 InstallMemoryDataHub (
150 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
151 EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord
;
154 // Generate Memory Array Mapped Address info (TYPE 19)
156 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 19, 0);
157 if (SmbiosTable
.Raw
== NULL
) {
158 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
165 CopyMem (&DataRecord
, &mMemorySubclassDriverDataHeader
, sizeof (DataRecord
.Header
));
170 DataRecord
.Header
.RecordType
= EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER
;
171 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayStartAddress
= LShiftU64(SmbiosTable
.Type19
->StartingAddress
, 10);
172 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayEndAddress
= LShiftU64((UINT64
) SmbiosTable
.Type19
->EndingAddress
+ 1, 10) - 1;
174 CopyGuid (&DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.ProducerName
, &gEfiCallerIdGuid
);
175 DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.Instance
= 0;
176 DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.SubInstance
= EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
;
177 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayPartitionWidth
= (UINT16
)(SmbiosTable
.Type19
->PartitionWidth
);
181 &gEfiMemorySubClassGuid
,
183 EFI_DATA_RECORD_CLASS_DATA
,
185 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.ArrayStartAddress
)
191 EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader
= {
192 EFI_MISC_SUBCLASS_VERSION
, // Version
193 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
194 0, // Instance, Initialize later
195 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
196 0 // RecordType, Initialize later
205 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
206 EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord
;
212 // BIOS information (TYPE 0)
214 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 0, 0);
215 if (SmbiosTable
.Raw
== NULL
) {
216 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
223 CopyMem (&DataRecord
, &mMiscSubclassDriverDataHeader
, sizeof (DataRecord
.Header
));
228 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type0
->BiosVersion
);
229 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_BIOS_VERSIONE
));
230 ASSERT (UString
!= NULL
);
231 CopyMem (UString
, FIRMWARE_BIOS_VERSIONE
, sizeof(FIRMWARE_BIOS_VERSIONE
));
232 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_BIOS_VERSIONE
) / sizeof(CHAR16
) - 1);
234 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
236 gBS
->FreePool (UString
);
239 gBS
->FreePool (UString
);
241 DataRecord
.Header
.RecordType
= EFI_MISC_BIOS_VENDOR_RECORD_NUMBER
;
242 DataRecord
.Record
.MiscBiosVendor
.BiosVendor
= 0;
243 DataRecord
.Record
.MiscBiosVendor
.BiosVersion
= Token
;
244 DataRecord
.Record
.MiscBiosVendor
.BiosReleaseDate
= 0;
245 DataRecord
.Record
.MiscBiosVendor
.BiosStartingAddress
= 0;
246 DataRecord
.Record
.MiscBiosVendor
.BiosPhysicalDeviceSize
.Value
= 0;
247 DataRecord
.Record
.MiscBiosVendor
.BiosPhysicalDeviceSize
.Exponent
= 0;
248 // DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};
249 // DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};
250 DataRecord
.Record
.MiscBiosVendor
.BiosMajorRelease
= 0;
251 DataRecord
.Record
.MiscBiosVendor
.BiosMinorRelease
= 0;
252 DataRecord
.Record
.MiscBiosVendor
.BiosEmbeddedFirmwareMajorRelease
= 0;
253 DataRecord
.Record
.MiscBiosVendor
.BiosEmbeddedFirmwareMinorRelease
= 0;
255 Status
= gDataHub
->LogData (
257 &gEfiMiscSubClassGuid
,
259 EFI_DATA_RECORD_CLASS_DATA
,
261 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.MiscBiosVendor
)
263 ASSERT_EFI_ERROR (Status
);
266 // System information (TYPE 1)
268 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 1, 0);
269 if (SmbiosTable
.Raw
== NULL
) {
270 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 1 (System Information) not found!\n"));
277 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type1
->ProductName
);
278 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_PRODUCT_NAME
));
279 ASSERT (UString
!= NULL
);
280 CopyMem (UString
, FIRMWARE_PRODUCT_NAME
, sizeof(FIRMWARE_PRODUCT_NAME
));
281 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_PRODUCT_NAME
) / sizeof(CHAR16
) - 1);
283 Token
= HiiSetString (gStringHandle
, 0, UString
, NULL
);
285 gBS
->FreePool (UString
);
288 gBS
->FreePool (UString
);
290 DataRecord
.Header
.RecordType
= EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER
;
291 DataRecord
.Record
.MiscSystemManufacturer
.SystemManufacturer
= 0;
292 DataRecord
.Record
.MiscSystemManufacturer
.SystemProductName
= Token
;
293 DataRecord
.Record
.MiscSystemManufacturer
.SystemVersion
= 0;
294 DataRecord
.Record
.MiscSystemManufacturer
.SystemSerialNumber
= 0;
295 // DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};
296 DataRecord
.Record
.MiscSystemManufacturer
.SystemWakeupType
= EfiSystemWakeupTypeReserved
;
297 DataRecord
.Record
.MiscSystemManufacturer
.SystemSKUNumber
= 0;
298 DataRecord
.Record
.MiscSystemManufacturer
.SystemFamily
= 0;
300 Status
= gDataHub
->LogData (
302 &gEfiMiscSubClassGuid
,
304 EFI_DATA_RECORD_CLASS_DATA
,
306 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.MiscSystemManufacturer
)
308 ASSERT_EFI_ERROR (Status
);
315 DataHubGenEntrypoint (
316 IN EFI_HANDLE ImageHandle
,
317 IN EFI_SYSTEM_TABLE
*SystemTable
323 Smbios
= GetSmbiosTablesFromHob ();
324 if (Smbios
== NULL
) {
325 return EFI_NOT_FOUND
;
328 Status
= gBS
->LocateProtocol (
329 &gEfiDataHubProtocolGuid
,
333 if (EFI_ERROR (Status
)) {
337 Status
= gBS
->LocateProtocol (
338 &gEfiHiiDatabaseProtocolGuid
,
340 (VOID
**)&gHiiDatabase
343 if (EFI_ERROR (Status
)) {
347 gStringHandle
= HiiAddPackages (
350 DataHubGenDxeStrings
,
353 ASSERT (gStringHandle
!= NULL
);
355 InstallProcessorDataHub (Smbios
);
356 InstallCacheDataHub (Smbios
);
357 InstallMemoryDataHub (Smbios
);
358 InstallMiscDataHub (Smbios
);
369 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
375 AChar
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
376 while ((*AChar
!= 0) || (*(AChar
+ 1) != 0)) {
379 Length
= ((UINTN
)AChar
- (UINTN
)SmbiosTable
.Raw
+ 2);
384 SMBIOS_STRUCTURE_POINTER
385 GetSmbiosTableFromType (
386 IN SMBIOS_TABLE_ENTRY_POINT
*Smbios
,
391 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
392 UINTN SmbiosTypeIndex
;
395 SmbiosTable
.Raw
= (UINT8
*)(UINTN
)Smbios
->TableAddress
;
396 if (SmbiosTable
.Raw
== NULL
) {
399 while ((SmbiosTypeIndex
!= Index
) || (SmbiosTable
.Hdr
->Type
!= Type
)) {
400 if (SmbiosTable
.Hdr
->Type
== 127) {
401 SmbiosTable
.Raw
= NULL
;
404 if (SmbiosTable
.Hdr
->Type
== Type
) {
407 SmbiosTable
.Raw
= (UINT8
*)(SmbiosTable
.Raw
+ SmbiosTableLength (SmbiosTable
));
415 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
,
416 IN SMBIOS_TABLE_STRING String
423 AString
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
424 while (Index
!= String
) {
425 while (*AString
!= 0) {