]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
Fix the bugs for DatahubGen module
[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
91aac0e4 107 Status = HiiLibNewString (gStringHandle, &Token, UString);\r
ca162103 108\r
109 if (EFI_ERROR (Status)) {\r
110 gBS->FreePool (UString);\r
111 return ;\r
112 }\r
113 gBS->FreePool (UString);\r
114\r
115 DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
116 DataRecord.VariableRecord.ProcessorVersion = Token;\r
117\r
118 Status = gDataHub->LogData (\r
119 gDataHub,\r
120 &gEfiProcessorSubClassGuid,\r
121 &gEfiMiscProducerGuid,\r
122 EFI_DATA_RECORD_CLASS_DATA,\r
123 &DataRecord,\r
124 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
125 );\r
126\r
127 return ;\r
128}\r
129\r
130VOID\r
131InstallCacheDataHub (\r
132 IN VOID *Smbios\r
133 )\r
134{\r
135 return ;\r
136}\r
137\r
138EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader = {\r
139 EFI_MEMORY_SUBCLASS_VERSION, // Version\r
140 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
141 0, // Instance, Initialize later\r
142 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
143 0 // RecordType, Initialize later\r
144};\r
145\r
146VOID\r
147InstallMemoryDataHub (\r
148 IN VOID *Smbios\r
149 )\r
150{\r
151 EFI_STATUS Status;\r
152 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
153 EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord;\r
154\r
155 //\r
156 // Generate Memory Array Mapped Address info (TYPE 19)\r
157 //\r
158 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
159 if (SmbiosTable.Raw == NULL) {\r
160 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
161 return ;\r
162 }\r
163\r
164 //\r
165 // Record Header\r
166 //\r
167 CopyMem (&DataRecord, &mMemorySubclassDriverDataHeader, sizeof (DataRecord.Header));\r
168 \r
169 //\r
170 // Record Type 4\r
171 //\r
172 DataRecord.Header.RecordType = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
173 DataRecord.Record.ArrayStartAddress.MemoryArrayStartAddress = LShiftU64(SmbiosTable.Type19->StartingAddress, 10);\r
174 DataRecord.Record.ArrayStartAddress.MemoryArrayEndAddress = LShiftU64((UINT64) SmbiosTable.Type19->EndingAddress + 1, 10) - 1;\r
175 \r
176 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName = gEfiMemoryProducerGuid;\r
177 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance = 0;\r
178 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
179 DataRecord.Record.ArrayStartAddress.MemoryArrayPartitionWidth = (UINT16)(SmbiosTable.Type19->PartitionWidth); \r
180\r
181 Status = gDataHub->LogData (\r
182 gDataHub,\r
183 &gEfiMemorySubClassGuid,\r
184 &gEfiMiscProducerGuid,\r
185 EFI_DATA_RECORD_CLASS_DATA,\r
186 &DataRecord,\r
187 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.ArrayStartAddress)\r
188 );\r
189\r
190 return ;\r
191}\r
192\r
193EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader = {\r
194 EFI_MISC_SUBCLASS_VERSION, // Version\r
195 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
196 0, // Instance, Initialize later\r
197 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
198 0 // RecordType, Initialize later\r
199};\r
200\r
201VOID\r
202InstallMiscDataHub (\r
203 IN VOID *Smbios\r
204 )\r
205{\r
206 EFI_STATUS Status;\r
207 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
208 EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord;\r
209 CHAR8 *AString;\r
210 CHAR16 *UString;\r
211 STRING_REF Token;\r
212\r
213 //\r
214 // BIOS information (TYPE 0)\r
215 // \r
216 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
217 if (SmbiosTable.Raw == NULL) {\r
218 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
219 return ;\r
220 }\r
221\r
222 //\r
223 // Record Header\r
224 //\r
225 CopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));\r
226\r
227 //\r
228 // Record Type 2\r
229 //\r
230 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
231 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
232 ASSERT (UString != NULL);\r
233 CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
234 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
235\r
91aac0e4 236 Status = HiiLibNewString (gStringHandle, &Token, UString);\r
ca162103 237\r
238 if (EFI_ERROR (Status)) {\r
239 gBS->FreePool (UString);\r
240 return ;\r
241 }\r
242 gBS->FreePool (UString);\r
243\r
244 DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;\r
245 DataRecord.Record.MiscBiosVendor.BiosVendor = 0;\r
246 DataRecord.Record.MiscBiosVendor.BiosVersion = Token;\r
247 DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;\r
248 DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;\r
249 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;\r
250 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;\r
251// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};\r
252// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};\r
253 DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;\r
254 DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;\r
255 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;\r
256 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;\r
257\r
258 Status = gDataHub->LogData (\r
259 gDataHub,\r
260 &gEfiMiscSubClassGuid,\r
261 &gEfiMiscProducerGuid,\r
262 EFI_DATA_RECORD_CLASS_DATA,\r
263 &DataRecord,\r
264 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
265 );\r
266\r
267 //\r
268 // System information (TYPE 1)\r
269 // \r
270 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
271 if (SmbiosTable.Raw == NULL) {\r
272 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
273 return ;\r
274 }\r
275\r
276 //\r
277 // Record Type 3\r
278 //\r
279 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
280 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
281 ASSERT (UString != NULL);\r
282 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
283 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
284\r
91aac0e4 285 Status = HiiLibNewString (gStringHandle, &Token, UString);\r
286\r
ca162103 287 if (EFI_ERROR (Status)) {\r
288 gBS->FreePool (UString);\r
289 return ;\r
290 }\r
291 gBS->FreePool (UString);\r
292\r
293 DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
294 DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
295 DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
296 DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
297 DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
298// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
299 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = 0;\r
300 DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
301 DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
302\r
303 Status = gDataHub->LogData (\r
304 gDataHub,\r
305 &gEfiMiscSubClassGuid,\r
306 &gEfiMiscProducerGuid,\r
307 EFI_DATA_RECORD_CLASS_DATA,\r
308 &DataRecord,\r
309 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
310 );\r
311\r
312 return ;\r
313}\r
314\r
315EFI_STATUS\r
316EFIAPI\r
317DataHubGenEntrypoint (\r
318 IN EFI_HANDLE ImageHandle,\r
319 IN EFI_SYSTEM_TABLE *SystemTable\r
320 )\r
321{\r
322 EFI_STATUS Status;\r
323 VOID *Smbios;\r
324\r
ca162103 325 Smbios = GetSmbiosTablesFromHob ();\r
326 if (Smbios == NULL) {\r
327 return EFI_NOT_FOUND;\r
328 }\r
329\r
330 Status = gBS->LocateProtocol (\r
331 &gEfiDataHubProtocolGuid,\r
332 NULL,\r
f40bbc08 333 (VOID**)&gDataHub\r
ca162103 334 );\r
335 if (EFI_ERROR (Status)) {\r
336 return Status;\r
337 }\r
338\r
ca162103 339 Status = gBS->LocateProtocol (\r
340 &gEfiHiiDatabaseProtocolGuid,\r
341 NULL,\r
342 &gHiiDatabase\r
343 );\r
9aa08808 344\r
ca162103 345 if (EFI_ERROR (Status)) {\r
346 return Status;\r
347 }\r
91aac0e4 348 \r
349 HiiLibAddPackages (1, &gEfiMiscProducerGuid, NULL, &gStringHandle, DataHubGenDxeStrings);\r
ca162103 350\r
351 InstallProcessorDataHub (Smbios);\r
352 InstallCacheDataHub (Smbios);\r
353 InstallMemoryDataHub (Smbios);\r
354 InstallMiscDataHub (Smbios);\r
355\r
356 return EFI_SUCCESS;\r
357}\r
358\r
359//\r
360// Internal function\r
361//\r
362\r
363UINTN\r
364SmbiosTableLength (\r
365 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
366 )\r
367{\r
368 CHAR8 *AChar;\r
369 UINTN Length;\r
370\r
371 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
372 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
373 AChar ++;\r
374 }\r
375 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
376 \r
377 return Length;\r
378}\r
379\r
380SMBIOS_STRUCTURE_POINTER\r
381GetSmbiosTableFromType (\r
382 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
383 IN UINT8 Type,\r
384 IN UINTN Index\r
385 )\r
386{\r
387 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
388 UINTN SmbiosTypeIndex;\r
389 \r
390 SmbiosTypeIndex = 0;\r
391 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
392 if (SmbiosTable.Raw == NULL) {\r
393 return SmbiosTable;\r
394 }\r
395 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
396 if (SmbiosTable.Hdr->Type == 127) {\r
397 SmbiosTable.Raw = NULL;\r
398 return SmbiosTable;\r
399 }\r
400 if (SmbiosTable.Hdr->Type == Type) {\r
401 SmbiosTypeIndex ++;\r
402 }\r
403 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
404 }\r
405\r
406 return SmbiosTable;\r
407}\r
408\r
409CHAR8 *\r
410GetSmbiosString (\r
411 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
412 IN SMBIOS_TABLE_STRING String\r
413 )\r
414{\r
415 CHAR8 *AString;\r
416 UINT8 Index;\r
417\r
418 Index = 1;\r
419 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
420 while (Index != String) {\r
421 while (*AString != 0) {\r
422 AString ++;\r
423 }\r
424 AString ++;\r
425 if (*AString == 0) {\r
426 return AString;\r
427 }\r
428 Index ++;\r
429 }\r
430\r
431 return AString;\r
432}\r