]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c
CorebootPayloadPkg: Use extra braces to prevent gcc compile fail
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformSetupDxe / PlatformSetupDxe.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
5 This program and the accompanying materials are licensed and made available under\r\r
6 the terms and conditions of the BSD License that accompanies this distribution. \r\r
7 The full text of the license may be found at \r\r
8 http://opensource.org/licenses/bsd-license.php. \r\r
9 \r\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
12 \r\r
13\r
14Module Name:\r
15\r
16**/\r
17\r
18#include "PlatformSetupDxe.h"\r
19#include "Guid/SetupVariable.h"\r
20\r
21#define EFI_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('C', 'l', 'b', 'k')\r
22#define EFI_CALLBACK_INFO_FROM_THIS(a) CR (a, EFI_CALLBACK_INFO, ConfigAccess, EFI_CALLBACK_INFO_SIGNATURE)\r
23\r
24typedef struct {\r
25 UINTN Signature;\r
26 EFI_HANDLE DriverHandle;\r
27 EFI_HII_HANDLE RegisteredHandle;\r
28 SYSTEM_CONFIGURATION FakeNvData;\r
29 SYSTEM_CONFIGURATION BackupNvData;\r
30 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
31 EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;\r
32} EFI_CALLBACK_INFO;\r
33\r
34#pragma pack(1)\r
35\r
36//\r
37// HII specific Vendor Device Path definition.\r
38//\r
39typedef struct {\r
40 VENDOR_DEVICE_PATH VendorDevicePath;\r
41 EFI_DEVICE_PATH_PROTOCOL End;\r
42} HII_VENDOR_DEVICE_PATH;\r
43\r
44#pragma pack()\r
45\r
46//\r
47// uni string and Vfr Binary data.\r
48//\r
49extern UINT8 VfrBin[];\r
50extern UINT8 PlatformSetupDxeStrings[];\r
51\r
52EFI_HANDLE mImageHandle;\r
53\r
54//\r
55// module global data\r
56//\r
57#define EFI_NORMAL_SETUP_GUID \\r
58 { 0xec87d643, 0xeba4, 0x4bb5, 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0xd, 0xa9 }\r
59\r
60EFI_GUID mNormalSetupGuid = EFI_NORMAL_SETUP_GUID;\r
61\r
62EFI_GUID mSystemConfigGuid = SYSTEM_CONFIGURATION_GUID;\r
63CHAR16 mVariableName[] = L"Setup";\r
64CHAR16 mSetupName[] = L"Setup";\r
65EFI_CALLBACK_INFO *mCallbackInfo;\r
66BOOLEAN GlobalReset=FALSE;\r
67\r
68HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {\r
69 {\r
70 {\r
71 HARDWARE_DEVICE_PATH,\r
72 HW_VENDOR_DP,\r
73 {\r
74 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
75 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
76 }\r
77 },\r
78 EFI_CALLER_ID_GUID\r
79 },\r
80 {\r
81 END_DEVICE_PATH_TYPE,\r
82 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
83 {\r
84 (UINT8) (END_DEVICE_PATH_LENGTH),\r
85 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
86 }\r
87 }\r
88};\r
89\r
90/**\r
91 This function allows a caller to extract the current configuration for one\r
92 or more named elements from the target driver.\r
93\r
94 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
95 @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
96 @param Progress On return, points to a character in the Request string.\r
97 Points to the string's null terminator if request was successful.\r
98 Points to the most recent '&' before the first failing name/value\r
99 pair (or the beginning of the string if the failure is in the\r
100 first name/value pair) if the request was not successful.\r
101 @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
102 has all values filled in for the names in the Request string.\r
103 String to be allocated by the called function.\r
104\r
105 @retval EFI_SUCCESS The Results is filled with the requested values.\r
106 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
107 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
108 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
109\r
110**/\r
111\r
112VOID\r
113CheckSystemConfigLoad(SYSTEM_CONFIGURATION *SystemConfigPtr);\r
114\r
115VOID\r
116CheckSystemConfigSave(SYSTEM_CONFIGURATION *SystemConfigPtr);\r
117\r
118VOID\r
119ConfirmSecureBootTest();\r
120\r
121VOID\r
122LoadLpssDefaultValues (\r
123 IN EFI_CALLBACK_INFO *Private\r
124 )\r
125{\r
126 //\r
127 // Load LPSS and SCC defalut configurations for Android\r
128 //\r
129 Private->FakeNvData.LpsseMMCEnabled = FALSE;\r
130 Private->FakeNvData.LpssSdioEnabled = TRUE;\r
131 Private->FakeNvData.LpssSdcardEnabled = TRUE;\r
132 Private->FakeNvData.LpssSdCardSDR25Enabled = FALSE;\r
133 Private->FakeNvData.LpssSdCardDDR50Enabled = TRUE;\r
134 Private->FakeNvData.LpssMipiHsi = FALSE;\r
135 Private->FakeNvData.LpsseMMC45Enabled = TRUE;\r
136 Private->FakeNvData.LpsseMMC45DDR50Enabled = TRUE;\r
137 Private->FakeNvData.LpsseMMC45HS200Enabled = FALSE;\r
138 Private->FakeNvData.LpsseMMC45RetuneTimerValue = 8;\r
139 Private->FakeNvData.eMMCBootMode = 1; // Auto Detect\r
140\r
141 Private->FakeNvData.GOPEnable = TRUE;\r
142 Private->FakeNvData.SecureBoot = TRUE;\r
143 Private->FakeNvData.UsbAutoMode = TRUE;\r
144 Private->FakeNvData.UsbXhciSupport = TRUE;\r
145 Private->FakeNvData.PchUsb30Mode = TRUE;\r
146 Private->FakeNvData.LegacyUSBBooting = FALSE;\r
147 Private->FakeNvData.PchUsb20 = FALSE;\r
148}\r
149\r
150\r
151EFI_STATUS\r
152EFIAPI\r
153SystemConfigExtractConfig (\r
154 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
155 IN CONST EFI_STRING Request,\r
156 OUT EFI_STRING *Progress,\r
157 OUT EFI_STRING *Results\r
158 )\r
159{\r
160 EFI_STATUS Status;\r
161 EFI_CALLBACK_INFO *Private;\r
162 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
163 EFI_STRING ConfigRequestHdr;\r
164 EFI_STRING ConfigRequest;\r
165 BOOLEAN AllocatedRequest;\r
166 UINTN Size;\r
167 UINTN BufferSize;\r
168 VOID *SystemConfigPtr;\r
169\r
170\r
171 if (Progress == NULL || Results == NULL) {\r
172 return EFI_INVALID_PARAMETER;\r
173 }\r
174\r
175 *Progress = Request;\r
176 if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mSystemConfigGuid, mVariableName)) {\r
177 return EFI_NOT_FOUND;\r
178 }\r
179\r
180 ConfigRequestHdr = NULL;\r
181 ConfigRequest = NULL;\r
182 Size = 0;\r
183 AllocatedRequest = FALSE;\r
184\r
185 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
186\r
187 SetupInfo();\r
188\r
189 HiiConfigRouting = Private->HiiConfigRouting;\r
190 ConfigRequest = Request;\r
191 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
192 //\r
193 // Request has no request element, construct full request string.\r
194 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
195 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
196 //\r
197 ConfigRequestHdr = HiiConstructConfigHdr (&mSystemConfigGuid, mVariableName, Private->DriverHandle);\r
198 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
199 ConfigRequest = AllocateZeroPool (Size);\r
200 ASSERT (ConfigRequest != NULL);\r
201 AllocatedRequest = TRUE;\r
202 BufferSize = sizeof (SYSTEM_CONFIGURATION);\r
203 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
204 FreePool (ConfigRequestHdr);\r
205 }\r
206 SystemConfigPtr = GetVariable(mSetupName, &mNormalSetupGuid);\r
207\r
208\r
209 if (SystemConfigPtr == NULL) {\r
210 ZeroMem(&Private->FakeNvData, sizeof(SYSTEM_CONFIGURATION));\r
211 ZeroMem(&Private->BackupNvData, sizeof(SYSTEM_CONFIGURATION));\r
212 } else {\r
213 CheckSystemConfigLoad(SystemConfigPtr);\r
214 CopyMem(&Private->FakeNvData, SystemConfigPtr, sizeof(SYSTEM_CONFIGURATION));\r
215 CopyMem(&Private->BackupNvData, SystemConfigPtr, sizeof(SYSTEM_CONFIGURATION));\r
216 FreePool(SystemConfigPtr);\r
217 }\r
218\r
219 //\r
220 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
221 //\r
222 Status = HiiConfigRouting->BlockToConfig (\r
223 HiiConfigRouting,\r
224 ConfigRequest,\r
225 (UINT8 *) &Private->FakeNvData,\r
226 sizeof (SYSTEM_CONFIGURATION),\r
227 Results,\r
228 Progress\r
229 );\r
230\r
231 //\r
232 // Free the allocated config request string.\r
233 //\r
234 if (AllocatedRequest) {\r
235 FreePool (ConfigRequest);\r
236 ConfigRequest = NULL;\r
237 }\r
238\r
239 //\r
240 // Set Progress string to the original request string.\r
241 //\r
242 if (Request == NULL) {\r
243 *Progress = NULL;\r
244 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
245 *Progress = Request + StrLen (Request);\r
246 }\r
247\r
248 return Status;\r
249}\r
250\r
251/**\r
252 This function processes the results of changes in configuration.\r
253\r
254 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
255 @param Configuration A null-terminated Unicode string in <ConfigRequest> format.\r
256 @param Progress A pointer to a string filled in with the offset of the most\r
257 recent '&' before the first failing name/value pair (or the\r
258 beginning of the string if the failure is in the first\r
259 name/value pair) or the terminating NULL if all was successful.\r
260\r
261 @retval EFI_SUCCESS The Results is processed successfully.\r
262 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
263 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
264\r
265**/\r
266EFI_STATUS\r
267EFIAPI\r
268SystemConfigRouteConfig (\r
269 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
270 IN CONST EFI_STRING Configuration,\r
271 OUT EFI_STRING *Progress\r
272 )\r
273{\r
274 EFI_CALLBACK_INFO *Private;\r
275 SYSTEM_CONFIGURATION *FakeNvData;\r
276\r
277 if (Configuration == NULL || Progress == NULL) {\r
278 return EFI_INVALID_PARAMETER;\r
279 }\r
280 *Progress = Configuration;\r
281\r
282 if (!HiiIsConfigHdrMatch (Configuration, &mSystemConfigGuid, mVariableName)) {\r
283 return EFI_NOT_FOUND;\r
284 }\r
285\r
286 *Progress = Configuration + StrLen (Configuration);\r
287 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
288 FakeNvData = &Private->FakeNvData;\r
289 if (!HiiGetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData)) {\r
290 //\r
291 // FakeNvData can't be got from SetupBrowser, which doesn't need to be set.\r
292 //\r
293 return EFI_SUCCESS;\r
294 }\r
295\r
296 if (Private->FakeNvData.ReservedO != Private->BackupNvData.ReservedO) {\r
297 Private->BackupNvData.ReservedO = Private->FakeNvData.ReservedO;\r
298 LoadLpssDefaultValues (Private);\r
299\r
300 //\r
301 // Pass changed uncommitted data back to Form Browser\r
302 //\r
303 HiiSetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData, NULL);\r
304 }\r
305\r
306 gRT->SetVariable(\r
307 mSetupName,\r
308 &mNormalSetupGuid,\r
309 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
310 sizeof(SYSTEM_CONFIGURATION),\r
311 &Private->FakeNvData\r
312 );\r
313\r
314 CheckSystemConfigSave(&Private->FakeNvData);\r
315 return EFI_SUCCESS;\r
316}\r
317\r
318/**\r
319 This is the function that is called to provide results data to the driver. This data\r
320 consists of a unique key which is used to identify what data is either being passed back\r
321 or being asked for.\r
322\r
323 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
324 @param Action A null-terminated Unicode string in <ConfigRequest> format.\r
325 @param KeyValue A unique Goto OpCode callback value which record user's selection.\r
326 0x100 <= KeyValue <0x500 : user select a controller item in the first page;\r
327 KeyValue == 0x1234 : user select 'Refresh' in first page, or user select 'Go to Previous Menu' in second page\r
328 KeyValue == 0x1235 : user select 'Pci device filter' in first page\r
329 KeyValue == 0x1500 : user select 'order ... priority' item in second page\r
330 KeyValue == 0x1800 : user select 'commint changes' in third page\r
331 KeyValue == 0x2000 : user select 'Go to Previous Menu' in third page\r
332 @param Type The type of value for the question.\r
333 @param Value A pointer to the data being sent to the original exporting driver.\r
334 @param ActionRequest On return, points to the action requested by the callback function.\r
335\r
336 @retval EFI_SUCCESS Always returned.\r
337\r
338**/\r
339EFI_STATUS\r
340EFIAPI\r
341SystemConfigCallback (\r
342 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
343 IN EFI_BROWSER_ACTION Action,\r
344 IN EFI_QUESTION_ID KeyValue,\r
345 IN UINT8 Type,\r
346 IN EFI_IFR_TYPE_VALUE *Value,\r
347 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
348 )\r
349{\r
350 EFI_CALLBACK_INFO *Private;\r
351 SYSTEM_CONFIGURATION *FakeNvData;\r
352 SYSTEM_CONFIGURATION *SetupData;\r
353 UINTN SizeOfNvStore;\r
354 EFI_INPUT_KEY Key;\r
355 CHAR16 *StringBuffer1;\r
356 CHAR16 *StringBuffer2;\r
357 CHAR16 *StringBuffer3;\r
358 EFI_STATUS Status;\r
359 UINTN DataSize;\r
360 UINT8 OsSelection;\r
361\r
362 StringBuffer1 = AllocateZeroPool (200 * sizeof (CHAR16));\r
363 ASSERT (StringBuffer1 != NULL);\r
364 StringBuffer2 = AllocateZeroPool (200 * sizeof (CHAR16));\r
365 ASSERT (StringBuffer2 != NULL);\r
366 StringBuffer3 = AllocateZeroPool (200 * sizeof (CHAR16));\r
367 ASSERT (StringBuffer3 != NULL);\r
368\r
369 switch (Action) {\r
370 case EFI_BROWSER_ACTION_CHANGING:\r
371 {\r
372 if (KeyValue == 0x1235) {\r
373 StrCpy (StringBuffer1, L"Will you disable PTT ? ");\r
374 StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)");\r
375\r
376 //\r
377 // Popup a menu to notice user\r
378 //\r
379 do {\r
380 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
381 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
382\r
383 //\r
384 // If the user hits the YES Response key,\r
385 //\r
386 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
387\r
388 }\r
389 } else if (KeyValue == 0x1236) {\r
390 StrCpy (StringBuffer1, L"Will you revoke trust ? ");\r
391 StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)");\r
392\r
393 //\r
394 // Popup a menu to notice user\r
395 //\r
396 do {\r
397 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
398 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
399\r
400 //\r
401 // If the user hits the YES Response key,\r
402 //\r
403 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
404\r
405 }\r
406 } else if (KeyValue == 0x1239) {\r
407 if (Value->u8 == 0x00) {\r
408 StrCpy (StringBuffer1, L"WARNING: SOC may be damaged due to high temperature");\r
409 StrCpy (StringBuffer2, L"when DPTF is disabled and IGD turbo is enabled.");\r
410 StrCpy (StringBuffer3, L"Press Enter/ESC to continue...");\r
411\r
412 //\r
413 // Popup a menu to notice user\r
414 //\r
415 do {\r
416 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3, NULL);\r
417 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
418 }\r
419 } else if (KeyValue == 0x1240) { // secure erase feature of eMMC\r
420 //\r
421 // Popup a menu to notice user\r
422 //\r
423 StrCpy (StringBuffer1, L"WARNING: All your data on the eMMC will be lost");\r
424 StrCpy (StringBuffer2, L"Do you really want to enable secure erase on eMMC?");\r
425 StrCpy (StringBuffer3, L" Enter (YES) / Esc (NO) ");\r
426\r
427 do {\r
428 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3,NULL);\r
429 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
430\r
431 //\r
432 // If the user hits the ESC Response key,\r
433 //\r
434 if (Key.ScanCode == SCAN_ESC) {\r
435 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
436 FakeNvData = &Private->FakeNvData;\r
437\r
438 Status = HiiGetBrowserData (\r
439 &mSystemConfigGuid,\r
440 mVariableName,\r
441 sizeof (SYSTEM_CONFIGURATION),\r
442 (UINT8 *) FakeNvData\r
443 );\r
444 if (!EFI_ERROR (Status)) {\r
445 FakeNvData->SecureErase = 0;\r
446 HiiSetBrowserData (\r
447 &mSystemConfigGuid,\r
448 mVariableName,\r
449 sizeof (SYSTEM_CONFIGURATION),\r
450 (UINT8 *) FakeNvData,\r
451 NULL\r
452 );\r
453 }\r
454 break;\r
455 }\r
456\r
457 //\r
458 // If the user hits the YES Response key\r
459 //\r
460 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
461 //\r
462 // Save change\r
463 //\r
464 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
465 FakeNvData = &Private->FakeNvData;\r
466\r
467 Status = HiiGetBrowserData (\r
468 &mSystemConfigGuid,\r
469 mVariableName,\r
470 sizeof (SYSTEM_CONFIGURATION),\r
471 (UINT8 *) FakeNvData\r
472 );\r
473 if (!EFI_ERROR (Status)) {\r
474 Status = gRT->SetVariable (\r
475 L"Setup",\r
476 &mNormalSetupGuid,\r
477 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
478 sizeof(SYSTEM_CONFIGURATION),\r
479 &Private->FakeNvData\r
480 );\r
481 }\r
482\r
483 //\r
484 // Reset system\r
485 //\r
486 gRT->ResetSystem(\r
487 EfiResetCold,\r
488 EFI_SUCCESS,\r
489 0,\r
490 NULL\r
491 );\r
492\r
493 }\r
494\r
495\r
496 }\r
497 else if (KeyValue == 0xF001) {\r
498 //\r
499 // Popup a menu to notice user\r
500 //\r
501 StrCpy (StringBuffer1, L"Do you want to Commit Changes and Exit?");\r
502 StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");\r
503\r
504 do {\r
505 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
506 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
507\r
508 //\r
509 // If the user hits the YES Response key\r
510 //\r
511 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
512 //\r
513 // Save change\r
514 //\r
515 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
516 FakeNvData = &Private->FakeNvData;\r
517\r
518 Status = HiiGetBrowserData (\r
519 &mSystemConfigGuid,\r
520 mVariableName,\r
521 sizeof (SYSTEM_CONFIGURATION),\r
522 (UINT8 *) FakeNvData\r
523 );\r
524 if (!EFI_ERROR (Status)) {\r
525 Status = gRT->SetVariable (\r
526 L"Setup",\r
527 &mNormalSetupGuid,\r
528 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
529 sizeof(SYSTEM_CONFIGURATION),\r
530 &Private->FakeNvData\r
531 );\r
532 }\r
533\r
534 //\r
535 // Update Secure Boot configuration changes\r
536 //\r
537 CheckSystemConfigSave(FakeNvData);\r
538\r
539 //\r
540 // Reset system\r
541 //\r
542 if (GlobalReset == TRUE) {\r
543 //\r
544 // Issue full reset\r
545 //\r
546 IoWrite8 (\r
547 (UINTN) 0XCF9,\r
548 (UINT8) 0x02\r
549 );\r
550\r
551 IoWrite8 (\r
552 (UINTN) 0xCF9,\r
553 (UINT8) 0x0E\r
554 );\r
555 } else {\r
556 gRT->ResetSystem(\r
557 EfiResetCold,\r
558 EFI_SUCCESS,\r
559 0,\r
560 NULL\r
561 );\r
562 }\r
563 }\r
564 } else if (KeyValue == 0xF002) {\r
565 //\r
566 // Popup a menu to notice user\r
567 //\r
568 StrCpy (StringBuffer1, L"Do you want to Discard Changes and Exit?");\r
569 StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");\r
570\r
571 do {\r
572 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
573 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
574\r
575 //\r
576 // If the user hits the YES Response key\r
577 //\r
578 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
579 //\r
580 // Reset system\r
581 //\r
582 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);\r
583 }\r
584 } else if (KeyValue == 0xF003) {\r
585 //\r
586 // Popup a menu to notice user\r
587 //\r
588 StrCpy (StringBuffer1, L"Do you want to load setup defaults and Exit?");\r
589 StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");\r
590\r
591 do {\r
592 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
593 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
594\r
595 //\r
596 // If the user hits the YES Response key\r
597 //\r
598 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
599 //\r
600 // Load default\r
601 //\r
602 FakeNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));\r
603\r
604 if (FakeNvData == NULL) {\r
605 return EFI_OUT_OF_RESOURCES;\r
606 }\r
607\r
608 SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);\r
609 Status = gRT->GetVariable(\r
610 L"SetupDefault",\r
611 &mNormalSetupGuid,\r
612 NULL,\r
613 &SizeOfNvStore,\r
614 FakeNvData\r
615 );\r
616 if (!EFI_ERROR (Status)) {\r
617 if(SizeOfNvStore >= sizeof(SYSTEM_CONFIGURATION)) {\r
618 Status = gRT->SetVariable (\r
619 L"Setup",\r
620 &mNormalSetupGuid,\r
621 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
622 sizeof(SYSTEM_CONFIGURATION),\r
623 FakeNvData\r
624 );\r
625 }\r
626 }\r
627\r
628 FreePool (FakeNvData);\r
629\r
630 DataSize = sizeof(OsSelection);\r
631 Status = gRT->GetVariable(\r
632 L"OsSelection",\r
633 &gOsSelectionVariableGuid,\r
634 NULL,\r
635 &DataSize,\r
636 &OsSelection\r
637 );\r
638\r
639 if (EFI_ERROR(Status) || (OsSelection != FakeNvData->ReservedO)) {\r
640 OsSelection = FakeNvData->ReservedO;\r
641 Status = gRT->SetVariable (\r
642 L"OsSelection",\r
643 &gOsSelectionVariableGuid,\r
644 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
645 sizeof(OsSelection),\r
646 &OsSelection\r
647 );\r
648 }\r
649\r
650 //\r
651 // Reset system\r
652 //\r
653 gRT->ResetSystem(\r
654 EfiResetCold,\r
655 EFI_SUCCESS,\r
656 0,\r
657 NULL\r
658 );\r
659 }\r
660 } else if ((KeyValue == 0x123A) || (KeyValue == 0x123B) || (KeyValue == 0x123C)) {\r
661 StrCpy (StringBuffer1, L"WARNING: Enable or disable USB Controllers will ");\r
662 StrCpy (StringBuffer2, L"make global reset to restart system.");\r
663 StrCpy (StringBuffer3, L"Press Enter/ESC to continue...");\r
664 //\r
665 // Popup a menu to notice user\r
666 //\r
667 do {\r
668 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3, NULL);\r
669 } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
670\r
671 FakeNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));\r
672 Status = HiiGetBrowserData (\r
673 &mSystemConfigGuid,\r
674 mVariableName,\r
675 sizeof (SYSTEM_CONFIGURATION),\r
676 (UINT8 *) FakeNvData\r
677 );\r
678 //\r
679 // Get variable data\r
680 //\r
681 SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);\r
682 SetupData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));\r
683 Status = gRT->GetVariable(\r
684 L"Setup",\r
685 &mNormalSetupGuid,\r
686 NULL,\r
687 &SizeOfNvStore,\r
688 SetupData\r
689 );\r
690 if ((SetupData->UsbAutoMode != FakeNvData->UsbAutoMode) ||\r
691 (SetupData->UsbXhciSupport != FakeNvData->UsbXhciSupport) ||\r
692 (SetupData->PchUsb20 != FakeNvData->PchUsb20)) {\r
693 GlobalReset = TRUE;\r
694 } else {\r
695 GlobalReset = FALSE;\r
696 }\r
697\r
698 }\r
699 }\r
700 break;\r
701\r
702 default:\r
703 break;\r
704 }\r
705\r
706 FreePool (StringBuffer1);\r
707 FreePool (StringBuffer2);\r
708 FreePool (StringBuffer3);\r
709\r
710 //\r
711 // Workaround for Load Default for "DPTF Enable"\r
712 //\r
713 if (Action == EFI_BROWSER_ACTION_DEFAULT_STANDARD) {\r
714 if (KeyValue == 0x1239) {\r
715 return EFI_NOT_FOUND;\r
716 }\r
717 }\r
718\r
719 if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
720 //\r
721 // Do nothing for UEFI OPEN/CLOSE Action\r
722 //\r
723 return EFI_SUCCESS;\r
724 }\r
725\r
726 Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
727 FakeNvData = &Private->FakeNvData;\r
728 if (!HiiGetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData)) {\r
729 return EFI_NOT_FOUND;\r
730 }\r
731\r
732 if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) && (Private->FakeNvData.ReservedO != Private->BackupNvData.ReservedO)) {\r
733 Private->BackupNvData.ReservedO = Private->FakeNvData.ReservedO;\r
734 LoadLpssDefaultValues (Private);\r
735 }\r
736\r
737 //\r
738 // When user selected the secure erase, set it to disable\r
739 //\r
740 if((KeyValue == 0x1240) && (Action == EFI_BROWSER_ACTION_CHANGED)) {\r
741 FakeNvData->SecureErase = 0;\r
742 }\r
743\r
744 if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_CHANGED)) {\r
745 //\r
746 // If function 0 is disabled, function 1 ~ 7 also required to be disabled.\r
747 //\r
748 if (Private->FakeNvData.LpssDma0Enabled == 0) {\r
749 Private->FakeNvData.LpssHsuart0Enabled = 0;\r
750 Private->FakeNvData.LpssHsuart1Enabled = 0;\r
751 Private->FakeNvData.LpssPwm0Enabled = 0;\r
752 Private->FakeNvData.LpssPwm1Enabled = 0;\r
753 Private->FakeNvData.LpssSpiEnabled = 0;\r
754 }\r
755\r
756\r
757 //\r
758 // If function 0 is disabled, function 1 ~ 7 also required to be disabled.\r
759 //\r
760 if (Private->FakeNvData.LpssDma1Enabled == 0) {\r
761 Private->FakeNvData.LpssI2C0Enabled = 0;\r
762 Private->FakeNvData.LpssI2C1Enabled = 0;\r
763 Private->FakeNvData.LpssI2C2Enabled = 0;\r
764 Private->FakeNvData.LpssI2C3Enabled = 0;\r
765 Private->FakeNvData.LpssI2C4Enabled = 0;\r
766 Private->FakeNvData.LpssI2C5Enabled = 0;\r
767 Private->FakeNvData.LpssI2C6Enabled = 0;\r
768 }\r
769 }\r
770\r
771\r
772 //\r
773 // Pass changed uncommitted data back to Form Browser\r
774 //\r
775 HiiSetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData, NULL);\r
776\r
777 return EFI_SUCCESS;\r
778}\r
779\r
780\r
781/**\r
782 The driver Entry Point. The funciton will export a disk device class formset and\r
783 its callback function to hii database.\r
784\r
785 @param ImageHandle The firmware allocated handle for the EFI image.\r
786 @param SystemTable A pointer to the EFI System Table.\r
787\r
788 @retval EFI_SUCCESS The entry point is executed successfully.\r
789 @retval other Some error occurs when executing this entry point.\r
790\r
791**/\r
792EFI_STATUS\r
793EFIAPI\r
794PlatformSetupDxeInit (\r
795 IN EFI_HANDLE ImageHandle,\r
796 IN EFI_SYSTEM_TABLE *SystemTable\r
797 )\r
798{\r
799 EFI_STATUS Status;\r
800 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
801\r
802 mImageHandle = ImageHandle;\r
803\r
804 //\r
805 // There should only be one Form Configuration protocol\r
806 //\r
807 Status = gBS->LocateProtocol (\r
808 &gEfiFormBrowser2ProtocolGuid,\r
809 NULL,\r
810 (VOID **) &FormBrowser2\r
811 );\r
812 if (EFI_ERROR (Status)) {\r
813 return Status;\r
814 }\r
815\r
816 mCallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));\r
817 if (mCallbackInfo == NULL) {\r
818 return EFI_BAD_BUFFER_SIZE;\r
819 }\r
820\r
821 mCallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;\r
822 mCallbackInfo->ConfigAccess.ExtractConfig = SystemConfigExtractConfig;\r
823 mCallbackInfo->ConfigAccess.RouteConfig = SystemConfigRouteConfig;\r
824 mCallbackInfo->ConfigAccess.Callback = SystemConfigCallback;\r
825\r
826 //\r
827 // Install Device Path Protocol and Config Access protocol to driver handle\r
828 // Install Platform Driver Override Protocol to driver handle\r
829 //\r
830 Status = gBS->InstallMultipleProtocolInterfaces (\r
831 &mCallbackInfo->DriverHandle,\r
832 &gEfiDevicePathProtocolGuid,\r
833 &mHiiVendorDevicePath,\r
834 &gEfiHiiConfigAccessProtocolGuid,\r
835 &mCallbackInfo->ConfigAccess,\r
836 NULL\r
837 );\r
838 if (EFI_ERROR (Status)) {\r
839 goto Finish;\r
840 }\r
841\r
842 //\r
843 // Publish our HII data\r
844 //\r
845 mCallbackInfo->RegisteredHandle = HiiAddPackages (\r
846 &mSystemConfigGuid,\r
847 mCallbackInfo->DriverHandle,\r
848 VfrBin,\r
849 PlatformSetupDxeStrings,\r
850 NULL\r
851 );\r
852 if (mCallbackInfo->RegisteredHandle == NULL) {\r
853 Status = EFI_OUT_OF_RESOURCES;\r
854 goto Finish;\r
855 }\r
856\r
857 mHiiHandle = mCallbackInfo->RegisteredHandle;\r
858\r
859 //\r
860 // Locate ConfigRouting protocol\r
861 //\r
862 Status = gBS->LocateProtocol (\r
863 &gEfiHiiConfigRoutingProtocolGuid,\r
864 NULL,\r
865 (VOID **) &mCallbackInfo->HiiConfigRouting\r
866 );\r
867 if (EFI_ERROR (Status)) {\r
868 goto Finish;\r
869 }\r
870\r
871 //\r
872 // Clear all the globle variable\r
873 //\r
874 return EFI_SUCCESS;\r
875\r
876Finish:\r
877 if (mCallbackInfo->DriverHandle != NULL) {\r
878 gBS->UninstallMultipleProtocolInterfaces (\r
879 mCallbackInfo->DriverHandle,\r
880 &gEfiDevicePathProtocolGuid,\r
881 &mHiiVendorDevicePath,\r
882 &gEfiHiiConfigAccessProtocolGuid,\r
883 &mCallbackInfo->ConfigAccess,\r
884 NULL\r
885 );\r
886 }\r
887\r
888 if (mCallbackInfo->RegisteredHandle != NULL) {\r
889 HiiRemovePackages (mCallbackInfo->RegisteredHandle);\r
890 }\r
891\r
892 if (mCallbackInfo != NULL) {\r
893 FreePool (mCallbackInfo);\r
894 }\r
895\r
896 return Status;\r
897}\r
898\r
899/**\r
900 Unload its installed protocol.\r
901\r
902 @param[in] ImageHandle Handle that identifies the image to be unloaded.\r
903\r
904 @retval EFI_SUCCESS The image has been unloaded.\r
905**/\r
906EFI_STATUS\r
907EFIAPI\r
908PlatformSetupDxeUnload (\r
909 IN EFI_HANDLE ImageHandle\r
910 )\r
911{\r
912 if (mCallbackInfo != NULL) {\r
913 if (mCallbackInfo->DriverHandle != NULL) {\r
914 gBS->UninstallMultipleProtocolInterfaces (\r
915 mCallbackInfo->DriverHandle,\r
916 &gEfiDevicePathProtocolGuid,\r
917 &mHiiVendorDevicePath,\r
918 &gEfiHiiConfigAccessProtocolGuid,\r
919 &mCallbackInfo->ConfigAccess,\r
920 NULL\r
921 );\r
922 }\r
923\r
924 if (mCallbackInfo->RegisteredHandle != NULL) {\r
925 HiiRemovePackages (mCallbackInfo->RegisteredHandle);\r
926 }\r
927\r
928 FreePool (mCallbackInfo);\r
929 }\r
930\r
931 return EFI_SUCCESS;\r
932}\r
933\r