3 Copyright (c) 2006 - 2007, 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"
22 EFI_HII_PROTOCOL
*gHii
;
23 extern UINT8 DataHubGenDxeStrings
[];
25 EFI_DATA_HUB_PROTOCOL
*gDataHub
;
26 EFI_HII_HANDLE gStringHandle
;
29 GetSmbiosTablesFromHob (
34 EFI_HOB_HANDOFF_INFO_TABLE
*HobList
;
35 EFI_PHYSICAL_ADDRESS
*Table
;
41 Status
= EfiGetSystemConfigurationTable (&gEfiHobListGuid
, (VOID
*) &HobList
);
42 if (EFI_ERROR (Status
)) {
47 // If there is a SMBIOS table in the HOB add it to the EFI System table
49 Table
= GetNextGuidHob (&gEfiSmbiosTableGuid
, &HobList
);
51 if (!EFI_ERROR (Status
)) {
52 return (VOID
*)(UINTN
)*Table
;
63 EFI_HII_PACKAGES
*PackageList
;
66 PackageList
= PreparePackages (1, &gEfiMiscProducerGuid
, DataHubGenDxeStrings
);
67 Status
= gHii
->NewPack (gHii
, PackageList
, &gStringHandle
);
72 EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader
= {
73 EFI_PROCESSOR_SUBCLASS_VERSION
, // Version
74 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
75 0, // Instance, Initialize later
76 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
77 0 // RecordType, Initialize later
81 InstallProcessorDataHub (
86 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
87 EFI_CPU_DATA_RECORD DataRecord
;
93 // Processor info (TYPE 4)
95 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 4, 0);
96 if (SmbiosTable
.Raw
== NULL
) {
97 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 4 (Processor Info) not found!\n"));
104 CopyMem (&DataRecord
, &mCpuDataRecordHeader
, sizeof (DataRecord
.DataRecordHeader
));
109 DataRecord
.DataRecordHeader
.RecordType
= ProcessorCoreFrequencyRecordType
;
110 DataRecord
.VariableRecord
.ProcessorCoreFrequency
.Value
= SmbiosTable
.Type4
->CurrentSpeed
;
111 DataRecord
.VariableRecord
.ProcessorCoreFrequency
.Exponent
= 6;
113 Status
= gDataHub
->LogData (
115 &gEfiProcessorSubClassGuid
,
116 &gEfiMiscProducerGuid
,
117 EFI_DATA_RECORD_CLASS_DATA
,
119 sizeof (DataRecord
.DataRecordHeader
) + sizeof (DataRecord
.VariableRecord
.ProcessorCoreFrequency
)
124 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type4
->ProcessorVersion
);
125 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
));
126 ASSERT (UString
!= NULL
);
127 AsciiStrToUnicodeStr (AString
, UString
);
130 Status
= gHii
->NewString (gHii
, NULL
, gStringHandle
, &Token
, UString
);
132 if (EFI_ERROR (Status
)) {
133 gBS
->FreePool (UString
);
136 gBS
->FreePool (UString
);
138 DataRecord
.DataRecordHeader
.RecordType
= ProcessorVersionRecordType
;
139 DataRecord
.VariableRecord
.ProcessorVersion
= Token
;
141 Status
= gDataHub
->LogData (
143 &gEfiProcessorSubClassGuid
,
144 &gEfiMiscProducerGuid
,
145 EFI_DATA_RECORD_CLASS_DATA
,
147 sizeof (DataRecord
.DataRecordHeader
) + sizeof (DataRecord
.VariableRecord
.ProcessorVersion
)
154 InstallCacheDataHub (
161 EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader
= {
162 EFI_MEMORY_SUBCLASS_VERSION
, // Version
163 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
164 0, // Instance, Initialize later
165 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
166 0 // RecordType, Initialize later
170 InstallMemoryDataHub (
175 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
176 EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord
;
179 // Generate Memory Array Mapped Address info (TYPE 19)
181 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 19, 0);
182 if (SmbiosTable
.Raw
== NULL
) {
183 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));
190 CopyMem (&DataRecord
, &mMemorySubclassDriverDataHeader
, sizeof (DataRecord
.Header
));
195 DataRecord
.Header
.RecordType
= EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER
;
196 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayStartAddress
= LShiftU64(SmbiosTable
.Type19
->StartingAddress
, 10);
197 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayEndAddress
= LShiftU64((UINT64
) SmbiosTable
.Type19
->EndingAddress
+ 1, 10) - 1;
199 DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.ProducerName
= gEfiMemoryProducerGuid
;
200 DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.Instance
= 0;
201 DataRecord
.Record
.ArrayStartAddress
.PhysicalMemoryArrayLink
.SubInstance
= EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
;
202 DataRecord
.Record
.ArrayStartAddress
.MemoryArrayPartitionWidth
= (UINT16
)(SmbiosTable
.Type19
->PartitionWidth
);
204 Status
= gDataHub
->LogData (
206 &gEfiMemorySubClassGuid
,
207 &gEfiMiscProducerGuid
,
208 EFI_DATA_RECORD_CLASS_DATA
,
210 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.ArrayStartAddress
)
216 EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader
= {
217 EFI_MISC_SUBCLASS_VERSION
, // Version
218 sizeof (EFI_SUBCLASS_TYPE1_HEADER
), // Header Size
219 0, // Instance, Initialize later
220 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE
, // SubInstance
221 0 // RecordType, Initialize later
230 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
231 EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord
;
237 // BIOS information (TYPE 0)
239 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 0, 0);
240 if (SmbiosTable
.Raw
== NULL
) {
241 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));
248 CopyMem (&DataRecord
, &mMiscSubclassDriverDataHeader
, sizeof (DataRecord
.Header
));
253 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type0
->BiosVersion
);
254 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_BIOS_VERSIONE
));
255 ASSERT (UString
!= NULL
);
256 CopyMem (UString
, FIRMWARE_BIOS_VERSIONE
, sizeof(FIRMWARE_BIOS_VERSIONE
));
257 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_BIOS_VERSIONE
) / sizeof(CHAR16
) - 1);
260 Status
= gHii
->NewString (gHii
, NULL
, gStringHandle
, &Token
, UString
);
262 if (EFI_ERROR (Status
)) {
263 gBS
->FreePool (UString
);
266 gBS
->FreePool (UString
);
268 DataRecord
.Header
.RecordType
= EFI_MISC_BIOS_VENDOR_RECORD_NUMBER
;
269 DataRecord
.Record
.MiscBiosVendor
.BiosVendor
= 0;
270 DataRecord
.Record
.MiscBiosVendor
.BiosVersion
= Token
;
271 DataRecord
.Record
.MiscBiosVendor
.BiosReleaseDate
= 0;
272 DataRecord
.Record
.MiscBiosVendor
.BiosStartingAddress
= 0;
273 DataRecord
.Record
.MiscBiosVendor
.BiosPhysicalDeviceSize
.Value
= 0;
274 DataRecord
.Record
.MiscBiosVendor
.BiosPhysicalDeviceSize
.Exponent
= 0;
275 // DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};
276 // DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};
277 DataRecord
.Record
.MiscBiosVendor
.BiosMajorRelease
= 0;
278 DataRecord
.Record
.MiscBiosVendor
.BiosMinorRelease
= 0;
279 DataRecord
.Record
.MiscBiosVendor
.BiosEmbeddedFirmwareMajorRelease
= 0;
280 DataRecord
.Record
.MiscBiosVendor
.BiosEmbeddedFirmwareMinorRelease
= 0;
282 Status
= gDataHub
->LogData (
284 &gEfiMiscSubClassGuid
,
285 &gEfiMiscProducerGuid
,
286 EFI_DATA_RECORD_CLASS_DATA
,
288 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.MiscBiosVendor
)
292 // System information (TYPE 1)
294 SmbiosTable
= GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT
*)Smbios
, 1, 0);
295 if (SmbiosTable
.Raw
== NULL
) {
296 DEBUG ((EFI_D_ERROR
, "SmbiosTable: Type 1 (System Information) not found!\n"));
303 AString
= GetSmbiosString (SmbiosTable
, SmbiosTable
.Type1
->ProductName
);
304 UString
= AllocateZeroPool ((AsciiStrLen(AString
) + 1) * sizeof(CHAR16
) + sizeof(FIRMWARE_PRODUCT_NAME
));
305 ASSERT (UString
!= NULL
);
306 CopyMem (UString
, FIRMWARE_PRODUCT_NAME
, sizeof(FIRMWARE_PRODUCT_NAME
));
307 AsciiStrToUnicodeStr (AString
, UString
+ sizeof(FIRMWARE_PRODUCT_NAME
) / sizeof(CHAR16
) - 1);
309 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
310 Status
= IfrLibNewString (gStringHandle
, &Token
, UString
);
313 Status
= gHii
->NewString (gHii
, NULL
, gStringHandle
, &Token
, UString
);
315 if (EFI_ERROR (Status
)) {
316 gBS
->FreePool (UString
);
319 gBS
->FreePool (UString
);
321 DataRecord
.Header
.RecordType
= EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER
;
322 DataRecord
.Record
.MiscSystemManufacturer
.SystemManufacturer
= 0;
323 DataRecord
.Record
.MiscSystemManufacturer
.SystemProductName
= Token
;
324 DataRecord
.Record
.MiscSystemManufacturer
.SystemVersion
= 0;
325 DataRecord
.Record
.MiscSystemManufacturer
.SystemSerialNumber
= 0;
326 // DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};
327 DataRecord
.Record
.MiscSystemManufacturer
.SystemWakeupType
= 0;
328 DataRecord
.Record
.MiscSystemManufacturer
.SystemSKUNumber
= 0;
329 DataRecord
.Record
.MiscSystemManufacturer
.SystemFamily
= 0;
331 Status
= gDataHub
->LogData (
333 &gEfiMiscSubClassGuid
,
334 &gEfiMiscProducerGuid
,
335 EFI_DATA_RECORD_CLASS_DATA
,
337 sizeof (DataRecord
.Header
) + sizeof (DataRecord
.Record
.MiscSystemManufacturer
)
345 DataHubGenEntrypoint (
346 IN EFI_HANDLE ImageHandle
,
347 IN EFI_SYSTEM_TABLE
*SystemTable
354 Smbios
= GetSmbiosTablesFromHob ();
355 if (Smbios
== NULL
) {
356 return EFI_NOT_FOUND
;
359 Status
= gBS
->LocateProtocol (
360 &gEfiDataHubProtocolGuid
,
364 if (EFI_ERROR (Status
)) {
368 #if (EFI_SPECIFICATION_VERSION >= 0x0002000A)
369 Status
= gBS
->LocateProtocol (
370 &gEfiHiiDatabaseProtocolGuid
,
375 Status
= gBS
->LocateProtocol (
376 &gEfiHiiProtocolGuid
,
381 if (EFI_ERROR (Status
)) {
385 PrepareHiiPackage ();
387 InstallProcessorDataHub (Smbios
);
388 InstallCacheDataHub (Smbios
);
389 InstallMemoryDataHub (Smbios
);
390 InstallMiscDataHub (Smbios
);
401 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
407 AChar
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
408 while ((*AChar
!= 0) || (*(AChar
+ 1) != 0)) {
411 Length
= ((UINTN
)AChar
- (UINTN
)SmbiosTable
.Raw
+ 2);
416 SMBIOS_STRUCTURE_POINTER
417 GetSmbiosTableFromType (
418 IN SMBIOS_TABLE_ENTRY_POINT
*Smbios
,
423 SMBIOS_STRUCTURE_POINTER SmbiosTable
;
424 UINTN SmbiosTypeIndex
;
427 SmbiosTable
.Raw
= (UINT8
*)(UINTN
)Smbios
->TableAddress
;
428 if (SmbiosTable
.Raw
== NULL
) {
431 while ((SmbiosTypeIndex
!= Index
) || (SmbiosTable
.Hdr
->Type
!= Type
)) {
432 if (SmbiosTable
.Hdr
->Type
== 127) {
433 SmbiosTable
.Raw
= NULL
;
436 if (SmbiosTable
.Hdr
->Type
== Type
) {
439 SmbiosTable
.Raw
= (UINT8
*)(SmbiosTable
.Raw
+ SmbiosTableLength (SmbiosTable
));
447 IN SMBIOS_STRUCTURE_POINTER SmbiosTable
,
448 IN SMBIOS_TABLE_STRING String
455 AString
= (CHAR8
*)(SmbiosTable
.Raw
+ SmbiosTable
.Hdr
->Length
);
456 while (Index
!= String
) {
457 while (*AString
!= 0) {