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