mirror of https://github.com/acidanthera/audk.git
934 lines
31 KiB
C
934 lines
31 KiB
C
|
/** @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;
|
||
|
}
|
||
|
|