]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/SmbiosGenDxe/SmbiosGen.c
Update the copyright notice format
[mirror_edk2.git] / DuetPkg / SmbiosGenDxe / SmbiosGen.c
CommitLineData
21020c7c 1/** @file\r
2\r
b1f700a8
HT
3Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
21020c7c 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 SmbiosGen.c\r
15\r
16Abstract:\r
17\r
18**/\r
19\r
20#include "SmbiosGen.h"\r
21EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
22extern UINT8 SmbiosGenDxeStrings[];\r
23EFI_SMBIOS_PROTOCOL *gSmbios;\r
24EFI_HII_HANDLE gStringHandle;\r
25\r
26VOID *\r
27GetSmbiosTablesFromHob (\r
28 VOID\r
29 )\r
30{\r
31 EFI_PHYSICAL_ADDRESS *Table;\r
32 EFI_PEI_HOB_POINTERS GuidHob;\r
fa8a1af2 33\r
34 GuidHob.Raw = GetFirstGuidHob (&gEfiSmbiosTableGuid);\r
21020c7c 35 if (GuidHob.Raw != NULL) {\r
36 Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
37 if (Table != NULL) {\r
38 return (VOID *)(UINTN)*Table;\r
39 }\r
40 }\r
41\r
42 return NULL;\r
43}\r
44\r
45\r
46VOID\r
47InstallProcessorSmbios (\r
48 IN VOID *Smbios\r
49 )\r
50{\r
51 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
52 CHAR8 *AString;\r
53 CHAR16 *UString;\r
54 STRING_REF Token;\r
55\r
56 //\r
57 // Processor info (TYPE 4)\r
58 // \r
59 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
60 if (SmbiosTable.Raw == NULL) {\r
61 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
62 return ;\r
63 }\r
64\r
65 //\r
66 // Log Smbios Record Type4\r
67 //\r
68 LogSmbiosData(gSmbios,(UINT8*)SmbiosTable.Type4);\r
69\r
70 //\r
71 // Set ProcessorVersion string\r
72 //\r
73 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
74 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
75 ASSERT (UString != NULL);\r
76 AsciiStrToUnicodeStr (AString, UString);\r
77\r
78 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
79 if (Token == 0) {\r
80 gBS->FreePool (UString);\r
81 return ;\r
82 }\r
83 gBS->FreePool (UString);\r
84 return ;\r
85}\r
86\r
87VOID\r
88InstallCacheSmbios (\r
89 IN VOID *Smbios\r
90 )\r
91{\r
92 return ;\r
93}\r
94\r
95VOID\r
96InstallMemorySmbios (\r
97 IN VOID *Smbios\r
98 )\r
99{\r
100 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
101\r
102 //\r
103 // Generate Memory Array Mapped Address info (TYPE 19)\r
104 //\r
105 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
106 if (SmbiosTable.Raw == NULL) {\r
107 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
108 return ;\r
109 }\r
110\r
111 //\r
112 // Record Smbios Type 19\r
113 //\r
114 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type19);\r
115 return ;\r
116}\r
117\r
118VOID\r
119InstallMiscSmbios (\r
120 IN VOID *Smbios\r
121 )\r
122{\r
123 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
124 CHAR8 *AString;\r
125 CHAR16 *UString;\r
126 STRING_REF Token;\r
127\r
128 //\r
129 // BIOS information (TYPE 0)\r
130 // \r
131 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
132 if (SmbiosTable.Raw == NULL) {\r
133 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
134 return ;\r
135 }\r
136\r
137 //\r
138 // Record Type 2\r
139 //\r
140 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
141 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
142 ASSERT (UString != NULL);\r
143 CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
144 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
145\r
146 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
147 if (Token == 0) {\r
148 gBS->FreePool (UString);\r
149 return ;\r
150 }\r
151 gBS->FreePool (UString);\r
152\r
153 //\r
154 // Log Smios Type 0\r
155 //\r
156 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type0);\r
157 \r
158 //\r
159 // System information (TYPE 1)\r
160 // \r
161 SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
162 if (SmbiosTable.Raw == NULL) {\r
163 DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
164 return ;\r
165 }\r
166\r
167 //\r
168 // Record Type 3\r
169 //\r
170 AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
171 UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
172 ASSERT (UString != NULL);\r
173 CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
174 AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
175\r
176 Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
177 if (Token == 0) {\r
178 gBS->FreePool (UString);\r
179 return ;\r
180 }\r
181 gBS->FreePool (UString);\r
182\r
183 //\r
184 // Log Smbios Type 1\r
185 //\r
186 LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type1);\r
187 \r
188 return ;\r
189}\r
190\r
191EFI_STATUS\r
192EFIAPI\r
193SmbiosGenEntrypoint (\r
194 IN EFI_HANDLE ImageHandle,\r
195 IN EFI_SYSTEM_TABLE *SystemTable\r
196 )\r
197{\r
198 EFI_STATUS Status;\r
199 VOID *Smbios;\r
200\r
201 Smbios = GetSmbiosTablesFromHob ();\r
202 if (Smbios == NULL) {\r
203 return EFI_NOT_FOUND;\r
204 }\r
205\r
206 Status = gBS->LocateProtocol (\r
207 &gEfiSmbiosProtocolGuid,\r
208 NULL,\r
209 (VOID**)&gSmbios\r
210 );\r
211 if (EFI_ERROR (Status)) {\r
212 return Status;\r
213 }\r
214\r
215 Status = gBS->LocateProtocol (\r
216 &gEfiHiiDatabaseProtocolGuid,\r
217 NULL,\r
218 (VOID**)&gHiiDatabase\r
219 );\r
220\r
221 if (EFI_ERROR (Status)) {\r
222 return Status;\r
223 }\r
224 \r
225 gStringHandle = HiiAddPackages (\r
226 &gEfiCallerIdGuid,\r
227 NULL,\r
228 SmbiosGenDxeStrings,\r
229 NULL\r
230 );\r
231 ASSERT (gStringHandle != NULL);\r
232\r
233 InstallProcessorSmbios (Smbios);\r
234 InstallCacheSmbios (Smbios);\r
235 InstallMemorySmbios (Smbios);\r
236 InstallMiscSmbios (Smbios);\r
237\r
238 return EFI_SUCCESS;\r
239}\r
240\r
241//\r
242// Internal function\r
243//\r
244\r
245UINTN\r
246SmbiosTableLength (\r
247 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
248 )\r
249{\r
250 CHAR8 *AChar;\r
251 UINTN Length;\r
252\r
253 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
254 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
255 AChar ++;\r
256 }\r
257 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
258 \r
259 return Length;\r
260}\r
261\r
262SMBIOS_STRUCTURE_POINTER\r
263GetSmbiosTableFromType (\r
264 IN SMBIOS_TABLE_ENTRY_POINT *Smbios,\r
265 IN UINT8 Type,\r
266 IN UINTN Index\r
267 )\r
268{\r
269 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
270 UINTN SmbiosTypeIndex;\r
271 \r
272 SmbiosTypeIndex = 0;\r
273 SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
274 if (SmbiosTable.Raw == NULL) {\r
275 return SmbiosTable;\r
276 }\r
277 while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
278 if (SmbiosTable.Hdr->Type == 127) {\r
279 SmbiosTable.Raw = NULL;\r
280 return SmbiosTable;\r
281 }\r
282 if (SmbiosTable.Hdr->Type == Type) {\r
283 SmbiosTypeIndex ++;\r
284 }\r
285 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
286 }\r
287\r
288 return SmbiosTable;\r
289}\r
290\r
291CHAR8 *\r
292GetSmbiosString (\r
293 IN SMBIOS_STRUCTURE_POINTER SmbiosTable,\r
294 IN SMBIOS_TABLE_STRING String\r
295 )\r
296{\r
297 CHAR8 *AString;\r
298 UINT8 Index;\r
299\r
300 Index = 1;\r
301 AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
302 while (Index != String) {\r
303 while (*AString != 0) {\r
304 AString ++;\r
305 }\r
306 AString ++;\r
307 if (*AString == 0) {\r
308 return AString;\r
309 }\r
310 Index ++;\r
311 }\r
312\r
313 return AString;\r
314}\r
315\r
316\r
317/**\r
318 Logs SMBIOS record.\r
319\r
320 @param Smbios Pointer to SMBIOS protocol instance.\r
321 @param Buffer Pointer to the data buffer.\r
322\r
323**/\r
324VOID\r
325LogSmbiosData (\r
326 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
327 IN UINT8 *Buffer\r
328 )\r
329{\r
330 EFI_STATUS Status;\r
331 EFI_SMBIOS_HANDLE SmbiosHandle;\r
332 \r
333 SmbiosHandle = 0;\r
334 Status = Smbios->Add (\r
335 Smbios,\r
336 NULL,\r
337 &SmbiosHandle,\r
338 (EFI_SMBIOS_TABLE_HEADER*)Buffer\r
339 );\r
340 ASSERT_EFI_ERROR (Status);\r
341}\r