]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSystemManufacturerFunction.c
Upload BSD-licensed Vlv2TbltDevicePkg and Vlv2DeviceRefCodePkg to
[mirror_edk2.git] / Vlv2TbltDevicePkg / SmBiosMiscDxe / MiscSystemManufacturerFunction.c
CommitLineData
3cbfba02
DW
1/*++
2
3Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
4
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13
14
15Module Name:
16
17 MiscSystemManufacturerFunction.c
18
19Abstract:
20
21 This driver parses the mMiscSubclassDataTable structure and reports
22 any generated data.
23
24--*/
25
26
27#include "CommonHeader.h"
28#include "MiscSubclassDriver.h"
29#include <Protocol/DxeSmmReadyToLock.h>
30#include <Library/NetLib.h>
31#include "Library/DebugLib.h"
32#include <Uefi/UefiBaseType.h>
33
34/**
35
36 Publish the smbios type 1.
37
38 @param Event Event whose notification function is being invoked (gEfiDxeSmmReadyToLockProtocolGuid).
39 @param Context Pointer to the notification functions context, which is implementation dependent.
40
41 @retval None
42
43**/
44EFI_STATUS
45EFIAPI
46AddSmbiosManuCallback (
47 IN EFI_EVENT Event,
48 IN VOID *Context
49 )
50{
51
52 CHAR8 *OptionalStrStart;
53 UINTN ManuStrLen;
54 UINTN VerStrLen;
55 UINTN PdNameStrLen;
56 UINTN SerialNumStrLen;
57 UINTN SkuNumberStrLen;
58 UINTN FamilyNameStrLen;
59 EFI_STATUS Status;
60 EFI_STRING Manufacturer;
61 EFI_STRING ProductName;
62 EFI_STRING Version;
63 EFI_STRING SerialNumber;
64 EFI_STRING SkuNumber;
65 EFI_STRING FamilyName;
66 STRING_REF TokenToGet;
67 EFI_SMBIOS_HANDLE SmbiosHandle;
68 SMBIOS_TABLE_TYPE1 *SmbiosRecord;
69 EFI_MISC_SYSTEM_MANUFACTURER *ForType1InputData;
70 EFI_SMBIOS_PROTOCOL *Smbios;
71 CHAR16 Buffer[40];
72
73 CHAR16 *MacStr;
74 EFI_HANDLE *Handles;
75 UINTN BufferSize;
76
77 ForType1InputData = (EFI_MISC_SYSTEM_MANUFACTURER *)Context;
78
79 //
80 // First check for invalid parameters.
81 //
82 if (Context == NULL) {
83 return EFI_INVALID_PARAMETER;
84 }
85
86 Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID *) &Smbios);
87 ASSERT_EFI_ERROR (Status);
88
89 //
90 // Silicon Steppings
91 //
92 switch (PchStepping()) {
93 case PchA0:
94 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX A0 PLATFORM");
95 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
96 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"A0");
97 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
98 DEBUG ((EFI_D_ERROR, "A0 Stepping Detected\n"));
99 break;
100 case PchA1:
101 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX A1 PLATFORM");
102 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
103 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"A1");
104 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
105 DEBUG ((EFI_D_ERROR, "A1 Stepping Detected\n"));
106 break;
107 case PchB0:
108 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX B0 PLATFORM");
109 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
110 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B0");
111 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
112 DEBUG ((EFI_D_ERROR, "B0 Stepping Detected\n"));
113 break;
114 case PchB1:
115 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX B1 PLATFORM");
116 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
117 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B1");
118 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
119 DEBUG ((EFI_D_ERROR, "B1 Stepping Detected\n"));
120 break;
121 case PchB2:
122 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX B2 PLATFORM");
123 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
124 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B2");
125 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
126 DEBUG ((EFI_D_ERROR, "B2 Stepping Detected\n"));
127 break;
128 case PchB3:
129 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX B3 PLATFORM");
130 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
131 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"B3");
132 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
133 DEBUG ((EFI_D_ERROR, "B3 Stepping Detected\n"));
134 break;
135 case PchC0:
136 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX C0 PLATFORM");
137 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
138 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"C0");
139 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
140 DEBUG ((EFI_D_ERROR, "C0 Stepping Detected\n"));
141 break;
142 case PchD0:
143 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"MinnowBoard MAX D0 PLATFORM");
144 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME), Buffer, NULL);
145 UnicodeSPrint (Buffer, sizeof (Buffer),L"%s",L"D0");
146 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_VERSION), Buffer, NULL);
147 DEBUG ((EFI_D_ERROR, "D0 Stepping Detected\n"));
148 break;
149 default:
150 DEBUG ((EFI_D_ERROR, "Unknow Stepping Detected\n"));
151 break;
152 }
153
154
155 TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER);
156 Manufacturer = SmbiosMiscGetString (TokenToGet);
157 ManuStrLen = StrLen(Manufacturer);
158 if (ManuStrLen > SMBIOS_STRING_MAX_LENGTH) {
159 return EFI_UNSUPPORTED;
160 }
161
162 TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);
163 ProductName = SmbiosMiscGetString (TokenToGet);
164 PdNameStrLen = StrLen(ProductName);
165 if (PdNameStrLen > SMBIOS_STRING_MAX_LENGTH) {
166 return EFI_UNSUPPORTED;
167 }
168
169 TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);
170 Version = SmbiosMiscGetString (TokenToGet);
171 VerStrLen = StrLen(Version);
172 if (VerStrLen > SMBIOS_STRING_MAX_LENGTH) {
173 return EFI_UNSUPPORTED;
174 }
175
176 //
177 //Get handle infomation
178 //
179 BufferSize = 0;
180 Handles = NULL;
181 Status = gBS->LocateHandle (
182 ByProtocol,
183 &gEfiSimpleNetworkProtocolGuid,
184 NULL,
185 &BufferSize,
186 Handles
187 );
188
189 if (Status == EFI_BUFFER_TOO_SMALL) {
190 Handles = AllocateZeroPool(BufferSize);
191 if (Handles == NULL) {
192 return (EFI_OUT_OF_RESOURCES);
193 }
194 Status = gBS->LocateHandle(
195 ByProtocol,
196 &gEfiSimpleNetworkProtocolGuid,
197 NULL,
198 &BufferSize,
199 Handles
200 );
201 }
202
203 //
204 //Get the MAC string
205 //
206 Status = NetLibGetMacString (
207 *Handles,
208 NULL,
209 &MacStr
210 );
211 if (EFI_ERROR (Status)) {
212 return Status;
213 }
214 SerialNumber = MacStr;
215 SerialNumStrLen = StrLen(SerialNumber);
216 if (SerialNumStrLen > SMBIOS_STRING_MAX_LENGTH) {
217 return EFI_UNSUPPORTED;
218 }
219 TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER);
220 SkuNumber = SmbiosMiscGetString (TokenToGet);
221 SkuNumberStrLen = StrLen(SkuNumber);
222 if (SkuNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {
223 return EFI_UNSUPPORTED;
224 }
225 TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_FAMILY_NAME1);
226 FamilyName = SmbiosMiscGetString (TokenToGet);
227 FamilyNameStrLen = StrLen(FamilyName);
228 if (FamilyNameStrLen > SMBIOS_STRING_MAX_LENGTH) {
229 return EFI_UNSUPPORTED;
230 }
231
232 //
233 // Two zeros following the last string.
234 //
235 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE1) + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + SkuNumberStrLen + 1 + FamilyNameStrLen + 1 + 1);
236 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE1) + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + SkuNumberStrLen + 1 + FamilyNameStrLen + 1 + 1);
237
238 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_INFORMATION;
239 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1);
240
241 //
242 // Make handle chosen by smbios protocol.add automatically.
243 //
244 SmbiosRecord->Hdr.Handle = 0;
245
246 //
247 // Manu will be the 1st optional string following the formatted structure.
248 //
249 SmbiosRecord->Manufacturer = 1;
250
251 //
252 // ProductName will be the 2nd optional string following the formatted structure.
253 //
254 SmbiosRecord->ProductName = 2;
255
256 //
257 // Version will be the 3rd optional string following the formatted structure.
258 //
259 SmbiosRecord->Version = 3;
260
261 //
262 // Version will be the 4th optional string following the formatted structure.
263 //
264 SmbiosRecord->SerialNumber = 4;
265
266 SmbiosRecord->SKUNumber= 5;
267 SmbiosRecord->Family= 6;
268
269 //
270 // Unique UUID
271 //
272 ForType1InputData->SystemUuid.Data1 = PcdGet32 (PcdProductSerialNumber);
273 ForType1InputData->SystemUuid.Data4[0] = PcdGet8 (PcdEmmcManufacturerId);
274
275 CopyMem ((UINT8 *) (&SmbiosRecord->Uuid),&ForType1InputData->SystemUuid,16);
276
277 SmbiosRecord->WakeUpType = (UINT8)ForType1InputData->SystemWakeupType;
278
279 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
280 UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);
281 UnicodeStrToAsciiStr(ProductName, OptionalStrStart + ManuStrLen + 1);
282 UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1);
283 UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1);
284
285 UnicodeStrToAsciiStr(SkuNumber, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);
286 UnicodeStrToAsciiStr(FamilyName, OptionalStrStart + ManuStrLen + 1 + PdNameStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + SkuNumberStrLen +1);
287
288 //
289 // Now we have got the full smbios record, call smbios protocol to add this record.
290 //
291 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
292 Status = Smbios-> Add(
293 Smbios,
294 NULL,
295 &SmbiosHandle,
296 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord
297 );
298 FreePool(SmbiosRecord);
299 return Status;
300}
301
302/**
303 This function makes boot time changes to the contents of the
304 MiscSystemManufacturer (Type 1).
305
306 @param RecordData Pointer to copy of RecordData from the Data Table.
307
308 @retval EFI_SUCCESS All parameters were valid.
309 @retval EFI_UNSUPPORTED Unexpected RecordType value.
310 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
311
312**/
313MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer)
314{
315 EFI_STATUS Status;
316 static BOOLEAN CallbackIsInstalledManu = FALSE;
317 VOID *AddSmbiosManuCallbackNotifyReg;
318 EFI_EVENT AddSmbiosManuCallbackEvent;
319
320
321 if (CallbackIsInstalledManu == FALSE) {
322 CallbackIsInstalledManu = TRUE; // Prevent more than 1 callback.
323 DEBUG ((EFI_D_INFO, "Create Smbios Manu callback.\n"));
324
325 //
326 // gEfiDxeSmmReadyToLockProtocolGuid is ready
327 //
328 Status = gBS->CreateEvent (
329 EVT_NOTIFY_SIGNAL,
330 TPL_CALLBACK,
331 (EFI_EVENT_NOTIFY)AddSmbiosManuCallback,
332 RecordData,
333 &AddSmbiosManuCallbackEvent
334 );
335
336 ASSERT_EFI_ERROR (Status);
337 if (EFI_ERROR (Status)) {
338 return Status;
339
340 }
341
342 Status = gBS->RegisterProtocolNotify (
343 &gEfiDxeSmmReadyToLockProtocolGuid,
344 AddSmbiosManuCallbackEvent,
345 &AddSmbiosManuCallbackNotifyReg
346 );
347
348 return Status;
349 }
350
351 return EFI_SUCCESS;
352
353}