]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DataHubGenDxe/DataHubGen.c
roll back the change on the naming of DataHubRecords.h for backward compatibility.
[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
1257e058 87 DataRecord.DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;\r
ca162103 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
c2bd20a5 94 &gEfiCallerIdGuid,\r
ca162103 95 EFI_DATA_RECORD_CLASS_DATA,\r
96 &DataRecord,\r
97 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorCoreFrequency)\r
98 );\r
21946ba8 99 ASSERT_EFI_ERROR (Status);\r
ca162103 100 //\r
101 // Record Type 3\r
102 //\r
103 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
104 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
105 ASSERT (UString != NULL);\r
106 AsciiStrToUnicodeStr (AString, UString);\r
107\r
cb7d01c0 108 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
109 if (Token == 0) {\r
ca162103 110 gBS->FreePool (UString);\r
111 return ;\r
112 }\r
113 gBS->FreePool (UString);\r
114\r
1257e058 115 DataRecord.DataRecordHeader.RecordType = ProcessorVersionRecordType;\r
ca162103 116 DataRecord.VariableRecord.ProcessorVersion = Token;\r
117\r
118 Status = gDataHub->LogData (\r
119 gDataHub,\r
120 &gEfiProcessorSubClassGuid,\r
c2bd20a5 121 &gEfiCallerIdGuid,\r
ca162103 122 EFI_DATA_RECORD_CLASS_DATA,\r
123 &DataRecord,\r
124 sizeof (DataRecord.DataRecordHeader) + sizeof (DataRecord.VariableRecord.ProcessorVersion)\r
125 );\r
21946ba8 126 ASSERT_EFI_ERROR (Status);\r
ca162103 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
c2bd20a5 175 CopyGuid (&DataRecord.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName, &gEfiCallerIdGuid);\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
c2bd20a5 183 &gEfiCallerIdGuid,\r
ca162103 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
cb7d01c0 235 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
236 if (Token == 0) {\r
ca162103 237 gBS->FreePool (UString);\r
238 return ;\r
239 }\r
240 gBS->FreePool (UString);\r
241\r
242 DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;\r
243 DataRecord.Record.MiscBiosVendor.BiosVendor = 0;\r
244 DataRecord.Record.MiscBiosVendor.BiosVersion = Token;\r
245 DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;\r
246 DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;\r
247 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;\r
248 DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;\r
249// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};\r
250// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};\r
251 DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;\r
252 DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;\r
253 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;\r
254 DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;\r
255\r
256 Status = gDataHub->LogData (\r
257 gDataHub,\r
258 &gEfiMiscSubClassGuid,\r
c2bd20a5 259 &gEfiCallerIdGuid,\r
ca162103 260 EFI_DATA_RECORD_CLASS_DATA,\r
261 &DataRecord,\r
262 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)\r
263 );\r
21946ba8 264 ASSERT_EFI_ERROR (Status);\r
ca162103 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
cb7d01c0 284 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
285 if (Token == 0) {\r
ca162103 286 gBS->FreePool (UString);\r
287 return ;\r
288 }\r
289 gBS->FreePool (UString);\r
290\r
291 DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;\r
292 DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;\r
293 DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;\r
294 DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;\r
295 DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;\r
296// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};\r
e188a609 297 DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = EfiSystemWakeupTypeReserved;\r
ca162103 298 DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;\r
299 DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;\r
300\r
301 Status = gDataHub->LogData (\r
302 gDataHub,\r
303 &gEfiMiscSubClassGuid,\r
c2bd20a5 304 &gEfiCallerIdGuid,\r
ca162103 305 EFI_DATA_RECORD_CLASS_DATA,\r
306 &DataRecord,\r
307 sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)\r
308 );\r
21946ba8 309 ASSERT_EFI_ERROR (Status);\r
ca162103 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
cb7d01c0 348 gStringHandle = HiiAddPackages (\r
c2bd20a5 349 &gEfiCallerIdGuid,\r
cb7d01c0 350 NULL,\r
351 DataHubGenDxeStrings,\r
352 NULL\r
353 );\r
354 ASSERT (gStringHandle != NULL);\r
ca162103 355\r
356 InstallProcessorDataHub (Smbios);\r
357 InstallCacheDataHub (Smbios);\r
358 InstallMemoryDataHub (Smbios);\r
359 InstallMiscDataHub (Smbios);\r
360\r
361 return EFI_SUCCESS;\r
362}\r
363\r
364//\r
365// Internal function\r
366//\r
367\r
368UINTN\r
369SmbiosTableLength (\r
370 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
371 )\r
372{\r
373 CHAR8 *AChar;\r
374 UINTN Length;\r
375\r
376 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
377 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
378 AChar ++;\r
379 }\r
380 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
381 \r
382 return Length;\r
383}\r
384\r
385SMBIOS_STRUCTURE_POINTER\r
386GetSmbiosTableFromType (\r
387 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
388 IN UINT8 Type,\r
389 IN UINTN Index\r
390 )\r
391{\r
392 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
393 UINTN SmbiosTypeIndex;\r
394 \r
395 SmbiosTypeIndex = 0;\r
396 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
397 if (SmbiosTable.Raw == NULL) {\r
398 return SmbiosTable;\r
399 }\r
400 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
401 if (SmbiosTable.Hdr->Type == 127) {\r
402 SmbiosTable.Raw = NULL;\r
403 return SmbiosTable;\r
404 }\r
405 if (SmbiosTable.Hdr->Type == Type) {\r
406 SmbiosTypeIndex ++;\r
407 }\r
408 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
409 }\r
410\r
411 return SmbiosTable;\r
412}\r
413\r
414CHAR8 *\r
415GetSmbiosString (\r
416 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
417 IN SMBIOS_TABLE_STRING String\r
418 )\r
419{\r
420 CHAR8 *AString;\r
421 UINT8 Index;\r
422\r
423 Index = 1;\r
424 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
425 while (Index != String) {\r
426 while (*AString != 0) {\r
427 AString ++;\r
428 }\r
429 AString ++;\r
430 if (*AString == 0) {\r
431 return AString;\r
432 }\r
433 Index ++;\r
434 }\r
435\r
436 return AString;\r
437}\r