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