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