]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
Use GetFirstGuidHob() instead of GetNextGuidHob() when only the first GUID instance...
[mirror_edk2.git] / DuetPkg / DataHubGenDxe / DataHubGen.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
fa8a1af2 3Copyright (c) 2006 - 2010, Intel Corporation \r
ca162103 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
fa8a1af2 38 GuidHob.Raw = GetFirstGuidHob (&gEfiSmbiosTableGuid);\r
9aa08808 39 if (GuidHob.Raw != NULL) {\r
40 Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
41 if (Table != NULL) {\r
42 return (VOID *)(UINTN)*Table;\r
43 }\r
ca162103 44 }\r
45\r
46 return NULL;\r
47}\r
48\r
ca162103 49EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {\r
50 EFI_PROCESSOR_SUBCLASS_VERSION, // Version\r
51 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
52 0, // Instance, Initialize later\r
53 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
54 0 // RecordType, Initialize later\r
55};\r
56\r
57VOID\r
58InstallProcessorDataHub (\r
59 IN VOID *Smbios\r
60 )\r
61{\r
62 EFI_STATUS Status;\r
63 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
64 EFI_CPU_DATA_RECORD DataRecord;\r
65 CHAR8 *AString;\r
66 CHAR16 *UString;\r
67 STRING_REF Token;\r
68\r
69 //\r
70 // Processor info (TYPE 4)\r
71 // \r
72 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
73 if (SmbiosTable.Raw == NULL) {\r
74 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
75 return ;\r
76 }\r
77\r
78 //\r
79 // Record Header\r
80 //\r
81 CopyMem (&DataRecord, &mCpuDataRecordHeader, sizeof (DataRecord.DataRecordHeader));\r
82\r
83 //\r
84 // Record Type 1\r
85 //\r
1257e058 86 DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
ca162103 87 DataRecord.VariableRecord.ProcessorCoreFrequency.Value = SmbiosTable.Type4->CurrentSpeed;\r
88 DataRecord.VariableRecord.ProcessorCoreFrequency.Exponent = 6;\r
89\r
90 Status = gDataHub->LogData (\r
91 gDataHub,\r
92 &gEfiProcessorSubClassGuid,\r
c2bd20a5 93 &gEfiCallerIdGuid,\r
ca162103 94 EFI_DATA_RECORD_CLASS_DATA,\r
95 &DataRecord,\r
96 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
97 );\r
21946ba8 98 ASSERT_EFI_ERROR (Status);\r
ca162103 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
1257e058 114 DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
ca162103 115 DataRecord.VariableRecord.ProcessorVersion = Token;\r
116\r
117 Status = gDataHub->LogData (\r
118 gDataHub,\r
119 &gEfiProcessorSubClassGuid,\r
c2bd20a5 120 &gEfiCallerIdGuid,\r
ca162103 121 EFI_DATA_RECORD_CLASS_DATA,\r
122 &DataRecord,\r
123 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
124 );\r
21946ba8 125 ASSERT_EFI_ERROR (Status);\r
ca162103 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
c2bd20a5 174 CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiCallerIdGuid);\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
c2bd20a5 182 &gEfiCallerIdGuid,\r
ca162103 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
c2bd20a5 258 &gEfiCallerIdGuid,\r
ca162103 259 EFI_DATA_RECORD_CLASS_DATA,\r
260 &DataRecord,\r
261 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
262 );\r
21946ba8 263 ASSERT_EFI_ERROR (Status);\r
ca162103 264\r
265 //\r
266 // System information (TYPE 1)\r
267 // \r
268 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
269 if (SmbiosTable.Raw == NULL) {\r
270 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
271 return ;\r
272 }\r
273\r
274 //\r
275 // Record Type 3\r
276 //\r
277 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
278 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
279 ASSERT (UString != NULL);\r
280 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
281 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
282\r
cb7d01c0 283 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
284 if (Token == 0) {\r
ca162103 285 gBS->FreePool (UString);\r
286 return ;\r
287 }\r
288 gBS->FreePool (UString);\r
289\r
290 DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
291 DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
292 DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
293 DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
294 DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
295// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
e188a609 296 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
ca162103 297 DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
298 DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
299\r
300 Status = gDataHub->LogData (\r
301 gDataHub,\r
302 &gEfiMiscSubClassGuid,\r
c2bd20a5 303 &gEfiCallerIdGuid,\r
ca162103 304 EFI_DATA_RECORD_CLASS_DATA,\r
305 &DataRecord,\r
306 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
307 );\r
21946ba8 308 ASSERT_EFI_ERROR (Status);\r
ca162103 309\r
310 return ;\r
311}\r
312\r
313EFI_STATUS\r
314EFIAPI\r
315DataHubGenEntrypoint (\r
316 IN EFI_HANDLE ImageHandle,\r
317 IN EFI_SYSTEM_TABLE *SystemTable\r
318 )\r
319{\r
320 EFI_STATUS Status;\r
321 VOID *Smbios;\r
322\r
ca162103 323 Smbios = GetSmbiosTablesFromHob ();\r
324 if (Smbios == NULL) {\r
325 return EFI_NOT_FOUND;\r
326 }\r
327\r
328 Status = gBS->LocateProtocol (\r
329 &gEfiDataHubProtocolGuid,\r
330 NULL,\r
f40bbc08 331 (VOID**)&gDataHub\r
ca162103 332 );\r
333 if (EFI_ERROR (Status)) {\r
334 return Status;\r
335 }\r
336\r
ca162103 337 Status = gBS->LocateProtocol (\r
338 &gEfiHiiDatabaseProtocolGuid,\r
339 NULL,\r
e188a609 340 (VOID**)&gHiiDatabase\r
ca162103 341 );\r
9aa08808 342\r
ca162103 343 if (EFI_ERROR (Status)) {\r
344 return Status;\r
345 }\r
91aac0e4 346 \r
cb7d01c0 347 gStringHandle = HiiAddPackages (\r
c2bd20a5 348 &gEfiCallerIdGuid,\r
cb7d01c0 349 NULL,\r
350 DataHubGenDxeStrings,\r
351 NULL\r
352 );\r
353 ASSERT (gStringHandle != NULL);\r
ca162103 354\r
355 InstallProcessorDataHub (Smbios);\r
356 InstallCacheDataHub (Smbios);\r
357 InstallMemoryDataHub (Smbios);\r
358 InstallMiscDataHub (Smbios);\r
359\r
360 return EFI_SUCCESS;\r
361}\r
362\r
363//\r
364// Internal function\r
365//\r
366\r
367UINTN\r
368SmbiosTableLength (\r
369 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
370 )\r
371{\r
372 CHAR8 *AChar;\r
373 UINTN Length;\r
374\r
375 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
376 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
377 AChar ++;\r
378 }\r
379 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
380 \r
381 return Length;\r
382}\r
383\r
384SMBIOS_STRUCTURE_POINTER\r
385GetSmbiosTableFromType (\r
386 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
387 IN UINT8 Type,\r
388 IN UINTN Index\r
389 )\r
390{\r
391 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
392 UINTN SmbiosTypeIndex;\r
393 \r
394 SmbiosTypeIndex = 0;\r
395 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
396 if (SmbiosTable.Raw == NULL) {\r
397 return SmbiosTable;\r
398 }\r
399 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
400 if (SmbiosTable.Hdr->Type == 127) {\r
401 SmbiosTable.Raw = NULL;\r
402 return SmbiosTable;\r
403 }\r
404 if (SmbiosTable.Hdr->Type == Type) {\r
405 SmbiosTypeIndex ++;\r
406 }\r
407 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
408 }\r
409\r
410 return SmbiosTable;\r
411}\r
412\r
413CHAR8 *\r
414GetSmbiosString (\r
415 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
416 IN SMBIOS_TABLE_STRING String\r
417 )\r
418{\r
419 CHAR8 *AString;\r
420 UINT8 Index;\r
421\r
422 Index = 1;\r
423 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
424 while (Index != String) {\r
425 while (*AString != 0) {\r
426 AString ++;\r
427 }\r
428 AString ++;\r
429 if (*AString == 0) {\r
430 return AString;\r
431 }\r
432 Index ++;\r
433 }\r
434\r
435 return AString;\r
436}\r