]>
Commit | Line | Data |
---|---|---|
3cbfba02 DW |
1 | /*++ |
2 | ||
3 | Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR> | |
4 | ||
9dc8036d | 5 | SPDX-License-Identifier: BSD-2-Clause-Patent |
3cbfba02 DW |
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> | |
6f2ef18e TH |
27 | #include <Guid/PlatformInfo.h> |
28 | ||
29 | ||
30 | extern EFI_PLATFORM_INFO_HOB *mPlatformInfo; | |
31 | ||
3cbfba02 DW |
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 | ||
6f2ef18e TH |
72 | CHAR16 *MacStr; |
73 | EFI_HANDLE *Handles; | |
74 | UINTN BufferSize; | |
75 | CHAR16 PlatformNameBuffer[40]; | |
3cbfba02 DW |
76 | |
77 | ForType1InputData = (EFI_MISC_SYSTEM_MANUFACTURER *)Context; | |
78 | ||
79 | // | |
80 | // First check for invalid parameters. | |
81 | // | |
6f2ef18e | 82 | if (Context == NULL || mPlatformInfo == NULL) { |
3cbfba02 DW |
83 | return EFI_INVALID_PARAMETER; |
84 | } | |
85 | ||
86 | Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID *) &Smbios); | |
87 | ASSERT_EFI_ERROR (Status); | |
88 | ||
6f2ef18e | 89 | |
8b7a63e7 TH |
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 "); | |
6f2ef18e TH |
93 | } else { |
94 | UnicodeSPrint (PlatformNameBuffer, sizeof (PlatformNameBuffer),L"%s",L"Minnowboard Max "); | |
95 | } | |
96 | ||
3cbfba02 DW |
97 | // |
98 | // Silicon Steppings | |
99 | // | |
100 | switch (PchStepping()) { | |
101 | case PchA0: | |
6f2ef18e | 102 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"A0 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 109 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"A1 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 116 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B0 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 123 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B1 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 130 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B2 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 137 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"B3 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 144 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"C0 PLATFORM"); |
3cbfba02 DW |
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: | |
6f2ef18e | 151 | UnicodeSPrint (Buffer, sizeof (Buffer),L"%s%s", PlatformNameBuffer, L"D0 PLATFORM"); |
3cbfba02 DW |
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 | ||
8b7a63e7 TH |
162 | if (BOARD_ID_MINNOW2_TURBOT == mPlatformInfo->BoardId) { |
163 | UnicodeSPrint (Buffer, sizeof (Buffer),L"ADI"); | |
6f2ef18e TH |
164 | HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SYSTEM_MANUFACTURER), Buffer, NULL); |
165 | } | |
3cbfba02 DW |
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 | } |