]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
Clean up DataHubGenDxe:
[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
ca162103 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
3eb90413 175 CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiMemoryProducerGuid);\r
ca162103 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
e188a609 180 gDataHub->LogData (\r
ca162103 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
91aac0e4 235 Status = HiiLibNewString (gStringHandle, &Token, UString);\r
ca162103 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
91aac0e4 284 Status = HiiLibNewString (gStringHandle, &Token, UString);\r
285\r
ca162103 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
e188a609 298 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
ca162103 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
ca162103 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
f40bbc08 332 (VOID**)&gDataHub\r
ca162103 333 );\r
334 if (EFI_ERROR (Status)) {\r
335 return Status;\r
336 }\r
337\r
ca162103 338 Status = gBS->LocateProtocol (\r
339 &gEfiHiiDatabaseProtocolGuid,\r
340 NULL,\r
e188a609 341 (VOID**)&gHiiDatabase\r
ca162103 342 );\r
9aa08808 343\r
ca162103 344 if (EFI_ERROR (Status)) {\r
345 return Status;\r
346 }\r
91aac0e4 347 \r
348 HiiLibAddPackages (1, &gEfiMiscProducerGuid, NULL, &gStringHandle, DataHubGenDxeStrings);\r
ca162103 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