]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - DuetPkg/DataHubGenDxe/DataHubGen.c
HII Library Class interface refine.
[mirror_edk2.git] / DuetPkg / DataHubGenDxe / DataHubGen.c
... / ...
CommitLineData
1/** @file\r
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
18**/\r
19\r
20#include "DataHubGen.h"\r
21EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
22\r
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
33 EFI_PHYSICAL_ADDRESS *Table;\r
34 EFI_PEI_HOB_POINTERS GuidHob;\r
35 //\r
36 // Get Hob List\r
37 //\r
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
45 }\r
46\r
47 return NULL;\r
48}\r
49\r
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
107 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
108 if (Token == 0) {\r
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
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
174 CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiMemoryProducerGuid);\r
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
179 gDataHub->LogData (\r
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
234 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
235 if (Token == 0) {\r
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
282 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
283 if (Token == 0) {\r
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
295 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
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
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
329 (VOID**)&gDataHub\r
330 );\r
331 if (EFI_ERROR (Status)) {\r
332 return Status;\r
333 }\r
334\r
335 Status = gBS->LocateProtocol (\r
336 &gEfiHiiDatabaseProtocolGuid,\r
337 NULL,\r
338 (VOID**)&gHiiDatabase\r
339 );\r
340\r
341 if (EFI_ERROR (Status)) {\r
342 return Status;\r
343 }\r
344 \r
345 gStringHandle = HiiAddPackages (\r
346 &gEfiMiscProducerGuid,\r
347 NULL,\r
348 DataHubGenDxeStrings,\r
349 NULL\r
350 );\r
351 ASSERT (gStringHandle != NULL);\r
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