]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - DuetPkg/DataHubGenDxe/DataHubGen.c
Use GetFirstGuidHob() instead of GetNextGuidHob() when only the first GUID instance...
[mirror_edk2.git] / DuetPkg / DataHubGenDxe / DataHubGen.c
... / ...
CommitLineData
1/** @file\r
2\r
3Copyright (c) 2006 - 2010, 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 = GetFirstGuidHob (&gEfiSmbiosTableGuid);\r
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
44 }\r
45\r
46 return NULL;\r
47}\r
48\r
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
86 DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
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
93 &gEfiCallerIdGuid,\r
94 EFI_DATA_RECORD_CLASS_DATA,\r
95 &DataRecord,\r
96 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
97 );\r
98 ASSERT_EFI_ERROR (Status);\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 &gEfiCallerIdGuid,\r
121 EFI_DATA_RECORD_CLASS_DATA,\r
122 &DataRecord,\r
123 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
124 );\r
125 ASSERT_EFI_ERROR (Status);\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, &gEfiCallerIdGuid);\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 &gEfiCallerIdGuid,\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 &gEfiCallerIdGuid,\r
259 EFI_DATA_RECORD_CLASS_DATA,\r
260 &DataRecord,\r
261 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
262 );\r
263 ASSERT_EFI_ERROR (Status);\r
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
283 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
284 if (Token == 0) {\r
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
296 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
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
303 &gEfiCallerIdGuid,\r
304 EFI_DATA_RECORD_CLASS_DATA,\r
305 &DataRecord,\r
306 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
307 );\r
308 ASSERT_EFI_ERROR (Status);\r
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
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
331 (VOID**)&gDataHub\r
332 );\r
333 if (EFI_ERROR (Status)) {\r
334 return Status;\r
335 }\r
336\r
337 Status = gBS->LocateProtocol (\r
338 &gEfiHiiDatabaseProtocolGuid,\r
339 NULL,\r
340 (VOID**)&gHiiDatabase\r
341 );\r
342\r
343 if (EFI_ERROR (Status)) {\r
344 return Status;\r
345 }\r
346 \r
347 gStringHandle = HiiAddPackages (\r
348 &gEfiCallerIdGuid,\r
349 NULL,\r
350 DataHubGenDxeStrings,\r
351 NULL\r
352 );\r
353 ASSERT (gStringHandle != NULL);\r
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