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