]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
HII Library Class interface refine.
[mirror_edk2.git] / DuetPkg / DataHubGenDxe / DataHubGen.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
3Copyright (c) 2006 - 2007, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 DataHubGen.c\r
15\r
16Abstract:\r
17\r
18b84857 18**/\r
ca162103 19\r
20#include "DataHubGen.h"\r
9aa08808 21EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
ca162103 22\r
ca162103 23extern UINT8 DataHubGenDxeStrings[];\r
24\r
25EFI_DATA_HUB_PROTOCOL *gDataHub;\r
26EFI_HII_HANDLE gStringHandle;\r
27\r
28VOID *\r
29GetSmbiosTablesFromHob (\r
30 VOID\r
31 )\r
32{\r
ca162103 33 EFI_PHYSICAL_ADDRESS *Table;\r
9aa08808 34 EFI_PEI_HOB_POINTERS GuidHob;\r
ca162103 35 //\r
36 // Get Hob List\r
37 //\r
9aa08808 38 GuidHob.Raw = GetHobList ();\r
39 GuidHob.Raw = GetNextGuidHob (&gEfiSmbiosTableGuid, GuidHob.Raw);\r
40 if (GuidHob.Raw != NULL) {\r
41 Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
42 if (Table != NULL) {\r
43 return (VOID *)(UINTN)*Table;\r
44 }\r
ca162103 45 }\r
46\r
47 return NULL;\r
48}\r
49\r
ca162103 50EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {\r
51 EFI_PROCESSOR_SUBCLASS_VERSION, // Version\r
52 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
53 0, // Instance, Initialize later\r
54 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
55 0 // RecordType, Initialize later\r
56};\r
57\r
58VOID\r
59InstallProcessorDataHub (\r
60 IN VOID *Smbios\r
61 )\r
62{\r
63 EFI_STATUS Status;\r
64 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
65 EFI_CPU_DATA_RECORD DataRecord;\r
66 CHAR8 *AString;\r
67 CHAR16 *UString;\r
68 STRING_REF Token;\r
69\r
70 //\r
71 // Processor info (TYPE 4)\r
72 // \r
73 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
74 if (SmbiosTable.Raw == NULL) {\r
75 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
76 return ;\r
77 }\r
78\r
79 //\r
80 // Record Header\r
81 //\r
82 CopyMem (&DataRecord, &mCpuDataRecordHeader, sizeof (DataRecord.DataRecordHeader));\r
83\r
84 //\r
85 // Record Type 1\r
86 //\r
87 DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
88 DataRecord.VariableRecord.ProcessorCoreFrequency.Value = SmbiosTable.Type4->CurrentSpeed;\r
89 DataRecord.VariableRecord.ProcessorCoreFrequency.Exponent = 6;\r
90\r
91 Status = gDataHub->LogData (\r
92 gDataHub,\r
93 &gEfiProcessorSubClassGuid,\r
94 &gEfiMiscProducerGuid,\r
95 EFI_DATA_RECORD_CLASS_DATA,\r
96 &DataRecord,\r
97 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
98 );\r
99 //\r
100 // Record Type 3\r
101 //\r
102 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
103 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
104 ASSERT (UString != NULL);\r
105 AsciiStrToUnicodeStr (AString, UString);\r
106\r
cb7d01c0 107 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
108 if (Token == 0) {\r
ca162103 109 gBS->FreePool (UString);\r
110 return ;\r
111 }\r
112 gBS->FreePool (UString);\r
113\r
114 DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
115 DataRecord.VariableRecord.ProcessorVersion = Token;\r
116\r
117 Status = gDataHub->LogData (\r
118 gDataHub,\r
119 &gEfiProcessorSubClassGuid,\r
120 &gEfiMiscProducerGuid,\r
121 EFI_DATA_RECORD_CLASS_DATA,\r
122 &DataRecord,\r
123 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
124 );\r
125\r
126 return ;\r
127}\r
128\r
129VOID\r
130InstallCacheDataHub (\r
131 IN VOID *Smbios\r
132 )\r
133{\r
134 return ;\r
135}\r
136\r
137EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader = {\r
138 EFI_MEMORY_SUBCLASS_VERSION, // Version\r
139 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
140 0, // Instance, Initialize later\r
141 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
142 0 // RecordType, Initialize later\r
143};\r
144\r
145VOID\r
146InstallMemoryDataHub (\r
147 IN VOID *Smbios\r
148 )\r
149{\r
ca162103 150 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
151 EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord;\r
152\r
153 //\r
154 // Generate Memory Array Mapped Address info (TYPE 19)\r
155 //\r
156 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
157 if (SmbiosTable.Raw == NULL) {\r
158 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
159 return ;\r
160 }\r
161\r
162 //\r
163 // Record Header\r
164 //\r
165 CopyMem (&DataRecord, &mMemorySubclassDriverDataHeader, sizeof (DataRecord.Header));\r
166 \r
167 //\r
168 // Record Type 4\r
169 //\r
170 DataRecord.Header.RecordType = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
171 DataRecord.Record.ArrayStartAddress.MemoryArrayStartAddress = LShiftU64(SmbiosTable.Type19->StartingAddress, 10);\r
172 DataRecord.Record.ArrayStartAddress.MemoryArrayEndAddress = LShiftU64((UINT64) SmbiosTable.Type19->EndingAddress + 1, 10) - 1;\r
173 \r
3eb90413 174 CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiMemoryProducerGuid);\r
ca162103 175 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance = 0;\r
176 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
177 DataRecord.Record.ArrayStartAddress.MemoryArrayPartitionWidth = (UINT16)(SmbiosTable.Type19->PartitionWidth); \r
178\r
e188a609 179 gDataHub->LogData (\r
ca162103 180 gDataHub,\r
181 &gEfiMemorySubClassGuid,\r
182 &gEfiMiscProducerGuid,\r
183 EFI_DATA_RECORD_CLASS_DATA,\r
184 &DataRecord,\r
185 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.ArrayStartAddress)\r
186 );\r
187\r
188 return ;\r
189}\r
190\r
191EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader = {\r
192 EFI_MISC_SUBCLASS_VERSION, // Version\r
193 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
194 0, // Instance, Initialize later\r
195 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
196 0 // RecordType, Initialize later\r
197};\r
198\r
199VOID\r
200InstallMiscDataHub (\r
201 IN VOID *Smbios\r
202 )\r
203{\r
204 EFI_STATUS Status;\r
205 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
206 EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord;\r
207 CHAR8 *AString;\r
208 CHAR16 *UString;\r
209 STRING_REF Token;\r
210\r
211 //\r
212 // BIOS information (TYPE 0)\r
213 // \r
214 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
215 if (SmbiosTable.Raw == NULL) {\r
216 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
217 return ;\r
218 }\r
219\r
220 //\r
221 // Record Header\r
222 //\r
223 CopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));\r
224\r
225 //\r
226 // Record Type 2\r
227 //\r
228 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
229 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
230 ASSERT (UString != NULL);\r
231 CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
232 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
233\r
cb7d01c0 234 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
235 if (Token == 0) {\r
ca162103 236 gBS->FreePool (UString);\r
237 return ;\r
238 }\r
239 gBS->FreePool (UString);\r
240\r
241 DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;\r
242 DataRecord.Record.MiscBiosVendor.BiosVendor = 0;\r
243 DataRecord.Record.MiscBiosVendor.BiosVersion = Token;\r
244 DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;\r
245 DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;\r
246 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;\r
247 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;\r
248// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};\r
249// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};\r
250 DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;\r
251 DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;\r
252 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;\r
253 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;\r
254\r
255 Status = gDataHub->LogData (\r
256 gDataHub,\r
257 &gEfiMiscSubClassGuid,\r
258 &gEfiMiscProducerGuid,\r
259 EFI_DATA_RECORD_CLASS_DATA,\r
260 &DataRecord,\r
261 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
262 );\r
263\r
264 //\r
265 // System information (TYPE 1)\r
266 // \r
267 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
268 if (SmbiosTable.Raw == NULL) {\r
269 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
270 return ;\r
271 }\r
272\r
273 //\r
274 // Record Type 3\r
275 //\r
276 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
277 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
278 ASSERT (UString != NULL);\r
279 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
280 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
281\r
cb7d01c0 282 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
283 if (Token == 0) {\r
ca162103 284 gBS->FreePool (UString);\r
285 return ;\r
286 }\r
287 gBS->FreePool (UString);\r
288\r
289 DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
290 DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
291 DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
292 DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
293 DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
294// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
e188a609 295 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
ca162103 296 DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
297 DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
298\r
299 Status = gDataHub->LogData (\r
300 gDataHub,\r
301 &gEfiMiscSubClassGuid,\r
302 &gEfiMiscProducerGuid,\r
303 EFI_DATA_RECORD_CLASS_DATA,\r
304 &DataRecord,\r
305 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
306 );\r
307\r
308 return ;\r
309}\r
310\r
311EFI_STATUS\r
312EFIAPI\r
313DataHubGenEntrypoint (\r
314 IN EFI_HANDLE ImageHandle,\r
315 IN EFI_SYSTEM_TABLE *SystemTable\r
316 )\r
317{\r
318 EFI_STATUS Status;\r
319 VOID *Smbios;\r
320\r
ca162103 321 Smbios = GetSmbiosTablesFromHob ();\r
322 if (Smbios == NULL) {\r
323 return EFI_NOT_FOUND;\r
324 }\r
325\r
326 Status = gBS->LocateProtocol (\r
327 &gEfiDataHubProtocolGuid,\r
328 NULL,\r
f40bbc08 329 (VOID**)&gDataHub\r
ca162103 330 );\r
331 if (EFI_ERROR (Status)) {\r
332 return Status;\r
333 }\r
334\r
ca162103 335 Status = gBS->LocateProtocol (\r
336 &gEfiHiiDatabaseProtocolGuid,\r
337 NULL,\r
e188a609 338 (VOID**)&gHiiDatabase\r
ca162103 339 );\r
9aa08808 340\r
ca162103 341 if (EFI_ERROR (Status)) {\r
342 return Status;\r
343 }\r
91aac0e4 344 \r
cb7d01c0 345 gStringHandle = HiiAddPackages (\r
346 &gEfiMiscProducerGuid,\r
347 NULL,\r
348 DataHubGenDxeStrings,\r
349 NULL\r
350 );\r
351 ASSERT (gStringHandle != NULL);\r
ca162103 352\r
353 InstallProcessorDataHub (Smbios);\r
354 InstallCacheDataHub (Smbios);\r
355 InstallMemoryDataHub (Smbios);\r
356 InstallMiscDataHub (Smbios);\r
357\r
358 return EFI_SUCCESS;\r
359}\r
360\r
361//\r
362// Internal function\r
363//\r
364\r
365UINTN\r
366SmbiosTableLength (\r
367 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
368 )\r
369{\r
370 CHAR8 *AChar;\r
371 UINTN Length;\r
372\r
373 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
374 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
375 AChar ++;\r
376 }\r
377 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
378 \r
379 return Length;\r
380}\r
381\r
382SMBIOS_STRUCTURE_POINTER\r
383GetSmbiosTableFromType (\r
384 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
385 IN UINT8 Type,\r
386 IN UINTN Index\r
387 )\r
388{\r
389 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
390 UINTN SmbiosTypeIndex;\r
391 \r
392 SmbiosTypeIndex = 0;\r
393 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
394 if (SmbiosTable.Raw == NULL) {\r
395 return SmbiosTable;\r
396 }\r
397 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
398 if (SmbiosTable.Hdr->Type == 127) {\r
399 SmbiosTable.Raw = NULL;\r
400 return SmbiosTable;\r
401 }\r
402 if (SmbiosTable.Hdr->Type == Type) {\r
403 SmbiosTypeIndex ++;\r
404 }\r
405 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
406 }\r
407\r
408 return SmbiosTable;\r
409}\r
410\r
411CHAR8 *\r
412GetSmbiosString (\r
413 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
414 IN SMBIOS_TABLE_STRING String\r
415 )\r
416{\r
417 CHAR8 *AString;\r
418 UINT8 Index;\r
419\r
420 Index = 1;\r
421 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
422 while (Index != String) {\r
423 while (*AString != 0) {\r
424 AString ++;\r
425 }\r
426 AString ++;\r
427 if (*AString == 0) {\r
428 return AString;\r
429 }\r
430 Index ++;\r
431 }\r
432\r
433 return AString;\r
434}\r