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