]>
Commit | Line | Data |
---|---|---|
3cbfba02 DW |
1 | /*++ |
2 | ||
3 | Copyright (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 | ||
15 | Module Name: | |
16 | ||
17 | MiscSystemManufacturerFunction.c | |
18 | ||
19 | Abstract: | |
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 | **/ | |
44 | EFI_STATUS | |
45 | EFIAPI | |
46 | AddSmbiosManuCallback ( | |
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 | **/ | |
313 | MISC_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 | } |