]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
Initialize DuetPkg ...
[mirror_edk2.git] / DuetPkg / DataHubGenDxe / DataHubGen.c
CommitLineData
ca162103 1/*++\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
21\r
22EFI_HII_PROTOCOL *gHii;\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_STATUS Status;\r
34 EFI_HOB_HANDOFF_INFO_TABLE *HobList;\r
35 EFI_PHYSICAL_ADDRESS *Table;\r
36\r
37 //\r
38 // Get Hob List\r
39 //\r
40 \r
41 Status = EfiGetSystemConfigurationTable (&gEfiHobListGuid, (VOID *) &HobList);\r
42 if (EFI_ERROR (Status)) {\r
43 return NULL;\r
44 }\r
45\r
46 //\r
47 // If there is a SMBIOS table in the HOB add it to the EFI System table\r
48 //\r
49 Table = GetNextGuidHob (&gEfiSmbiosTableGuid, &HobList);\r
50\r
51 if (!EFI_ERROR (Status)) {\r
52 return (VOID *)(UINTN)*Table;\r
53 }\r
54\r
55 return NULL;\r
56}\r
57\r
58EFI_STATUS\r
59PrepareHiiPackage (\r
60 VOID\r
61 )\r
62{\r
63 EFI_HII_PACKAGES *PackageList;\r
64 EFI_STATUS Status;\r
65\r
66 PackageList = PreparePackages (1, &gEfiMiscProducerGuid, DataHubGenDxeStrings);\r
67 Status = gHii->NewPack (gHii, PackageList, &gStringHandle);\r
68\r
69 return Status;\r
70}\r
71\r
72EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {\r
73 EFI_PROCESSOR_SUBCLASS_VERSION, // Version\r
74 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
75 0, // Instance, Initialize later\r
76 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
77 0 // RecordType, Initialize later\r
78};\r
79\r
80VOID\r
81InstallProcessorDataHub (\r
82 IN VOID *Smbios\r
83 )\r
84{\r
85 EFI_STATUS Status;\r
86 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
87 EFI_CPU_DATA_RECORD DataRecord;\r
88 CHAR8 *AString;\r
89 CHAR16 *UString;\r
90 STRING_REF Token;\r
91\r
92 //\r
93 // Processor info (TYPE 4)\r
94 // \r
95 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
96 if (SmbiosTable.Raw == NULL) {\r
97 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
98 return ;\r
99 }\r
100\r
101 //\r
102 // Record Header\r
103 //\r
104 CopyMem (&DataRecord, &mCpuDataRecordHeader, sizeof (DataRecord.DataRecordHeader));\r
105\r
106 //\r
107 // Record Type 1\r
108 //\r
109 DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
110 DataRecord.VariableRecord.ProcessorCoreFrequency.Value = SmbiosTable.Type4->CurrentSpeed;\r
111 DataRecord.VariableRecord.ProcessorCoreFrequency.Exponent = 6;\r
112\r
113 Status = gDataHub->LogData (\r
114 gDataHub,\r
115 &gEfiProcessorSubClassGuid,\r
116 &gEfiMiscProducerGuid,\r
117 EFI_DATA_RECORD_CLASS_DATA,\r
118 &DataRecord,\r
119 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
120 );\r
121 //\r
122 // Record Type 3\r
123 //\r
124 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
125 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
126 ASSERT (UString != NULL);\r
127 AsciiStrToUnicodeStr (AString, UString);\r
128\r
129 Token = 0;\r
130 Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);\r
131\r
132 if (EFI_ERROR (Status)) {\r
133 gBS->FreePool (UString);\r
134 return ;\r
135 }\r
136 gBS->FreePool (UString);\r
137\r
138 DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
139 DataRecord.VariableRecord.ProcessorVersion = Token;\r
140\r
141 Status = gDataHub->LogData (\r
142 gDataHub,\r
143 &gEfiProcessorSubClassGuid,\r
144 &gEfiMiscProducerGuid,\r
145 EFI_DATA_RECORD_CLASS_DATA,\r
146 &DataRecord,\r
147 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
148 );\r
149\r
150 return ;\r
151}\r
152\r
153VOID\r
154InstallCacheDataHub (\r
155 IN VOID *Smbios\r
156 )\r
157{\r
158 return ;\r
159}\r
160\r
161EFI_SUBCLASS_TYPE1_HEADER mMemorySubclassDriverDataHeader = {\r
162 EFI_MEMORY_SUBCLASS_VERSION, // Version\r
163 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
164 0, // Instance, Initialize later\r
165 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
166 0 // RecordType, Initialize later\r
167};\r
168\r
169VOID\r
170InstallMemoryDataHub (\r
171 IN VOID *Smbios\r
172 )\r
173{\r
174 EFI_STATUS Status;\r
175 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
176 EFI_MEMORY_SUBCLASS_DRIVER_DATA DataRecord;\r
177\r
178 //\r
179 // Generate Memory Array Mapped Address info (TYPE 19)\r
180 //\r
181 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
182 if (SmbiosTable.Raw == NULL) {\r
183 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
184 return ;\r
185 }\r
186\r
187 //\r
188 // Record Header\r
189 //\r
190 CopyMem (&DataRecord, &mMemorySubclassDriverDataHeader, sizeof (DataRecord.Header));\r
191 \r
192 //\r
193 // Record Type 4\r
194 //\r
195 DataRecord.Header.RecordType = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
196 DataRecord.Record.ArrayStartAddress.MemoryArrayStartAddress = LShiftU64(SmbiosTable.Type19->StartingAddress, 10);\r
197 DataRecord.Record.ArrayStartAddress.MemoryArrayEndAddress = LShiftU64((UINT64) SmbiosTable.Type19->EndingAddress + 1, 10) - 1;\r
198 \r
199 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName = gEfiMemoryProducerGuid;\r
200 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance = 0;\r
201 DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
202 DataRecord.Record.ArrayStartAddress.MemoryArrayPartitionWidth = (UINT16)(SmbiosTable.Type19->PartitionWidth); \r
203\r
204 Status = gDataHub->LogData (\r
205 gDataHub,\r
206 &gEfiMemorySubClassGuid,\r
207 &gEfiMiscProducerGuid,\r
208 EFI_DATA_RECORD_CLASS_DATA,\r
209 &DataRecord,\r
210 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.ArrayStartAddress)\r
211 );\r
212\r
213 return ;\r
214}\r
215\r
216EFI_SUBCLASS_TYPE1_HEADER mMiscSubclassDriverDataHeader = {\r
217 EFI_MISC_SUBCLASS_VERSION, // Version\r
218 sizeof (EFI_SUBCLASS_TYPE1_HEADER), // Header Size\r
219 0, // Instance, Initialize later\r
220 EFI_SUBCLASS_INSTANCE_NON_APPLICABLE, // SubInstance\r
221 0 // RecordType, Initialize later\r
222};\r
223\r
224VOID\r
225InstallMiscDataHub (\r
226 IN VOID *Smbios\r
227 )\r
228{\r
229 EFI_STATUS Status;\r
230 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
231 EFI_MISC_SUBCLASS_DRIVER_DATA DataRecord;\r
232 CHAR8 *AString;\r
233 CHAR16 *UString;\r
234 STRING_REF Token;\r
235\r
236 //\r
237 // BIOS information (TYPE 0)\r
238 // \r
239 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
240 if (SmbiosTable.Raw == NULL) {\r
241 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
242 return ;\r
243 }\r
244\r
245 //\r
246 // Record Header\r
247 //\r
248 CopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));\r
249\r
250 //\r
251 // Record Type 2\r
252 //\r
253 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
254 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
255 ASSERT (UString != NULL);\r
256 CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
257 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
258\r
259 Token = 0;\r
260 Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);\r
261\r
262 if (EFI_ERROR (Status)) {\r
263 gBS->FreePool (UString);\r
264 return ;\r
265 }\r
266 gBS->FreePool (UString);\r
267\r
268 DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;\r
269 DataRecord.Record.MiscBiosVendor.BiosVendor = 0;\r
270 DataRecord.Record.MiscBiosVendor.BiosVersion = Token;\r
271 DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;\r
272 DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;\r
273 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;\r
274 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;\r
275// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};\r
276// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};\r
277 DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;\r
278 DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;\r
279 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;\r
280 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;\r
281\r
282 Status = gDataHub->LogData (\r
283 gDataHub,\r
284 &gEfiMiscSubClassGuid,\r
285 &gEfiMiscProducerGuid,\r
286 EFI_DATA_RECORD_CLASS_DATA,\r
287 &DataRecord,\r
288 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
289 );\r
290\r
291 //\r
292 // System information (TYPE 1)\r
293 // \r
294 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
295 if (SmbiosTable.Raw == NULL) {\r
296 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
297 return ;\r
298 }\r
299\r
300 //\r
301 // Record Type 3\r
302 //\r
303 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
304 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
305 ASSERT (UString != NULL);\r
306 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
307 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
308\r
309#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
310 Status = IfrLibNewString (gStringHandle, &Token, UString);\r
311#else\r
312 Token = 0;\r
313 Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);\r
314#endif\r
315 if (EFI_ERROR (Status)) {\r
316 gBS->FreePool (UString);\r
317 return ;\r
318 }\r
319 gBS->FreePool (UString);\r
320\r
321 DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
322 DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
323 DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
324 DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
325 DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
326// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
327 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = 0;\r
328 DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
329 DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
330\r
331 Status = gDataHub->LogData (\r
332 gDataHub,\r
333 &gEfiMiscSubClassGuid,\r
334 &gEfiMiscProducerGuid,\r
335 EFI_DATA_RECORD_CLASS_DATA,\r
336 &DataRecord,\r
337 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
338 );\r
339\r
340 return ;\r
341}\r
342\r
343EFI_STATUS\r
344EFIAPI\r
345DataHubGenEntrypoint (\r
346 IN EFI_HANDLE ImageHandle,\r
347 IN EFI_SYSTEM_TABLE *SystemTable\r
348 )\r
349{\r
350 EFI_STATUS Status;\r
351 VOID *Smbios;\r
352\r
353\r
354 Smbios = GetSmbiosTablesFromHob ();\r
355 if (Smbios == NULL) {\r
356 return EFI_NOT_FOUND;\r
357 }\r
358\r
359 Status = gBS->LocateProtocol (\r
360 &gEfiDataHubProtocolGuid,\r
361 NULL,\r
362 &gDataHub\r
363 );\r
364 if (EFI_ERROR (Status)) {\r
365 return Status;\r
366 }\r
367\r
368#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
369 Status = gBS->LocateProtocol (\r
370 &gEfiHiiDatabaseProtocolGuid,\r
371 NULL,\r
372 &gHiiDatabase\r
373 );\r
374#else\r
375 Status = gBS->LocateProtocol (\r
376 &gEfiHiiProtocolGuid,\r
377 NULL,\r
378 &gHii\r
379 );\r
380#endif\r
381 if (EFI_ERROR (Status)) {\r
382 return Status;\r
383 }\r
384\r
385 PrepareHiiPackage ();\r
386\r
387 InstallProcessorDataHub (Smbios);\r
388 InstallCacheDataHub (Smbios);\r
389 InstallMemoryDataHub (Smbios);\r
390 InstallMiscDataHub (Smbios);\r
391\r
392 return EFI_SUCCESS;\r
393}\r
394\r
395//\r
396// Internal function\r
397//\r
398\r
399UINTN\r
400SmbiosTableLength (\r
401 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
402 )\r
403{\r
404 CHAR8 *AChar;\r
405 UINTN Length;\r
406\r
407 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
408 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
409 AChar ++;\r
410 }\r
411 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
412 \r
413 return Length;\r
414}\r
415\r
416SMBIOS_STRUCTURE_POINTER\r
417GetSmbiosTableFromType (\r
418 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
419 IN UINT8 Type,\r
420 IN UINTN Index\r
421 )\r
422{\r
423 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
424 UINTN SmbiosTypeIndex;\r
425 \r
426 SmbiosTypeIndex = 0;\r
427 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
428 if (SmbiosTable.Raw == NULL) {\r
429 return SmbiosTable;\r
430 }\r
431 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
432 if (SmbiosTable.Hdr->Type == 127) {\r
433 SmbiosTable.Raw = NULL;\r
434 return SmbiosTable;\r
435 }\r
436 if (SmbiosTable.Hdr->Type == Type) {\r
437 SmbiosTypeIndex ++;\r
438 }\r
439 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
440 }\r
441\r
442 return SmbiosTable;\r
443}\r
444\r
445CHAR8 *\r
446GetSmbiosString (\r
447 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
448 IN SMBIOS_TABLE_STRING String\r
449 )\r
450{\r
451 CHAR8 *AString;\r
452 UINT8 Index;\r
453\r
454 Index = 1;\r
455 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
456 while (Index != String) {\r
457 while (*AString != 0) {\r
458 AString ++;\r
459 }\r
460 AString ++;\r
461 if (*AString == 0) {\r
462 return AString;\r
463 }\r
464 Index ++;\r
465 }\r
466\r
467 return AString;\r
468}\r