alder_lake_bios/Intel/AlderLake/AlderLakeChipsetPkg/UefiSetupUtilityDxe/GenericCallback.c

2322 lines
74 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2014 - 2021, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <SetupUtility.h>
#include <Protocol/CpuIo2.h>
#include <Protocol/FormBrowserEx2.h>
#include <Library/PttHeciLib.h>
#include <CpuRegs.h>
#include <Protocol/MemInfo.h>
#include <Library/DxeMeLib.h>
#include <Library/VariableSupportLib.h>
#include <Protocol/H2OFormBrowser.h>
#include <Library/DxeOemSvcChipsetLib.h>
#include <PchResetPlatformSpecific.h>
// #include <SgxSetupData.h>
#include <Guid/H2OCp.h>
#include <Library/H2OCpLib.h>
#include <Library/PchInfoLib.h>
#include <HybridGraphicsDefine.h>
UINT16 gSCUSystemHealth;
EFI_EVENT gSCUTimerEvent;
BOOLEAN mPopLoadDefaultDialog = TRUE;
STATIC H2O_CP_HANDLE mSendFormAfterCpHandle = NULL;
UINT32 mScuRecord = 0;
extern BOOLEAN mMeReset;
EFI_STATUS
DiscardSetupDataChange (
VOID
);
EFI_STATUS
DiscardSaChange (
VOID
);
EFI_STATUS
DiscardMeChange (
VOID
);
EFI_STATUS
DiscardCpuChange (
VOID
);
EFI_STATUS
DiscardPchChange (
VOID
);
EFI_STATUS
DiscardSiChange (
VOID
);
EFI_STATUS
DiscardIccChange (
VOID
);
EFI_STATUS
DiscardMeStorageChange (
VOID
);
EFI_STATUS
LoadCustomRcOption (
VOID
);
EFI_STATUS
SaveCustomRcOption (
VOID
);
EFI_STATUS
EFIAPI
SendSubmitExitNotify (
VOID
)
{
EFI_STATUS Status;
H2O_DISPLAY_ENGINE_EVT_SUBMIT_EXIT SubmitExitNotify;
H2O_FORM_BROWSER_PROTOCOL *FBProtocol;
Status = gBS->LocateProtocol (
&gH2OFormBrowserProtocolGuid,
NULL,
(VOID **)&FBProtocol
);
if (!EFI_ERROR (Status)){
ZeroMem (&SubmitExitNotify, sizeof (SubmitExitNotify));
SubmitExitNotify.Hdr.Size = sizeof (H2O_DISPLAY_ENGINE_EVT_SUBMIT_EXIT);
SubmitExitNotify.Hdr.Type = H2O_DISPLAY_ENGINE_EVT_TYPE_SUBMIT_EXIT;
SubmitExitNotify.Hdr.Target = H2O_DISPLAY_ENGINE_EVT_TARGET_FORM_BROWSER;
Status = FBProtocol->Notify (FBProtocol, &SubmitExitNotify.Hdr);
}
return Status;
}
//[-start-190701-16990083-add]//
EFI_STATUS
EFIAPI
JumpToFirstQuestion (
VOID
)
{
EFI_STATUS Status;
H2O_FORM_BROWSER_PROTOCOL *FBProtocol;
H2O_DISPLAY_ENGINE_EVT_SELECT_Q SelectQNotify;
H2O_FORM_BROWSER_S *Statement;
UINTN Index;
H2O_FORM_BROWSER_P *CurrentP;
EFI_QUESTION_ID QuestionId;
Status = gBS->LocateProtocol (&gH2OFormBrowserProtocolGuid, NULL, (VOID **) &FBProtocol);
if (EFI_ERROR (Status)) {
return Status;
}
QuestionId = 0;
CurrentP = FBProtocol->CurrentP;
for (Index = 0; Index < CurrentP->NumberOfStatementIds; Index++) {
Statement = NULL;
Status = FBProtocol->GetSInfo (FBProtocol, CurrentP->PageId, CurrentP->StatementIds[Index], &Statement);
if (EFI_ERROR (Status)) {
continue;
}
if (!Statement->Selectable) {
continue;
}
QuestionId = Statement->QuestionId;
FreePool (Statement);
if (QuestionId != 0) {
break;
}
}
ZeroMem (&SelectQNotify, sizeof (H2O_DISPLAY_ENGINE_EVT_SELECT_Q));
SelectQNotify.Hdr.Size = sizeof (H2O_DISPLAY_ENGINE_EVT_SELECT_Q);
SelectQNotify.Hdr.Type = H2O_DISPLAY_ENGINE_EVT_TYPE_SELECT_Q;
SelectQNotify.Hdr.Target = H2O_DISPLAY_ENGINE_EVT_TARGET_FORM_BROWSER;
SelectQNotify.PageId = FBProtocol->CurrentP->PageId;
SelectQNotify.QuestionId = QuestionId;
SelectQNotify.IfrOpCode = 0;
return FBProtocol->Notify (FBProtocol, &SelectQNotify.Hdr);
}
//[-end-190701-16990083-add]//
STATIC
EFI_STATUS
FullReset (
IN BOOLEAN GlobalReset
)
{
PCH_RESET_DATA ResetData;
if (GlobalReset) {
//
// Because gRT->ResetSystem() producer supports PCH global reset, call it directly.
//
CopyMem (
&ResetData.Guid,
&gPchGlobalResetGuid,
sizeof (EFI_GUID)
);
StrCpyS (
ResetData.Description,
PCH_RESET_DATA_STRING_MAX_LENGTH,
PCH_PLATFORM_SPECIFIC_RESET_STRING
);
gRT->ResetSystem (EfiResetPlatformSpecific, EFI_SUCCESS, sizeof (ResetData), (VOID *) &ResetData);
//
// Should NOT reach here.
//
CpuDeadLoop();
}
return EFI_SUCCESS;
}
/**
Do full reset when exit setup utility at send form after checkpoint.
@param[in] Event The Event this notify function registered to.
@param[in] Handle The handle associated with a previously registered checkpoint handler.
**/
STATIC
VOID
EFIAPI
BdsCpSendFormAfterHandler (
IN EFI_EVENT Event,
IN H2O_CP_HANDLE Handle
)
{
EFI_STATUS Status;
Status = FullReset (TRUE);
ASSERT_EFI_ERROR (Status);
H2OCpUnregisterHandler (Handle);
mSendFormAfterCpHandle = NULL;
}
/**
Execute form browser action by EDK2 form browser extension 2 protocol
@param[in] Action Execute the request action.
@param[in] DefaultId The default Id info when need to load default value.
@retval EFI_SUCCESS Successfully execute form browser action
@retval Other Locate protocol fail
**/
EFI_STATUS
ExecuteFormBrowserAction (
IN UINT32 Action,
IN UINT16 DefaultId
)
{
EFI_STATUS Status;
EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2;
Status = gBS->LocateProtocol (
&gEdkiiFormBrowserEx2ProtocolGuid,
NULL,
(VOID **)&FormBrowserEx2
);
if (EFI_ERROR (Status)) {
return Status;
}
return FormBrowserEx2->ExecuteAction (Action, DefaultId);
}
EFI_STATUS
HotKeyCallBackByAction (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
)
{
EFI_STATUS Status;
Status = EFI_UNSUPPORTED;
switch (Action) {
case EFI_BROWSER_ACTION_CHANGING:
return EFI_SUCCESS;
case EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING:
if (QuestionId == KEY_SCAN_F9) {
mPopLoadDefaultDialog = FALSE;
Status = HotKeyCallBack (
This,
EFI_BROWSER_ACTION_CHANGED,
QuestionId,
Type,
Value,
ActionRequest
);
mPopLoadDefaultDialog = TRUE;
BrowserRefreshFormSet ();
}
//
// avoid GetQuestionDefault execute ExtractConfig, so always return success.
//
return EFI_SUCCESS;
default:
break;
}
return Status;
}
/**
Proccess HotKey function
@param [in] This
@param [in] HiiHandle
@param [in] Action
@param [in] QuestionId
@param [in] Type
@param [in] Value
@param [out] ActionRequest
**/
EFI_STATUS
HotKeyCallBack (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
)
{
CHIPSET_CONFIGURATION *MyIfrNVData;
CHAR16 *StringPtr;
SETUP_UTILITY_CONFIGURATION *SUCInfo;
EFI_INPUT_KEY Key;
EFI_STATUS Status;
UINT16 *BootOrderList;
UINTN BufferSize;
UINT8 CmosPlatformSetting;
CHIPSET_CONFIGURATION *NVData;
UINTN VariableSize;
EFI_GUID SetupVariableGuidId = SYSTEM_CONFIGURATION_GUID;
EFI_HII_HANDLE HiiHandle;
UINTN FullResetSize = 0;
UINT8 *FullResetValue;
UINT32 MeUnconfigOnRtc;
SETUP_DATA *MySetupDataIfrNVData;
SETUP_DATA *SetupDataNvDataInRom;
SA_SETUP *MySaIfrNVData;
SA_SETUP *SaNvDataInRom;
ME_SETUP *MyMeIfrNVData;
ME_SETUP *MeNvDataInRom;
CPU_SETUP *MyCpuIfrNVData;
CPU_SETUP *CpuNvDataInRom;
PCH_SETUP *MyPchIfrNVData;
PCH_SETUP *PchNvDataInRom;
SI_SETUP *MySiIfrNVData;
SI_SETUP *SiNvDataInRom;
ME_SETUP_STORAGE *MyMeStorageIfrNVData;
ME_SETUP_STORAGE *MeStorageNvDataInRom;
EFI_STATUS GetSetupStatus;
EFI_STATUS GetSetupDataStatus;
EFI_STATUS GetSiSetupStatus;
EFI_STATUS GetSaSetupStatus;
EFI_STATUS GetMeSetupStatus;
EFI_STATUS GetCpuSetupStatus;
EFI_STATUS GetPchSetupStatus;
EFI_STATUS GetMeSetupStorageStatus;
if (Action != EFI_BROWSER_ACTION_CHANGED) {
return HotKeyCallBackByAction (This, Action, QuestionId, Type, Value, ActionRequest);
}
BufferSize = 0;
VariableSize = 0;
BootOrderList = NULL;
SUCInfo = gSUBrowser->SUCInfo;
MyIfrNVData = (CHIPSET_CONFIGURATION *) gSUBrowser->SCBuffer;
CmosPlatformSetting = 0;
HiiHandle = mDriverHiiHandle;
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
FullResetValue = NULL;
MeUnconfigOnRtc = 0;
MySetupDataIfrNVData = (SETUP_DATA *)gRcSUBrowser->SetupDataSUBrowserData;
MySaIfrNVData = (SA_SETUP *)gRcSUBrowser->SaSUBrowserData;
MyMeIfrNVData = (ME_SETUP *)gRcSUBrowser->MeSUBrowserData;
MyCpuIfrNVData = (CPU_SETUP *)gRcSUBrowser->CpuSUBrowserData;
MyPchIfrNVData = (PCH_SETUP *)gRcSUBrowser->PchSUBrowserData;
MySiIfrNVData = (SI_SETUP *)gRcSUBrowser->SiSUBrowserData;
MyMeStorageIfrNVData = (ME_SETUP_STORAGE *)gRcSUBrowser->MeStorageSUBrowserData;
NVData = GetVariableAndSize (
L"Setup",
&SetupVariableGuidId,
&VariableSize
);
ASSERT (NVData != NULL);
if (NVData == NULL) {
return EFI_NOT_FOUND;
}
{
//===========================//
// Get SETUP DATA from NV //
//===========================//
SetupDataNvDataInRom = GetVariableAndSize (
PLATFORM_SETUP_VARIABLE_NAME,
&gSetupVariableGuid,
&VariableSize
);
ASSERT (SetupDataNvDataInRom != NULL);
if (SetupDataNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===========================//
// Get SA setup data from NV //
//===========================//
SaNvDataInRom = GetVariableAndSize (
SA_SETUP_VARIABLE_NAME,
&gSaSetupVariableGuid,
&VariableSize
);
ASSERT (SaNvDataInRom != NULL);
if (SaNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===========================//
// Get ME setup data from NV //
//===========================//
MeNvDataInRom = GetVariableAndSize (
ME_SETUP_VARIABLE_NAME,
&gMeSetupVariableGuid,
&VariableSize
);
ASSERT (MeNvDataInRom != NULL);
if (MeNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===========================//
// Get CPU setup data from NV //
//===========================//
CpuNvDataInRom = GetVariableAndSize (
CPU_SETUP_VARIABLE_NAME,
&gCpuSetupVariableGuid,
&VariableSize
);
ASSERT (CpuNvDataInRom != NULL);
if (CpuNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===========================//
// Get PCH setup data from NV //
//===========================//
PchNvDataInRom = GetVariableAndSize (
PCH_SETUP_VARIABLE_NAME,
&gPchSetupVariableGuid,
&VariableSize
);
ASSERT (PchNvDataInRom != NULL);
if (PchNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===========================//
// Get SI setup data from NV //
//===========================//
SiNvDataInRom = GetVariableAndSize (
SI_SETUP_VARIABLE_NAME,
&gSiSetupVariableGuid,
&VariableSize
);
ASSERT (SiNvDataInRom != NULL);
if (SiNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
//===================================//
// Get ME setup storage data from NV //
//===================================//
MeStorageNvDataInRom = GetVariableAndSize (
ME_SETUP_STORAGE_VARIABLE_NAME,
&gMeSetupVariableGuid,
&VariableSize
);
ASSERT (MeStorageNvDataInRom != NULL);
if (MeStorageNvDataInRom == NULL) {
return EFI_NOT_FOUND;
}
}
if ((SetupDataNvDataInRom != NULL) && (NVData != NULL) && (SaNvDataInRom != NULL) && (MeNvDataInRom != NULL) &&
(CpuNvDataInRom != NULL) && (PchNvDataInRom != NULL) && (MeStorageNvDataInRom != NULL) && (SiNvDataInRom != NULL)) {
if ((MyIfrNVData->BootType != NVData->BootType ) ||
(MyIfrNVData->TpmDevice != NVData->TpmDevice ) ||
(MySetupDataIfrNVData->EnablePcieTunnelingOverUsb4 != SetupDataNvDataInRom->EnablePcieTunnelingOverUsb4 ) ||
(MySetupDataIfrNVData->EnableCrashLog != SetupDataNvDataInRom->EnableCrashLog ) ||
(MySetupDataIfrNVData->CrashLogOnAllReset != SetupDataNvDataInRom->CrashLogOnAllReset)) {
if (!mFullResetFlag) {
mFullResetFlag = 1;
Status = gRT->GetVariable (
L"FullReset",
&gEfiGenericVariableGuid,
NULL,
&FullResetSize,
NULL
);
if (Status == EFI_BUFFER_TOO_SMALL) {
FullResetValue = AllocateZeroPool (FullResetSize);
ASSERT (FullResetValue != NULL);
if (FullResetValue == NULL) {
return EFI_OUT_OF_RESOURCES;
} else {
Status = gRT->GetVariable (
L"FullReset",
&gEfiGenericVariableGuid,
NULL,
&FullResetSize,
FullResetValue
);
if (!EFI_ERROR(Status)) {
*FullResetValue += mFullResetFlag;
Status = gRT->SetVariable (
L"FullReset",
&gEfiGenericVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (UINT8),
FullResetValue
);
if (EFI_ERROR (Status)) {
return Status;
}
}
}
}
}
} else {
mFullResetFlag = 0;
}
gBS->FreePool (NVData);
gBS->FreePool (SetupDataNvDataInRom);
gBS->FreePool (SaNvDataInRom);
gBS->FreePool (MeNvDataInRom);
gBS->FreePool (CpuNvDataInRom);
gBS->FreePool (PchNvDataInRom);
gBS->FreePool (MeStorageNvDataInRom);
gBS->FreePool (SiNvDataInRom);
}
switch (QuestionId) {
//==============//
// KEY_SCAN_ESC //
//==============//
case KEY_SCAN_ESC :
//
// Discard setup and exit
//
StringPtr = HiiGetString (
HiiHandle,
STRING_TOKEN (STR_EXIT_DISCARDING_CHANGES_STRING),
NULL
);
gSUBrowser->H2ODialog->ConfirmDialog (
0,
FALSE,
0,
NULL,
&Key,
StringPtr
);
if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
if ( mFullResetFlag == 2 ) {
Status = FullReset (TRUE);
ASSERT_EFI_ERROR (Status);
}
CheckLanguage ();
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
}
gBS->FreePool (StringPtr);
break;
//=============//
// KEY_SCAN_F9 //
//=============//
case KEY_SCAN_F9 :
//
// Load Optimal
//
// If user Accesslevel = USER_PASSWORD_VIEW_ONLY(0x02) or USER_PASSWORD_LIMITED(0x03)
// and use user password into SCU,the user don't use load optimal function.
if ((MyIfrNVData->SetUserPass == TRUE) &&
((MyIfrNVData->UserAccessLevel == 2) ||
(MyIfrNVData->UserAccessLevel == 3))) {
return EFI_ABORTED;
}
EventTimerControl(0);
//
// Load optimal setup.
//
Key.UnicodeChar = CHAR_CARRIAGE_RETURN;
if (mPopLoadDefaultDialog) {
StringPtr = HiiGetString (
HiiHandle,
STRING_TOKEN (STR_LOAD_OPTIMAL_DEFAULTS_STRING),
NULL
);
gSUBrowser->H2ODialog->ConfirmDialog (
0,
FALSE,
0,
NULL,
&Key,
StringPtr
);
gBS->FreePool (StringPtr);
if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) {
EventTimerControl(TIMEOUT_OF_EVENT);
return EFI_UNSUPPORTED;
}
return ExecuteFormBrowserAction (BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD);
}
if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
mScuRecord |= SCU_ACTION_LOAD_DEFAULT;
Status = gRT->SetVariable (
L"PlatformLang",
&gEfiGlobalVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang)),
(VOID *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang)
);
if (!EFI_ERROR (Status)) {
GetLangIndex ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang), &MyIfrNVData->Language);
}
BrowserRefreshFormSet ();
//
//Remove this condition, because no loneger use Changelanguage Flag to determine chagelanguage
//
UpdatePasswordState (gSUBrowser->SUCInfo->MapTable[SecurityHiiHandle].HiiHandle);
BootOrderList = GetVariableAndSize (
L"BootOrder",
&gEfiGlobalVariableGuid,
&BufferSize
);
if (BufferSize != 0) {
gBS->FreePool (SUCInfo->BootOrder);
SUCInfo->BootOrder = BootOrderList;
SUCInfo->AdvBootDeviceNum = (UINT16) (BufferSize / sizeof(UINT16));
}
MyIfrNVData->BootMenuType = NORMAL_MENU;
MyIfrNVData->BootNormalPriority = EFI_FIRST;
MyIfrNVData->LegacyNormalMenuType = NORMAL_MENU;
//
// reset the flag of showing from.
//
DefaultSetup (MyIfrNVData);
DefaultSetupData (&MySetupDataIfrNVData, EfiACPIMemoryNVS);
DefaultSaSetup (&MySaIfrNVData, EfiACPIMemoryNVS);
DefaultMeSetup (&MyMeIfrNVData, EfiACPIMemoryNVS);
DefaultCpuSetup (&MyCpuIfrNVData, EfiACPIMemoryNVS);
DefaultPchSetup (&MyPchIfrNVData, EfiACPIMemoryNVS);
DefaultSiSetup (&MySiIfrNVData, EfiACPIMemoryNVS);
//[-start-201127-IB17510127-add]//
DefaultMeSetupStorage (&MyMeStorageIfrNVData, EfiACPIMemoryNVS);
//[-end-201127-IB17510127-add]//
DefaultIccSetup ();
//SetupRuntimeDetermination (MyIfrNVData, MySaIfrNVData, MyMeIfrNVData, MyCpuIfrNVData, MyPchIfrNVData, MyMeStorageIfrNVData);
GetSetupStatus = GetSetupDataStatus = GetSiSetupStatus =GetSaSetupStatus = GetMeSetupStatus = GetCpuSetupStatus = GetPchSetupStatus = GetMeSetupStorageStatus = EFI_MEDIA_CHANGED;
SetupRuntimeDetermination (
MyIfrNVData, GetSetupStatus,
MySaIfrNVData, GetSaSetupStatus,
MyMeIfrNVData, GetMeSetupStatus,
MyCpuIfrNVData, GetCpuSetupStatus,
MyPchIfrNVData, GetPchSetupStatus,
MyMeStorageIfrNVData, GetMeSetupStorageStatus,
MySetupDataIfrNVData, GetSetupDataStatus,
MySiIfrNVData, GetSiSetupStatus
);
UpdateHDCConfigure (
gSUBrowser->SUCInfo->MapTable[AdvanceHiiHandle].HiiHandle,
MyIfrNVData
);
UpdateStringToken ((KERNEL_CONFIGURATION *) MyIfrNVData);
SetupUtilityLibLoadDefault ();
SaNvDataInRom = GetVariableAndSize (
SA_SETUP_VARIABLE_NAME,
&gSaSetupVariableGuid,
&VariableSize
);
ASSERT (SaNvDataInRom != NULL);
if (SaNvDataInRom == NULL) {
return EFI_OUT_OF_RESOURCES;
}
if ((MySaIfrNVData->IgdDvmt50PreAlloc != SaNvDataInRom->IgdDvmt50PreAlloc ) ||
(MySaIfrNVData->ApertureSize != SaNvDataInRom->ApertureSize)) {
CmosPlatformSetting = ReadExtCmos8 ( R_XCMOS_INDEX, R_XCMOS_DATA, PlatformSettingFlag );
CmosPlatformSetting = CmosPlatformSetting | B_SETTING_MEM_REFRESH_FLAG;
WriteExtCmos8 ( R_XCMOS_INDEX, R_XCMOS_DATA, PlatformSettingFlag, CmosPlatformSetting );
}
FreePool (SaNvDataInRom);
//[-start-190701-16990083-add]//
JumpToFirstQuestion ();
//[-end-190701-16990083-add]//
}
EventTimerControl(TIMEOUT_OF_EVENT);
break;
//==============//
// KEY_SCAN_F10 //
//==============//
case KEY_SCAN_F10 :
//
// If user Accesslevel = USER_PASSWORD_VIEW_ONLY(0x02) or USER_PASSWORD_LIMITED(0x03)
// and use user password into SCU,the user don't use load optimal function.
//
if ((MyIfrNVData->SetUserPass == TRUE) &&
(MyIfrNVData->UserAccessLevel == 2)) {
return EFI_ABORTED;
}
EventTimerControl (0);
SendSubmitExitNotify ();
break;
//====================//
// KEY_BOOT_MODE_TYPE //
//====================//
case KEY_BOOT_MODE_TYPE:
//
// For IGD display selection:
// if user switch mode, suppress the display selection in this boot.
// due to the display selection is decided by LegacyBiosProtocol.
//
MySaIfrNVData->IgdBootType = SCU_IGD_BOOT_TYPE_VBIOS_DEFAULT;
MyIfrNVData->IGDBootTypeSecondary = SCU_IGD_BOOT_TYPE_DISABLE;
ClearFormDataFromLabel (HiiHandle, IGFX_FORM_ID, IGD_DISPLAY_SELECTION_START_LABEL);
//
// For Plug-in display selection:
//
ClearFormDataFromLabel (HiiHandle, IGFX_FORM_ID, PLUG_IN_DISPLAY_SELECTION_START_LABEL);
//
// For dual vga controller supported:
// It only supported the Uefi mode.
//
if (Value->u8 != EFI_BOOT_TYPE && MyIfrNVData->UefiDualVgaControllers == DUAL_VGA_CONTROLLER_ENABLE) {
MyIfrNVData->UefiDualVgaControllers = DUAL_VGA_CONTROLLER_DISABLE;
MySaIfrNVData->PrimaryDisplay = DISPLAY_MODE_AUTO;
ClearFormDataFromLabel (HiiHandle, IGFX_FORM_ID, DUAL_VGA_SUPPORT_START_LABEL);
}
if (Value->u8 != EFI_BOOT_TYPE) {
MySaIfrNVData->EnableAbove4GBMmio = 0;
}
switch (Value->u8) {
case EFI_BOOT_TYPE:
break;
case LEGACY_BOOT_TYPE:
MySetupDataIfrNVData->LowPowerS0Idle = 0;
break;
case DUAL_BOOT_TYPE:
MySetupDataIfrNVData->LowPowerS0Idle = 0;
break;
}
break;
//=======================//
// KEY_SAVE_WITHOUT_EXIT //
//=======================//
case KEY_SAVE_WITHOUT_EXIT:
StringPtr = HiiGetString (
HiiHandle,
STRING_TOKEN (STR_SAVE_CHANGE_WITHOUT_EXIT_STRING),
NULL
);
gSUBrowser->H2ODialog->ConfirmDialog (
0,
FALSE,
0,
NULL,
&Key,
StringPtr
);
gBS->FreePool (StringPtr);
if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
if (mFullResetFlag == 1) {
mFullResetFlag = 2;
}
ExecuteFormBrowserAction (BROWSER_ACTION_SUBMIT, 0);
}
break;
//====================//
// KEY_DISCARD_CHANGE //
//====================//
case KEY_DISCARD_CHANGE:
//
// discard setup change.
//
StringPtr = HiiGetString (
HiiHandle,
STRING_TOKEN (STR_DISCARD_CHANGES_STRING),
NULL
);
gSUBrowser->H2ODialog->ConfirmDialog (
0,
FALSE,
0,
NULL,
&Key,
StringPtr
);
if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
mScuRecord &= (~SCU_ACTION_LOAD_DEFAULT);
BrowserRefreshFormSet ();
ExecuteFormBrowserAction (BROWSER_ACTION_DISCARD, 0);
if (mFullResetFlag == 1) {
mFullResetFlag = 0;
}
Status = DiscardChange (This);
Status = DiscardSetupDataChange ();
Status = DiscardSaChange ();
Status = DiscardMeChange ();
Status = DiscardCpuChange ();
Status = DiscardPchChange ();
Status = DiscardSiChange ();
Status = DiscardIccChange ();
Status = DiscardMeStorageChange ();
UpdateHDCConfigure (
gSUBrowser->SUCInfo->MapTable[AdvanceHiiHandle].HiiHandle,
MyIfrNVData
);
SUCInfo->DoRefresh = TRUE;
//[-start-190701-16990083-add]//
JumpToFirstQuestion ();
//[-end-190701-16990083-add]//
}
gBS->FreePool (StringPtr);
break;
//=================//
// KEY_LOAD_CUSTOM //
//=================//
case KEY_LOAD_CUSTOM:
LoadCustomRcOption ();
//[-start-190701-16990083-add]//
JumpToFirstQuestion ();
//[-end-190701-16990083-add]//
break;
//=================//
// KEY_SAVE_CUSTOM //
//=================//
case KEY_SAVE_CUSTOM:
SaveCustomRcOption ();
break;
//=========//
// default //
//=========//
default :
break;
}
return EFI_SUCCESS;
}
/**
This function allows a caller to extract the current configuration for one
or more named elements from the target driver.
@param [in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
@param [in] Request A null-terminated Unicode string in <ConfigRequest> format.
@param [out] 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 [out] 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.
**/
EFI_STATUS
EFIAPI
GenericExtractConfigHook (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Request,
OUT EFI_STRING *Progress,
OUT EFI_STRING *Results
)
{
EFI_STATUS Status;
UINTN BufferSize;
EFI_STRING ConfigRequest;
BOOLEAN AllocatedRequest;
UINTN Size;
CHAR16 *StrPointer;
UINT8 *RcSetupData;
ICC_SETUP_DATA IccSetup;
CPU_SETUP_VOLATILE_DATA CpuSetupVolData;
SETUP_CPU_FEATURES SetupCpuFeaturesData;
TBT_SETUP_VOLATILE_DATA TbtSetupVolatileData;
if (This == NULL || Progress == NULL || Results == NULL) {
return EFI_INVALID_PARAMETER;
}
//[-start-190611-IB16990047-add]//
RcSetupData = NULL;
//[-end-190611-IB16990047-add]//
if (HiiIsConfigHdrMatch (Request, &gSetupVariableGuid, PLATFORM_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (SETUP_DATA);
RcSetupData = gRcSUBrowser->SetupDataSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gSaSetupVariableGuid, SA_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (SA_SETUP);
RcSetupData = gRcSUBrowser->SaSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gMeSetupVariableGuid, ME_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (ME_SETUP);
RcSetupData = gRcSUBrowser->MeSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gCpuSetupVariableGuid, CPU_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (CPU_SETUP);
RcSetupData = gRcSUBrowser->CpuSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gPchSetupVariableGuid, PCH_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (PCH_SETUP);
//[-start-210902-05660177-modify]//
RcSetupData = gRcSUBrowser->PchSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gSiSetupVariableGuid, SI_SETUP_VARIABLE_NAME)) {
BufferSize = sizeof (SI_SETUP);
RcSetupData = gRcSUBrowser->SiSUBrowserData;
//[-end-210902-05660177-modify]//
} else if (HiiIsConfigHdrMatch (Request, &gSetupVariableGuid, SETUP_VOLATILE_DATA_VARIABLE_NAME)) {
BufferSize = sizeof (mSetupVolatileData);
RcSetupData = (UINT8 *) &mSetupVolatileData;
} else if (HiiIsConfigHdrMatch (Request, &gIccGuid, ICC_SETUP_DATA_C_NAME)) {
BufferSize = sizeof (ICC_SETUP_DATA);
Status = gRT->GetVariable (ICC_SETUP_DATA_C_NAME, &gIccGuid, NULL, &BufferSize, &IccSetup);
ASSERT_EFI_ERROR (Status);
RcSetupData = (UINT8 *) &IccSetup;
} else if (HiiIsConfigHdrMatch (Request, &gCpuSetupVariableGuid, CPU_SETUP_VOLATILE_DATA_VARIABLE_NAME)) {
BufferSize = sizeof (CPU_SETUP_VOLATILE_DATA);
Status = gRT->GetVariable (CPU_SETUP_VOLATILE_DATA_VARIABLE_NAME, &gCpuSetupVariableGuid, NULL, &BufferSize, &CpuSetupVolData);
ASSERT_EFI_ERROR (Status);
RcSetupData = (UINT8 *) &CpuSetupVolData;
} else if (HiiIsConfigHdrMatch (Request, &gSetupVariableGuid,SETUP_CPU_FEATURES_NAME)) {
BufferSize = sizeof (SETUP_CPU_FEATURES);
Status = gRT->GetVariable (SETUP_CPU_FEATURES_NAME, &gSetupVariableGuid, NULL, &BufferSize, &SetupCpuFeaturesData);
ASSERT_EFI_ERROR(Status);
RcSetupData = (UINT8 *) &SetupCpuFeaturesData;
} else if (HiiIsConfigHdrMatch (Request, &gMeSetupVariableGuid, ME_SETUP_STORAGE_VARIABLE_NAME)) {
BufferSize = sizeof (ME_SETUP_STORAGE);
RcSetupData = gRcSUBrowser->MeStorageSUBrowserData;
} else if (HiiIsConfigHdrMatch (Request, &gSetupVariableGuid,TBT_SETUP_VOLATILLE_VARIABLE_NAME)) {
BufferSize = sizeof (TBT_SETUP_VOLATILE_DATA);
Status = gRT->GetVariable (TBT_SETUP_VOLATILLE_VARIABLE_NAME, &gSetupVariableGuid, NULL, &BufferSize, &TbtSetupVolatileData);
ASSERT_EFI_ERROR(Status);
RcSetupData = (UINT8 *) &TbtSetupVolatileData;
} else {
Status = GenericExtractConfig (This, Request, Progress, Results);
return Status;
}
*Progress = Request;
ConfigRequest = NULL;
AllocatedRequest = FALSE;
Size = 0;
//
// Set Request to the unified request string.
//
ConfigRequest = Request;
//
// Check whether Request includes Request Element.
//
if (StrStr (Request, L"OFFSET") == NULL) {
//
// Check Request Element does exist in Reques String
//
StrPointer = StrStr (Request, L"PATH");
if (StrPointer == NULL) {
return EFI_INVALID_PARAMETER;
}
if (StrStr (StrPointer, L"&") == NULL) {
Size = (StrLen (Request) + 32 + 1) * sizeof (CHAR16);
ConfigRequest = AllocateZeroPool (Size);
ASSERT (ConfigRequest != NULL);
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", Request, (UINT64) BufferSize);
}
}
if (StrStr (ConfigRequest, L"OFFSET") == NULL) {
//
// If requesting Name/Value storage, return not found.
//
return EFI_NOT_FOUND;
}
//
// Convert buffer data to <ConfigResp> by helper function BlockToConfig()
//
Status = gSUBrowser->HiiConfigRouting->BlockToConfig (
gSUBrowser->HiiConfigRouting,
ConfigRequest,
RcSetupData,
BufferSize,
Results,
Progress
);
//
// Free the allocated config request string.
//
if (AllocatedRequest) {
gBS->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 allows a caller to extract the current configuration for one
or more named elements from the target driver.
@param [in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
@param [in] Request A null-terminated Unicode string in <ConfigRequest> format.
@param [out] 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 [out] 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.
**/
EFI_STATUS
EFIAPI
GenericExtractConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Request,
OUT EFI_STRING *Progress,
OUT EFI_STRING *Results
)
{
EFI_STATUS Status;
UINTN BufferSize;
EFI_STRING ConfigRequestHdr;
EFI_STRING ConfigRequest;
BOOLEAN AllocatedRequest;
UINTN Size;
CHAR16 *StrPointer;
EFI_CALLBACK_INFO *CallbackInfo;
EFI_HANDLE DriverHandle;
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
if (This == NULL || Progress == NULL || Results == NULL) {
return EFI_INVALID_PARAMETER;
}
*Progress = Request;
CallbackInfo = EFI_CALLBACK_INFO_FROM_THIS (This);
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
ConfigRequestHdr = NULL;
ConfigRequest = NULL;
AllocatedRequest = FALSE;
Size = 0;
if (Request == NULL) {
//
// Request is set to NULL, 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
//
Status = gSUBrowser->HiiDatabase->GetPackageListHandle (gSUBrowser->HiiDatabase, CallbackInfo->HiiHandle, &DriverHandle);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, mVariableName, DriverHandle);
if (ConfigRequestHdr == NULL) {
return EFI_NOT_FOUND;
}
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
ConfigRequest = AllocateZeroPool (Size);
ASSERT (ConfigRequest != NULL);
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64) BufferSize);
FreePool (ConfigRequestHdr);
ConfigRequestHdr = NULL;
} else {
//
// Check routing data in <ConfigHdr>.
// Note: if only one Storage is used, then this checking could be skipped.
//
if (!HiiIsConfigHdrMatch (Request, &mFormSetGuid, mVariableName)) {
return EFI_NOT_FOUND;
}
//
// Set Request to the unified request string.
//
ConfigRequest = Request;
//
// Check whether Request includes Request Element.
//
if (StrStr (Request, L"OFFSET") == NULL) {
//
// Check Request Element does exist in Reques String
//
StrPointer = StrStr (Request, L"PATH");
if (StrPointer == NULL) {
return EFI_INVALID_PARAMETER;
}
if (StrStr (StrPointer, L"&") == NULL) {
Size = (StrLen (Request) + 32 + 1) * sizeof (CHAR16);
ConfigRequest = AllocateZeroPool (Size);
ASSERT (ConfigRequest != NULL);
AllocatedRequest = TRUE;
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", Request, (UINT64) BufferSize);
}
}
}
if (StrStr (ConfigRequest, L"OFFSET") == NULL) {
//
// If requesting Name/Value storage, return not found.
//
return EFI_NOT_FOUND;
}
//
// Convert buffer data to <ConfigResp> by helper function BlockToConfig()
//
Status = gSUBrowser->HiiConfigRouting->BlockToConfig (
gSUBrowser->HiiConfigRouting,
ConfigRequest,
(UINT8 *) gSUBrowser->SCBuffer,
BufferSize,
Results,
Progress
);
//
// Free the allocated config request string.
//
if (AllocatedRequest) {
gBS->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 [in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
@param [in] Configuration A null-terminated Unicode string in <ConfigResp> format.
@param [out] 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
GenericRouteConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress
)
{
EFI_STATUS Status;
VOID *SetupNvData;
UINTN BufferSize;
UINTN SetupDataBufferSize;
UINTN SaBufferSize;
UINTN MeBufferSize;
UINTN CpuBufferSize;
UINTN PchBufferSize;
UINTN SiBufferSize;
UINTN MeStorageBufferSize;
CPU_SETUP *CpuSetup;
// SGX_SETUP_DATA *SgxSetupData;
// UINTN SgxSetupDataSize;
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
UINT8 *Lang;
// UINTN VariableSize;
// UINT32 CpuSetupSgxEpochVarAttr;
// CPU_SETUP_SGX_EPOCH_DATA SgxEpochSetupData;
if (Configuration != NULL && !HiiIsConfigHdrMatch (Configuration, &mFormSetGuid, mVariableName)) {
return EFI_SUCCESS;
}
BufferSize = PcdGet32 (PcdSetupConfigSize);
SetupVariableConfig (
&VarStoreGuid,
L"SystemConfig",
BufferSize,
(UINT8 *) gSUBrowser->SCBuffer,
TRUE
);
{
SetupDataBufferSize = sizeof (SETUP_DATA);
SetupVariableConfig (
&gSetupVariableGuid,
PLATFORM_SETUP_VARIABLE_NAME,
SetupDataBufferSize,
(UINT8 *) gRcSUBrowser->SetupDataSUBrowserData,
TRUE
);
SaBufferSize = sizeof (SA_SETUP);
SetupVariableConfig (
&gSaSetupVariableGuid,
SA_SETUP_VARIABLE_NAME,
SaBufferSize,
(UINT8 *) gRcSUBrowser->SaSUBrowserData,
TRUE
);
MeBufferSize = sizeof (ME_SETUP);
SetupVariableConfig (
&gMeSetupVariableGuid,
ME_SETUP_VARIABLE_NAME,
MeBufferSize,
(UINT8 *) gRcSUBrowser->MeSUBrowserData,
TRUE
);
CpuBufferSize = sizeof (CPU_SETUP);
SetupVariableConfig (
&gCpuSetupVariableGuid,
CPU_SETUP_VARIABLE_NAME,
CpuBufferSize,
(UINT8 *) gRcSUBrowser->CpuSUBrowserData,
TRUE
);
PchBufferSize = sizeof (PCH_SETUP);
SetupVariableConfig (
&gPchSetupVariableGuid,
PCH_SETUP_VARIABLE_NAME,
PchBufferSize,
(UINT8 *) gRcSUBrowser->PchSUBrowserData,
TRUE
);
SiBufferSize = sizeof (SI_SETUP);
SetupVariableConfig (
&gSiSetupVariableGuid,
SI_SETUP_VARIABLE_NAME,
SiBufferSize,
(UINT8 *) gRcSUBrowser->SiSUBrowserData,
TRUE
);
MeStorageBufferSize = sizeof (ME_SETUP_STORAGE);
SetupVariableConfig (
&gMeSetupVariableGuid,
ME_SETUP_STORAGE_VARIABLE_NAME,
MeStorageBufferSize,
(UINT8 *) gRcSUBrowser->MeStorageSUBrowserData,
TRUE
);
}
//
// Oem hook when F10 or Exit Saving Changes or Save Change Without Exit submit.
// And system will set current setuputility setting to browser.
//
DEBUG_OEM_SVC ((DEBUG_INFO, "Dxe OemChipsetServices Call: OemSvcHookRouteConfig \n"));
Status = OemSvcHookRouteConfig (
(VOID *)gSUBrowser->SCBuffer,
(UINT32)BufferSize,
(VOID *)gRcSUBrowser,
mScuRecord
);
DEBUG_OEM_SVC ((DEBUG_INFO, "Dxe OemChipsetServices OemSvcHookRouteConfig Status: %r\n", Status));
SetupVariableConfig (
&VarStoreGuid,
L"SystemConfig",
BufferSize,
(UINT8 *) gSUBrowser->SCBuffer,
FALSE
);
{
//========================================================//
// Save SETUP DATA variable and update SETUP_DATA to form //
//========================================================//
SetupVariableConfig (
&gSetupVariableGuid,
PLATFORM_SETUP_VARIABLE_NAME,
SetupDataBufferSize,
(UINT8 *) gRcSUBrowser->SetupDataSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
PLATFORM_SETUP_VARIABLE_NAME,
&gSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
SetupDataBufferSize,
(VOID *)gRcSUBrowser->SetupDataSUBrowserData
);
//===================================================//
// Save SA setup variable and update SA data to form //
//===================================================//
SetupVariableConfig (
&gSaSetupVariableGuid,
SA_SETUP_VARIABLE_NAME,
SaBufferSize,
(UINT8 *) gRcSUBrowser->SaSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
SA_SETUP_VARIABLE_NAME,
&gSaSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
SaBufferSize,
(VOID *)gRcSUBrowser->SaSUBrowserData
);
//===================================================//
// Save ME setup variable and update ME data to form //
//===================================================//
SetupVariableConfig (
&gMeSetupVariableGuid,
ME_SETUP_VARIABLE_NAME,
MeBufferSize,
(UINT8 *) gRcSUBrowser->MeSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
ME_SETUP_VARIABLE_NAME,
&gMeSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
MeBufferSize,
(VOID *)gRcSUBrowser->MeSUBrowserData
);
//=====================================================//
// Save CPU setup variable and update CPU data to form //
//=====================================================//
SetupVariableConfig (
&gCpuSetupVariableGuid,
CPU_SETUP_VARIABLE_NAME,
CpuBufferSize,
(UINT8 *) gRcSUBrowser->CpuSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
CPU_SETUP_VARIABLE_NAME,
&gCpuSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
CpuBufferSize,
(VOID *)gRcSUBrowser->CpuSUBrowserData
);
//=====================================================//
// Save PCH setup variable and update PCH data to form //
//=====================================================//
SetupVariableConfig (
&gPchSetupVariableGuid,
PCH_SETUP_VARIABLE_NAME,
PchBufferSize,
(UINT8 *) gRcSUBrowser->PchSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
PCH_SETUP_VARIABLE_NAME,
&gPchSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
PchBufferSize,
(VOID *)gRcSUBrowser->PchSUBrowserData
);
//=====================================================//
// Save SI setup variable and update SI data to form //
//=====================================================//
SetupVariableConfig (
&gSiSetupVariableGuid,
SI_SETUP_VARIABLE_NAME,
SiBufferSize,
(UINT8 *) gRcSUBrowser->SiSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
SI_SETUP_VARIABLE_NAME,
&gSiSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
SiBufferSize,
(VOID *)gRcSUBrowser->SiSUBrowserData
);
//===========================================================//
// Save ME setup storage variable and update ME data to form //
//===========================================================//
SetupVariableConfig (
&gMeSetupVariableGuid,
ME_SETUP_STORAGE_VARIABLE_NAME,
MeStorageBufferSize,
(UINT8 *) gRcSUBrowser->MeStorageSUBrowserData,
FALSE
);
Status = SaveSetupConfig (
ME_SETUP_STORAGE_VARIABLE_NAME,
&gMeSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
MeStorageBufferSize,
(VOID *)gRcSUBrowser->MeStorageSUBrowserData
);
//=======================================================================//
// Run RC relatvie route config. functions after variable saving is done //
//=======================================================================//
IccRouteConfig();
MeRouteConfig ();
if (mMeReset == TRUE) {
mFullResetFlag++;
}
}
BufferSize = PcdGet32 (PcdSetupConfigSize);
if (BufferSize == 0) {
Status = RETURN_BAD_BUFFER_SIZE;
ASSERT_EFI_ERROR (Status);
return Status;
}
SetupNvData = AllocateZeroPool (BufferSize);
if (SetupNvData == NULL) {
Status = EFI_OUT_OF_RESOURCES;
ASSERT_EFI_ERROR (Status);
return Status;
}
CopyMem (SetupNvData, gSUBrowser->SCBuffer, BufferSize);
Lang = GetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &BufferSize);
Status = gRT->SetVariable (
L"BackupPlatformLang",
&gEfiGenericVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
(Lang == NULL) ? 0 : BufferSize,
Lang
);
if (Lang != NULL) {
FreePool (Lang);
}
//[-start-190701-16990083-add]//
SetupUtilityLibRouteConfig ();
//[-end-190701-16990083-add]//
SetSecurityStatus ();
BufferSize = PcdGet32 (PcdSetupConfigSize);
Status = SaveSetupConfig (
L"Setup",
&mFormSetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
BufferSize,
SetupNvData
);
PlugInVgaDisplaySelectionSave ();
if ((FeaturePcdGet (PcdHybridGraphicsSupported)) &&
(FeaturePcdGet (PcdNvidiaOptimusSupported)) &&
(FeaturePcdGet (PcdHgNvidiaDdsFeatureSupport))) {
//
// Sync "DisplayMode" setting to "PrimaryDisplay".
//
switch (((CHIPSET_CONFIGURATION *)SetupNvData)->DisplayMode) {
case IgfxOnly:
((SA_SETUP *)gRcSUBrowser->SaSUBrowserData)->PrimaryDisplay = DisplayModeIgpu;
break;
case DgpuOnly:
if (IsPchH ()) {
((SA_SETUP *)gRcSUBrowser->SaSUBrowserData)->PrimaryDisplay = DisplayModeDgpu;
} else {
((SA_SETUP *)gRcSUBrowser->SaSUBrowserData)->PrimaryDisplay = DisplayModePci;
}
break;
case MsHybrid:
((SA_SETUP *)gRcSUBrowser->SaSUBrowserData)->PrimaryDisplay = DisplayModeHg;
break;
case Dynamic:
((SA_SETUP *)gRcSUBrowser->SaSUBrowserData)->PrimaryDisplay = DisplayModeHg;
break;
default:
break;
}
Status = SaveSetupConfig (
SA_SETUP_VARIABLE_NAME,
&gSaSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
SaBufferSize,
(VOID *)gRcSUBrowser->SaSUBrowserData
);
if (EFI_ERROR(Status)) {
DEBUG ((EFI_D_ERROR | EFI_D_INFO, "Sync DisplayMode with PrimaryDisplay fail. Status = %x\n", Status));
}
}
WriteExtCmos8 (
R_XCMOS_INDEX,
R_XCMOS_DATA,
S5LongRunTestFlag,
((CHIPSET_CONFIGURATION *)SetupNvData)->S5LongRunTest
);
CpuSetup = (CPU_SETUP *)(VOID *)gRcSUBrowser->CpuSUBrowserData;
// SgxSetupDataSize = sizeof (SGX_SETUP_DATA);
// SgxSetupData = AllocateZeroPool (SgxSetupDataSize);
// if (SgxSetupData == NULL) {
// Status = EFI_OUT_OF_RESOURCES;
// ASSERT_EFI_ERROR (Status);
// return Status;
// }
// VariableSize = sizeof (CPU_SETUP_SGX_EPOCH_DATA);
// Status = gRT->GetVariable (
// L"CpuSetupSgxEpochData",
// &gCpuSetupVariableGuid,
// &CpuSetupSgxEpochVarAttr,
// &VariableSize,
// &SgxEpochSetupData
// );
// SgxSetupData->EnableC6Dram = CpuSetup->EnableC6Dram;
// SgxSetupData->EnableSgx = CpuSetup->EnableSgx;
// SgxSetupData->EpochUpdate = CpuSetup->EpochUpdate;
// SgxSetupData->ShowEpoch = CpuSetup->ShowEpoch;
// SgxSetupData->MaxPrmrrSize = CpuSetup->MaxPrmrrSize;
// SgxSetupData->PrmrrSize = CpuSetup->PrmrrSize;
// SgxSetupData->SgxEpoch0 = SgxEpochSetupData.SgxEpoch0;
// SgxSetupData->SgxEpoch1 = SgxEpochSetupData.SgxEpoch1;
// Status = SaveSetupConfig (
// SGX_SETUP_VARIABLE_NAME,
// &gSgxSetupVariableGuid,
// EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
// SgxSetupDataSize,
// (VOID *)SgxSetupData
// );
// if (EFI_ERROR(Status)) {
// DEBUG ((DEBUG_ERROR | DEBUG_INFO, "Save SGX variable fail. Status = %x\n", Status));
// }
if (mFullResetFlag != 0) {
if (FeaturePcdGet (PcdH2OBdsCpSendFormAfterSupported)) {
if (mSendFormAfterCpHandle == NULL) {
Status = H2OCpRegisterHandler (&gH2OBdsCpSendFormAfterGuid , BdsCpSendFormAfterHandler , H2O_CP_MEDIUM, &mSendFormAfterCpHandle);
if (EFI_ERROR (Status)) {
DEBUG_CP ((DEBUG_ERROR, "Checkpoint Register Fail: %g (%r)\n", &gH2OBdsCpSendFormAfterGuid, Status));
return Status;
}
DEBUG_CP ((DEBUG_INFO, "Checkpoint Registered: %g (%r)\n", &gH2OBdsCpSendFormAfterGuid, Status));
}
}
}
// FreePool (SgxSetupData);
// FreePool (SetupNvData);
return Status;
}
#if 0
/**
This function processes the memory overclocking setting when the profile is set to custom profile.
@param [in] [out] MyIfrNvData SCU chipset configuration data.
@retval None
**/
VOID
ConfigXmpDimmProfile (
IN OUT SA_SETUP *MySaIfrNVData
)
{
MEM_INFO_PROTOCOL *MemInfo;
EFI_STATUS Status;
MemInfo = NULL;
if (MySaIfrNVData->SpdProfileSelected != USER_PROFILE) {
return;
}
Status = gBS->LocateProtocol (&gMemInfoProtocolGuid, NULL, (VOID **)&MemInfo);
ASSERT_EFI_ERROR (Status);
if (MemInfo == NULL) {
return;
}
if (MySaIfrNVData->DdrRefClk == XMP_MEM_AUTO) {
MySaIfrNVData->DdrRefClk = MemInfo->MemInfoData.RefClk;
}
if (MySaIfrNVData->tCL == XMP_MEM_AUTO) {
MySaIfrNVData->tCL = (UINT8) MemInfo->MemInfoData.Timing[0].tCL;
}
if (MySaIfrNVData->tRCDtRP == XMP_MEM_AUTO) {
MySaIfrNVData->tRCDtRP = (UINT8) MemInfo->MemInfoData.Timing[0].tRCDtRP;
}
if (MySaIfrNVData->tRAS == XMP_MEM_AUTO) {
MySaIfrNVData->tRAS = (UINT8) MemInfo->MemInfoData.Timing[0].tRAS;
}
if (MySaIfrNVData->tCWL == XMP_MEM_AUTO) {
MySaIfrNVData->tCWL = (UINT8) MemInfo->MemInfoData.Timing[0].tCWL;
}
if (MySaIfrNVData->tFAW == XMP_MEM_AUTO) {
MySaIfrNVData->tFAW = (UINT8) MemInfo->MemInfoData.Timing[0].tFAW;
}
if (MySaIfrNVData->tREFI == XMP_MEM_AUTO) {
MySaIfrNVData->tREFI = MemInfo->MemInfoData.Timing[0].tREFI;
}
if (MySaIfrNVData->tRFC == XMP_MEM_AUTO) {
MySaIfrNVData->tRFC = MemInfo->MemInfoData.Timing[0].tRFC;
}
if (MySaIfrNVData->tRRD == XMP_MEM_AUTO) {
MySaIfrNVData->tRRD = (UINT8) MemInfo->MemInfoData.Timing[0].tRRD;
}
if (MySaIfrNVData->tRTP == XMP_MEM_AUTO) {
MySaIfrNVData->tRTP = (UINT8) MemInfo->MemInfoData.Timing[0].tRTP;
}
if (MySaIfrNVData->tWR == XMP_MEM_AUTO) {
MySaIfrNVData->tWR = (UINT8) MemInfo->MemInfoData.Timing[0].tWR;
}
if (MySaIfrNVData->tWTR == XMP_MEM_AUTO) {
MySaIfrNVData->tWTR = (UINT8) MemInfo->MemInfoData.Timing[0].tWTR;
}
if (MySaIfrNVData->NModeSupport == XMP_MEM_AUTO) {
MySaIfrNVData->NModeSupport = (UINT8) MemInfo->MemInfoData.Timing[0].NMode;
}
}
#endif
/**
To discard user changed Setup Data utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardSetupDataChange (
VOID
)
{
EFI_STATUS Status;
SETUP_DATA *MyOrgIfrNVData;
UINTN SetupDataBufferSize;
Status = CommonGetVariableDataAndSize (
PLATFORM_SETUP_VARIABLE_NAME,
&gSetupVariableGuid,
&SetupDataBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (SetupDataBufferSize != 0) {
CopyMem (
gRcSUBrowser->SetupDataSUBrowserData,
MyOrgIfrNVData,
SetupDataBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To discard user changed SA setup utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardSaChange (
VOID
)
{
EFI_STATUS Status;
SA_SETUP *MyOrgIfrNVData;
UINTN SaBufferSize;
Status = CommonGetVariableDataAndSize (
SA_SETUP_VARIABLE_NAME,
&gSaSetupVariableGuid,
&SaBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (SaBufferSize != 0) {
CopyMem (
gRcSUBrowser->SaSUBrowserData,
MyOrgIfrNVData,
SaBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To discard user changed ME setup utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardMeChange (
VOID
)
{
EFI_STATUS Status;
ME_SETUP *MyOrgIfrNVData;
UINTN MeBufferSize;
Status = CommonGetVariableDataAndSize (
ME_SETUP_VARIABLE_NAME,
&gMeSetupVariableGuid,
&MeBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (MeBufferSize != 0) {
CopyMem (
gRcSUBrowser->MeSUBrowserData,
MyOrgIfrNVData,
MeBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To discard user changed CPU setup utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardCpuChange (
VOID
)
{
EFI_STATUS Status;
CPU_SETUP *MyOrgIfrNVData;
UINTN CpuBufferSize;
Status = CommonGetVariableDataAndSize (
CPU_SETUP_VARIABLE_NAME,
&gCpuSetupVariableGuid,
&CpuBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (CpuBufferSize != 0) {
CopyMem (
gRcSUBrowser->CpuSUBrowserData,
MyOrgIfrNVData,
CpuBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To discard user changed PCH setup utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardPchChange (
VOID
)
{
EFI_STATUS Status;
PCH_SETUP *MyOrgIfrNVData;
UINTN PchBufferSize;
Status = CommonGetVariableDataAndSize (
PCH_SETUP_VARIABLE_NAME,
&gPchSetupVariableGuid,
&PchBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (PchBufferSize != 0) {
CopyMem (
gRcSUBrowser->PchSUBrowserData,
MyOrgIfrNVData,
PchBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To discard user changed SI setup utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardSiChange (
VOID
)
{
EFI_STATUS Status;
SI_SETUP *MyOrgIfrNVData;
UINTN SiBufferSize;
Status = CommonGetVariableDataAndSize (
SI_SETUP_VARIABLE_NAME,
&gSiSetupVariableGuid,
&SiBufferSize,
(VOID **) &MyOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (SiBufferSize != 0) {
CopyMem (
gRcSUBrowser->SiSUBrowserData,
MyOrgIfrNVData,
SiBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyOrgIfrNVData);
return EFI_SUCCESS;
}
EFI_STATUS
DiscardIccChange (
VOID
)
{
DefaultIccSetup ();
return EFI_SUCCESS;
}
/**
To discard user changed ME setup storage utility setting in this boot.
@param VOID
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data or language data.
**/
EFI_STATUS
DiscardMeStorageChange (
VOID
)
{
EFI_STATUS Status;
ME_SETUP_STORAGE *MyStorageOrgIfrNVData;
UINTN MeStorageBufferSize;
Status = CommonGetVariableDataAndSize (
ME_SETUP_STORAGE_VARIABLE_NAME,
&gMeSetupVariableGuid,
&MeStorageBufferSize,
(VOID **) &MyStorageOrgIfrNVData
);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
if (MeStorageBufferSize != 0) {
CopyMem (
gRcSUBrowser->MeStorageSUBrowserData,
MyStorageOrgIfrNVData,
MeStorageBufferSize
);
} else {
return EFI_NOT_FOUND;
}
gBS->FreePool (MyStorageOrgIfrNVData);
return EFI_SUCCESS;
}
/**
To restore RC setup utility setting to user custom setting
@param None
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot get SetupUtility browser data.
**/
EFI_STATUS
LoadCustomRcOption (
VOID
)
{
EFI_STATUS Status;
UINT8 *RcSetupData = NULL;
UINTN RcBufferSize;
//====================================//
// Restore custom SETUP DATA variable //
//====================================//
RcBufferSize = sizeof (SETUP_DATA);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->SetupDataSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//==================================//
// Restore custom SA setup variable //
//==================================//
RcBufferSize = sizeof (SA_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gSaSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->SaSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//==================================//
// Restore custom ME setup variable //
//==================================//
RcBufferSize = sizeof (ME_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gMeSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->MeSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//===================================//
// Restore custom CPU setup variable //
//===================================//
RcBufferSize = sizeof (CPU_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gCpuSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->CpuSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//===================================//
// Restore custom PCH setup variable //
//===================================//
RcBufferSize = sizeof (PCH_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gPchSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->PchSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//===================================//
// Restore custom SI setup variable //
//===================================//
RcBufferSize = sizeof (SI_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"Custom",
&gSiSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->SiSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
//==========================================//
// Restore custom ME setup storage variable //
//==========================================//
RcBufferSize = sizeof (ME_SETUP_STORAGE);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = gRT->GetVariable (
L"MeSetupStorageCustom",
&gMeSetupVariableGuid,
NULL,
&RcBufferSize,
(VOID *)RcSetupData
);
if (EFI_ERROR (Status)) {
FreePool (RcSetupData);
return Status;
}
CopyMem (gRcSUBrowser->MeStorageSUBrowserData, RcSetupData, RcBufferSize);
FreePool (RcSetupData);
return EFI_SUCCESS;
}
/**
To save current RC setup utility setting to user custom setting
@param None
@retval EFI_SUCCESS Function has completed successfully.
@return Other Cannot save RC SetupUtility browser data.
**/
EFI_STATUS
SaveCustomRcOption (
VOID
)
{
EFI_STATUS Status;
UINT8 *RcSetupData = NULL;
UINTN RcBufferSize;
//=================================//
// Save custom SETUP DATA variable //
//=================================//
RcBufferSize = sizeof (SETUP_DATA);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->SetupDataSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//===============================//
// Save custom SA setup variable //
//===============================//
RcBufferSize = sizeof (SA_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->SaSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gSaSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//===============================//
// Save custom ME setup variable //
//===============================//
RcBufferSize = sizeof (ME_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->MeSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gMeSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//================================//
// Save custom CPU setup variable //
//================================//
RcBufferSize = sizeof (CPU_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->CpuSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gCpuSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//================================//
// Save custom PCH setup variable //
//================================//
RcBufferSize = sizeof (PCH_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->PchSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gPchSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//================================//
// Save custom SI setup variable //
//================================//
RcBufferSize = sizeof (SI_SETUP);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->SiSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"Custom",
&gSiSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
//=======================================//
// Save custom ME setup storage variable //
//=======================================//
RcBufferSize = sizeof (ME_SETUP_STORAGE);
RcSetupData = AllocateZeroPool (RcBufferSize);
if (RcSetupData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (RcSetupData, gRcSUBrowser->MeStorageSUBrowserData, RcBufferSize);
Status = gRT->SetVariable (
L"MeSetupStorageCustom",
&gMeSetupVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
RcBufferSize,
(VOID *)RcSetupData
);
FreePool (RcSetupData);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}