summaryrefslogtreecommitdiff
path: root/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c
diff options
context:
space:
mode:
Diffstat (limited to 'Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c')
-rw-r--r--Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c933
1 files changed, 933 insertions, 0 deletions
diff --git a/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c b/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c
new file mode 100644
index 0000000000..1490e2c030
--- /dev/null
+++ b/Vlv2TbltDevicePkg/PlatformSetupDxe/PlatformSetupDxe.c
@@ -0,0 +1,933 @@
+/** @file
+
+ Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
+
+ This program and the accompanying materials are licensed and made available under
+ the terms and conditions of the BSD License that accompanies this distribution.
+ The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php.
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+Module Name:
+
+**/
+
+#include "PlatformSetupDxe.h"
+#include "Guid/SetupVariable.h"
+
+#define EFI_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('C', 'l', 'b', 'k')
+#define EFI_CALLBACK_INFO_FROM_THIS(a) CR (a, EFI_CALLBACK_INFO, ConfigAccess, EFI_CALLBACK_INFO_SIGNATURE)
+
+typedef struct {
+ UINTN Signature;
+ EFI_HANDLE DriverHandle;
+ EFI_HII_HANDLE RegisteredHandle;
+ SYSTEM_CONFIGURATION FakeNvData;
+ SYSTEM_CONFIGURATION BackupNvData;
+ EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
+ EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
+} EFI_CALLBACK_INFO;
+
+#pragma pack(1)
+
+//
+// HII specific Vendor Device Path definition.
+//
+typedef struct {
+ VENDOR_DEVICE_PATH VendorDevicePath;
+ EFI_DEVICE_PATH_PROTOCOL End;
+} HII_VENDOR_DEVICE_PATH;
+
+#pragma pack()
+
+//
+// uni string and Vfr Binary data.
+//
+extern UINT8 VfrBin[];
+extern UINT8 PlatformSetupDxeStrings[];
+
+EFI_HANDLE mImageHandle;
+
+//
+// module global data
+//
+#define EFI_NORMAL_SETUP_GUID \
+ { 0xec87d643, 0xeba4, 0x4bb5, 0xa1, 0xe5, 0x3f, 0x3e, 0x36, 0xb2, 0xd, 0xa9 }
+
+EFI_GUID mNormalSetupGuid = EFI_NORMAL_SETUP_GUID;
+
+EFI_GUID mSystemConfigGuid = SYSTEM_CONFIGURATION_GUID;
+CHAR16 mVariableName[] = L"Setup";
+CHAR16 mSetupName[] = L"Setup";
+EFI_CALLBACK_INFO *mCallbackInfo;
+BOOLEAN GlobalReset=FALSE;
+
+HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
+ {
+ {
+ HARDWARE_DEVICE_PATH,
+ HW_VENDOR_DP,
+ {
+ (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+ (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+ }
+ },
+ EFI_CALLER_ID_GUID
+ },
+ {
+ END_DEVICE_PATH_TYPE,
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,
+ {
+ (UINT8) (END_DEVICE_PATH_LENGTH),
+ (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+ }
+ }
+};
+
+/**
+ This function allows a caller to extract the current configuration for one
+ or more named elements from the target driver.
+
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+ @param Request A null-terminated Unicode string in <ConfigRequest> format.
+ @param Progress On return, points to a character in the Request string.
+ Points to the string's null terminator if request was successful.
+ Points to the most recent '&' before the first failing name/value
+ pair (or the beginning of the string if the failure is in the
+ first name/value pair) if the request was not successful.
+ @param Results A null-terminated Unicode string in <ConfigAltResp> format which
+ has all values filled in for the names in the Request string.
+ String to be allocated by the called function.
+
+ @retval EFI_SUCCESS The Results is filled with the requested values.
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
+ @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.
+ @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
+
+**/
+
+VOID
+CheckSystemConfigLoad(SYSTEM_CONFIGURATION *SystemConfigPtr);
+
+VOID
+CheckSystemConfigSave(SYSTEM_CONFIGURATION *SystemConfigPtr);
+
+VOID
+ConfirmSecureBootTest();
+
+VOID
+LoadLpssDefaultValues (
+ IN EFI_CALLBACK_INFO *Private
+ )
+{
+ //
+ // Load LPSS and SCC defalut configurations for Android
+ //
+ Private->FakeNvData.LpsseMMCEnabled = FALSE;
+ Private->FakeNvData.LpssSdioEnabled = TRUE;
+ Private->FakeNvData.LpssSdcardEnabled = TRUE;
+ Private->FakeNvData.LpssSdCardSDR25Enabled = FALSE;
+ Private->FakeNvData.LpssSdCardDDR50Enabled = TRUE;
+ Private->FakeNvData.LpssMipiHsi = FALSE;
+ Private->FakeNvData.LpsseMMC45Enabled = TRUE;
+ Private->FakeNvData.LpsseMMC45DDR50Enabled = TRUE;
+ Private->FakeNvData.LpsseMMC45HS200Enabled = FALSE;
+ Private->FakeNvData.LpsseMMC45RetuneTimerValue = 8;
+ Private->FakeNvData.eMMCBootMode = 1; // Auto Detect
+
+ Private->FakeNvData.GOPEnable = TRUE;
+ Private->FakeNvData.SecureBoot = TRUE;
+ Private->FakeNvData.UsbAutoMode = TRUE;
+ Private->FakeNvData.UsbXhciSupport = TRUE;
+ Private->FakeNvData.PchUsb30Mode = TRUE;
+ Private->FakeNvData.LegacyUSBBooting = FALSE;
+ Private->FakeNvData.PchUsb20 = FALSE;
+}
+
+
+EFI_STATUS
+EFIAPI
+SystemConfigExtractConfig (
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
+ IN CONST EFI_STRING Request,
+ OUT EFI_STRING *Progress,
+ OUT EFI_STRING *Results
+ )
+{
+ EFI_STATUS Status;
+ EFI_CALLBACK_INFO *Private;
+ EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
+ EFI_STRING ConfigRequestHdr;
+ EFI_STRING ConfigRequest;
+ BOOLEAN AllocatedRequest;
+ UINTN Size;
+ UINTN BufferSize;
+ VOID *SystemConfigPtr;
+
+
+ if (Progress == NULL || Results == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Progress = Request;
+ if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mSystemConfigGuid, mVariableName)) {
+ return EFI_NOT_FOUND;
+ }
+
+ ConfigRequestHdr = NULL;
+ ConfigRequest = NULL;
+ Size = 0;
+ AllocatedRequest = FALSE;
+
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+
+ SetupInfo();
+
+ HiiConfigRouting = Private->HiiConfigRouting;
+ ConfigRequest = Request;
+ if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
+ //
+ // Request has no request element, construct full request string.
+ // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
+ // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
+ //
+ ConfigRequestHdr = HiiConstructConfigHdr (&mSystemConfigGuid, mVariableName, Private->DriverHandle);
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
+ ASSERT (ConfigRequest != NULL);
+ AllocatedRequest = TRUE;
+ BufferSize = sizeof (SYSTEM_CONFIGURATION);
+ UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
+ FreePool (ConfigRequestHdr);
+ }
+ SystemConfigPtr = GetVariable(mSetupName, &mNormalSetupGuid);
+
+
+ if (SystemConfigPtr == NULL) {
+ ZeroMem(&Private->FakeNvData, sizeof(SYSTEM_CONFIGURATION));
+ ZeroMem(&Private->BackupNvData, sizeof(SYSTEM_CONFIGURATION));
+ } else {
+ CheckSystemConfigLoad(SystemConfigPtr);
+ CopyMem(&Private->FakeNvData, SystemConfigPtr, sizeof(SYSTEM_CONFIGURATION));
+ CopyMem(&Private->BackupNvData, SystemConfigPtr, sizeof(SYSTEM_CONFIGURATION));
+ FreePool(SystemConfigPtr);
+ }
+
+ //
+ // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
+ //
+ Status = HiiConfigRouting->BlockToConfig (
+ HiiConfigRouting,
+ ConfigRequest,
+ (UINT8 *) &Private->FakeNvData,
+ sizeof (SYSTEM_CONFIGURATION),
+ Results,
+ Progress
+ );
+
+ //
+ // Free the allocated config request string.
+ //
+ if (AllocatedRequest) {
+ FreePool (ConfigRequest);
+ ConfigRequest = NULL;
+ }
+
+ //
+ // Set Progress string to the original request string.
+ //
+ if (Request == NULL) {
+ *Progress = NULL;
+ } else if (StrStr (Request, L"OFFSET") == NULL) {
+ *Progress = Request + StrLen (Request);
+ }
+
+ return Status;
+}
+
+/**
+ This function processes the results of changes in configuration.
+
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+ @param Configuration A null-terminated Unicode string in <ConfigRequest> format.
+ @param Progress A pointer to a string filled in with the offset of the most
+ recent '&' before the first failing name/value pair (or the
+ beginning of the string if the failure is in the first
+ name/value pair) or the terminating NULL if all was successful.
+
+ @retval EFI_SUCCESS The Results is processed successfully.
+ @retval EFI_INVALID_PARAMETER Configuration is NULL.
+ @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+SystemConfigRouteConfig (
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
+ IN CONST EFI_STRING Configuration,
+ OUT EFI_STRING *Progress
+ )
+{
+ EFI_CALLBACK_INFO *Private;
+ SYSTEM_CONFIGURATION *FakeNvData;
+
+ if (Configuration == NULL || Progress == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ *Progress = Configuration;
+
+ if (!HiiIsConfigHdrMatch (Configuration, &mSystemConfigGuid, mVariableName)) {
+ return EFI_NOT_FOUND;
+ }
+
+ *Progress = Configuration + StrLen (Configuration);
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+ FakeNvData = &Private->FakeNvData;
+ if (!HiiGetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData)) {
+ //
+ // FakeNvData can't be got from SetupBrowser, which doesn't need to be set.
+ //
+ return EFI_SUCCESS;
+ }
+
+ if (Private->FakeNvData.ReservedO != Private->BackupNvData.ReservedO) {
+ Private->BackupNvData.ReservedO = Private->FakeNvData.ReservedO;
+ LoadLpssDefaultValues (Private);
+
+ //
+ // Pass changed uncommitted data back to Form Browser
+ //
+ HiiSetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData, NULL);
+ }
+
+ gRT->SetVariable(
+ mSetupName,
+ &mNormalSetupGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ sizeof(SYSTEM_CONFIGURATION),
+ &Private->FakeNvData
+ );
+
+ CheckSystemConfigSave(&Private->FakeNvData);
+ return EFI_SUCCESS;
+}
+
+/**
+ This is the function that is called to provide results data to the driver. This data
+ consists of a unique key which is used to identify what data is either being passed back
+ or being asked for.
+
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+ @param Action A null-terminated Unicode string in <ConfigRequest> format.
+ @param KeyValue A unique Goto OpCode callback value which record user's selection.
+ 0x100 <= KeyValue <0x500 : user select a controller item in the first page;
+ KeyValue == 0x1234 : user select 'Refresh' in first page, or user select 'Go to Previous Menu' in second page
+ KeyValue == 0x1235 : user select 'Pci device filter' in first page
+ KeyValue == 0x1500 : user select 'order ... priority' item in second page
+ KeyValue == 0x1800 : user select 'commint changes' in third page
+ KeyValue == 0x2000 : user select 'Go to Previous Menu' in third page
+ @param Type The type of value for the question.
+ @param Value A pointer to the data being sent to the original exporting driver.
+ @param ActionRequest On return, points to the action requested by the callback function.
+
+ @retval EFI_SUCCESS Always returned.
+
+**/
+EFI_STATUS
+EFIAPI
+SystemConfigCallback (
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
+ IN EFI_BROWSER_ACTION Action,
+ IN EFI_QUESTION_ID KeyValue,
+ IN UINT8 Type,
+ IN EFI_IFR_TYPE_VALUE *Value,
+ OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
+ )
+{
+ EFI_CALLBACK_INFO *Private;
+ SYSTEM_CONFIGURATION *FakeNvData;
+ SYSTEM_CONFIGURATION *SetupData;
+ UINTN SizeOfNvStore;
+ EFI_INPUT_KEY Key;
+ CHAR16 *StringBuffer1;
+ CHAR16 *StringBuffer2;
+ CHAR16 *StringBuffer3;
+ EFI_STATUS Status;
+ UINTN DataSize;
+ UINT8 OsSelection;
+
+ StringBuffer1 = AllocateZeroPool (200 * sizeof (CHAR16));
+ ASSERT (StringBuffer1 != NULL);
+ StringBuffer2 = AllocateZeroPool (200 * sizeof (CHAR16));
+ ASSERT (StringBuffer2 != NULL);
+ StringBuffer3 = AllocateZeroPool (200 * sizeof (CHAR16));
+ ASSERT (StringBuffer3 != NULL);
+
+ switch (Action) {
+ case EFI_BROWSER_ACTION_CHANGING:
+ {
+ if (KeyValue == 0x1235) {
+ StrCpy (StringBuffer1, L"Will you disable PTT ? ");
+ StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)");
+
+ //
+ // Popup a menu to notice user
+ //
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the YES Response key,
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+
+ }
+ } else if (KeyValue == 0x1236) {
+ StrCpy (StringBuffer1, L"Will you revoke trust ? ");
+ StrCpy (StringBuffer2, L"Enter (YES) / Esc (NO)");
+
+ //
+ // Popup a menu to notice user
+ //
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the YES Response key,
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+
+ }
+ } else if (KeyValue == 0x1239) {
+ if (Value->u8 == 0x00) {
+ StrCpy (StringBuffer1, L"WARNING: SOC may be damaged due to high temperature");
+ StrCpy (StringBuffer2, L"when DPTF is disabled and IGD turbo is enabled.");
+ StrCpy (StringBuffer3, L"Press Enter/ESC to continue...");
+
+ //
+ // Popup a menu to notice user
+ //
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+ }
+ } else if (KeyValue == 0x1240) { // secure erase feature of eMMC
+ //
+ // Popup a menu to notice user
+ //
+ StrCpy (StringBuffer1, L"WARNING: All your data on the eMMC will be lost");
+ StrCpy (StringBuffer2, L"Do you really want to enable secure erase on eMMC?");
+ StrCpy (StringBuffer3, L" Enter (YES) / Esc (NO) ");
+
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3,NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the ESC Response key,
+ //
+ if (Key.ScanCode == SCAN_ESC) {
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+ FakeNvData = &Private->FakeNvData;
+
+ Status = HiiGetBrowserData (
+ &mSystemConfigGuid,
+ mVariableName,
+ sizeof (SYSTEM_CONFIGURATION),
+ (UINT8 *) FakeNvData
+ );
+ if (!EFI_ERROR (Status)) {
+ FakeNvData->SecureErase = 0;
+ HiiSetBrowserData (
+ &mSystemConfigGuid,
+ mVariableName,
+ sizeof (SYSTEM_CONFIGURATION),
+ (UINT8 *) FakeNvData,
+ NULL
+ );
+ }
+ break;
+ }
+
+ //
+ // If the user hits the YES Response key
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+ //
+ // Save change
+ //
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+ FakeNvData = &Private->FakeNvData;
+
+ Status = HiiGetBrowserData (
+ &mSystemConfigGuid,
+ mVariableName,
+ sizeof (SYSTEM_CONFIGURATION),
+ (UINT8 *) FakeNvData
+ );
+ if (!EFI_ERROR (Status)) {
+ Status = gRT->SetVariable (
+ L"Setup",
+ &mNormalSetupGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ sizeof(SYSTEM_CONFIGURATION),
+ &Private->FakeNvData
+ );
+ }
+
+ //
+ // Reset system
+ //
+ gRT->ResetSystem(
+ EfiResetCold,
+ EFI_SUCCESS,
+ 0,
+ NULL
+ );
+
+ }
+
+
+ }
+ else if (KeyValue == 0xF001) {
+ //
+ // Popup a menu to notice user
+ //
+ StrCpy (StringBuffer1, L"Do you want to Commit Changes and Exit?");
+ StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");
+
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the YES Response key
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+ //
+ // Save change
+ //
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+ FakeNvData = &Private->FakeNvData;
+
+ Status = HiiGetBrowserData (
+ &mSystemConfigGuid,
+ mVariableName,
+ sizeof (SYSTEM_CONFIGURATION),
+ (UINT8 *) FakeNvData
+ );
+ if (!EFI_ERROR (Status)) {
+ Status = gRT->SetVariable (
+ L"Setup",
+ &mNormalSetupGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ sizeof(SYSTEM_CONFIGURATION),
+ &Private->FakeNvData
+ );
+ }
+
+ //
+ // Update Secure Boot configuration changes
+ //
+ CheckSystemConfigSave(FakeNvData);
+
+ //
+ // Reset system
+ //
+ if (GlobalReset == TRUE) {
+ //
+ // Issue full reset
+ //
+ IoWrite8 (
+ (UINTN) 0XCF9,
+ (UINT8) 0x02
+ );
+
+ IoWrite8 (
+ (UINTN) 0xCF9,
+ (UINT8) 0x0E
+ );
+ } else {
+ gRT->ResetSystem(
+ EfiResetCold,
+ EFI_SUCCESS,
+ 0,
+ NULL
+ );
+ }
+ }
+ } else if (KeyValue == 0xF002) {
+ //
+ // Popup a menu to notice user
+ //
+ StrCpy (StringBuffer1, L"Do you want to Discard Changes and Exit?");
+ StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");
+
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the YES Response key
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+ //
+ // Reset system
+ //
+ gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);
+ }
+ } else if (KeyValue == 0xF003) {
+ //
+ // Popup a menu to notice user
+ //
+ StrCpy (StringBuffer1, L"Do you want to load setup defaults and Exit?");
+ StrCpy (StringBuffer2, L" Enter (YES) / Esc (NO) ");
+
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ //
+ // If the user hits the YES Response key
+ //
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
+ //
+ // Load default
+ //
+ FakeNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));
+
+ if (FakeNvData == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);
+ Status = gRT->GetVariable(
+ L"SetupDefault",
+ &mNormalSetupGuid,
+ NULL,
+ &SizeOfNvStore,
+ FakeNvData
+ );
+ if (!EFI_ERROR (Status)) {
+ if(SizeOfNvStore >= sizeof(SYSTEM_CONFIGURATION)) {
+ Status = gRT->SetVariable (
+ L"Setup",
+ &mNormalSetupGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ sizeof(SYSTEM_CONFIGURATION),
+ FakeNvData
+ );
+ }
+ }
+
+ FreePool (FakeNvData);
+
+ DataSize = sizeof(OsSelection);
+ Status = gRT->GetVariable(
+ L"OsSelection",
+ &gOsSelectionVariableGuid,
+ NULL,
+ &DataSize,
+ &OsSelection
+ );
+
+ if (EFI_ERROR(Status) || (OsSelection != FakeNvData->ReservedO)) {
+ OsSelection = FakeNvData->ReservedO;
+ Status = gRT->SetVariable (
+ L"OsSelection",
+ &gOsSelectionVariableGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ sizeof(OsSelection),
+ &OsSelection
+ );
+ }
+
+ //
+ // Reset system
+ //
+ gRT->ResetSystem(
+ EfiResetCold,
+ EFI_SUCCESS,
+ 0,
+ NULL
+ );
+ }
+ } else if ((KeyValue == 0x123A) || (KeyValue == 0x123B) || (KeyValue == 0x123C)) {
+ StrCpy (StringBuffer1, L"WARNING: Enable or disable USB Controllers will ");
+ StrCpy (StringBuffer2, L"make global reset to restart system.");
+ StrCpy (StringBuffer3, L"Press Enter/ESC to continue...");
+ //
+ // Popup a menu to notice user
+ //
+ do {
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, StringBuffer3, NULL);
+ } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));
+
+ FakeNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));
+ Status = HiiGetBrowserData (
+ &mSystemConfigGuid,
+ mVariableName,
+ sizeof (SYSTEM_CONFIGURATION),
+ (UINT8 *) FakeNvData
+ );
+ //
+ // Get variable data
+ //
+ SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION);
+ SetupData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION));
+ Status = gRT->GetVariable(
+ L"Setup",
+ &mNormalSetupGuid,
+ NULL,
+ &SizeOfNvStore,
+ SetupData
+ );
+ if ((SetupData->UsbAutoMode != FakeNvData->UsbAutoMode) ||
+ (SetupData->UsbXhciSupport != FakeNvData->UsbXhciSupport) ||
+ (SetupData->PchUsb20 != FakeNvData->PchUsb20)) {
+ GlobalReset = TRUE;
+ } else {
+ GlobalReset = FALSE;
+ }
+
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ FreePool (StringBuffer1);
+ FreePool (StringBuffer2);
+ FreePool (StringBuffer3);
+
+ //
+ // Workaround for Load Default for "DPTF Enable"
+ //
+ if (Action == EFI_BROWSER_ACTION_DEFAULT_STANDARD) {
+ if (KeyValue == 0x1239) {
+ return EFI_NOT_FOUND;
+ }
+ }
+
+ if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {
+ //
+ // Do nothing for UEFI OPEN/CLOSE Action
+ //
+ return EFI_SUCCESS;
+ }
+
+ Private = EFI_CALLBACK_INFO_FROM_THIS (This);
+ FakeNvData = &Private->FakeNvData;
+ if (!HiiGetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData)) {
+ return EFI_NOT_FOUND;
+ }
+
+ if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) && (Private->FakeNvData.ReservedO != Private->BackupNvData.ReservedO)) {
+ Private->BackupNvData.ReservedO = Private->FakeNvData.ReservedO;
+ LoadLpssDefaultValues (Private);
+ }
+
+ //
+ // When user selected the secure erase, set it to disable
+ //
+ if((KeyValue == 0x1240) && (Action == EFI_BROWSER_ACTION_CHANGED)) {
+ FakeNvData->SecureErase = 0;
+ }
+
+ if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_CHANGED)) {
+ //
+ // If function 0 is disabled, function 1 ~ 7 also required to be disabled.
+ //
+ if (Private->FakeNvData.LpssDma0Enabled == 0) {
+ Private->FakeNvData.LpssHsuart0Enabled = 0;
+ Private->FakeNvData.LpssHsuart1Enabled = 0;
+ Private->FakeNvData.LpssPwm0Enabled = 0;
+ Private->FakeNvData.LpssPwm1Enabled = 0;
+ Private->FakeNvData.LpssSpiEnabled = 0;
+ }
+
+
+ //
+ // If function 0 is disabled, function 1 ~ 7 also required to be disabled.
+ //
+ if (Private->FakeNvData.LpssDma1Enabled == 0) {
+ Private->FakeNvData.LpssI2C0Enabled = 0;
+ Private->FakeNvData.LpssI2C1Enabled = 0;
+ Private->FakeNvData.LpssI2C2Enabled = 0;
+ Private->FakeNvData.LpssI2C3Enabled = 0;
+ Private->FakeNvData.LpssI2C4Enabled = 0;
+ Private->FakeNvData.LpssI2C5Enabled = 0;
+ Private->FakeNvData.LpssI2C6Enabled = 0;
+ }
+ }
+
+
+ //
+ // Pass changed uncommitted data back to Form Browser
+ //
+ HiiSetBrowserData (&mSystemConfigGuid, mVariableName, sizeof (SYSTEM_CONFIGURATION), (UINT8 *) FakeNvData, NULL);
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ The driver Entry Point. The funciton will export a disk device class formset and
+ its callback function to hii database.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The entry point is executed successfully.
+ @retval other Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+PlatformSetupDxeInit (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
+
+ mImageHandle = ImageHandle;
+
+ //
+ // There should only be one Form Configuration protocol
+ //
+ Status = gBS->LocateProtocol (
+ &gEfiFormBrowser2ProtocolGuid,
+ NULL,
+ (VOID **) &FormBrowser2
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ mCallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));
+ if (mCallbackInfo == NULL) {
+ return EFI_BAD_BUFFER_SIZE;
+ }
+
+ mCallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
+ mCallbackInfo->ConfigAccess.ExtractConfig = SystemConfigExtractConfig;
+ mCallbackInfo->ConfigAccess.RouteConfig = SystemConfigRouteConfig;
+ mCallbackInfo->ConfigAccess.Callback = SystemConfigCallback;
+
+ //
+ // Install Device Path Protocol and Config Access protocol to driver handle
+ // Install Platform Driver Override Protocol to driver handle
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &mCallbackInfo->DriverHandle,
+ &gEfiDevicePathProtocolGuid,
+ &mHiiVendorDevicePath,
+ &gEfiHiiConfigAccessProtocolGuid,
+ &mCallbackInfo->ConfigAccess,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ goto Finish;
+ }
+
+ //
+ // Publish our HII data
+ //
+ mCallbackInfo->RegisteredHandle = HiiAddPackages (
+ &mSystemConfigGuid,
+ mCallbackInfo->DriverHandle,
+ VfrBin,
+ PlatformSetupDxeStrings,
+ NULL
+ );
+ if (mCallbackInfo->RegisteredHandle == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Finish;
+ }
+
+ mHiiHandle = mCallbackInfo->RegisteredHandle;
+
+ //
+ // Locate ConfigRouting protocol
+ //
+ Status = gBS->LocateProtocol (
+ &gEfiHiiConfigRoutingProtocolGuid,
+ NULL,
+ (VOID **) &mCallbackInfo->HiiConfigRouting
+ );
+ if (EFI_ERROR (Status)) {
+ goto Finish;
+ }
+
+ //
+ // Clear all the globle variable
+ //
+ return EFI_SUCCESS;
+
+Finish:
+ if (mCallbackInfo->DriverHandle != NULL) {
+ gBS->UninstallMultipleProtocolInterfaces (
+ mCallbackInfo->DriverHandle,
+ &gEfiDevicePathProtocolGuid,
+ &mHiiVendorDevicePath,
+ &gEfiHiiConfigAccessProtocolGuid,
+ &mCallbackInfo->ConfigAccess,
+ NULL
+ );
+ }
+
+ if (mCallbackInfo->RegisteredHandle != NULL) {
+ HiiRemovePackages (mCallbackInfo->RegisteredHandle);
+ }
+
+ if (mCallbackInfo != NULL) {
+ FreePool (mCallbackInfo);
+ }
+
+ return Status;
+}
+
+/**
+ Unload its installed protocol.
+
+ @param[in] ImageHandle Handle that identifies the image to be unloaded.
+
+ @retval EFI_SUCCESS The image has been unloaded.
+**/
+EFI_STATUS
+EFIAPI
+PlatformSetupDxeUnload (
+ IN EFI_HANDLE ImageHandle
+ )
+{
+ if (mCallbackInfo != NULL) {
+ if (mCallbackInfo->DriverHandle != NULL) {
+ gBS->UninstallMultipleProtocolInterfaces (
+ mCallbackInfo->DriverHandle,
+ &gEfiDevicePathProtocolGuid,
+ &mHiiVendorDevicePath,
+ &gEfiHiiConfigAccessProtocolGuid,
+ &mCallbackInfo->ConfigAccess,
+ NULL
+ );
+ }
+
+ if (mCallbackInfo->RegisteredHandle != NULL) {
+ HiiRemovePackages (mCallbackInfo->RegisteredHandle);
+ }
+
+ FreePool (mCallbackInfo);
+ }
+
+ return EFI_SUCCESS;
+}
+