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