272 lines
7.8 KiB
C
272 lines
7.8 KiB
C
/** @file
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2014 - 2019, Insyde Software Corporation. 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 <Power.h>
|
|
#include <SetupUtility.h>
|
|
#include <Library/PchCycleDecodingLib.h>
|
|
#include <Library/PmcLib.h>
|
|
#include <Register/PmcRegs.h>
|
|
|
|
EFI_CALLBACK_INFO *mPowerCallBackInfo;
|
|
|
|
|
|
/**
|
|
This is the callback function for the Boot Menu. Dynamically creates the boot order list,
|
|
depending if the network boot option is populated or not.
|
|
|
|
@param [in] This
|
|
@param [in] Action
|
|
@param [in] QuestionId
|
|
@param [in] Type
|
|
@param [in] Value
|
|
@param [out] ActionRequest
|
|
|
|
|
|
**/
|
|
EFI_STATUS
|
|
PowerCallbackRoutine (
|
|
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;
|
|
CHAR16 *StringPtr;
|
|
CHIPSET_CONFIGURATION *MyIfrNVData;
|
|
EFI_HII_HANDLE HiiHandle;
|
|
EFI_CALLBACK_INFO *CallbackInfo;
|
|
SETUP_UTILITY_CONFIGURATION *SUCInfo;
|
|
UINTN BufferSize;
|
|
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
|
|
UINT16 PmBase;
|
|
UINT16 Pm1EnData;
|
|
|
|
if (Action != EFI_BROWSER_ACTION_CHANGED) {
|
|
return PowerCallbackRoutineByAction (This, Action, QuestionId, Type, Value, ActionRequest);
|
|
}
|
|
|
|
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
|
CallbackInfo = EFI_CALLBACK_INFO_FROM_THIS (This);
|
|
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) gSUBrowser->SCBuffer,
|
|
TRUE
|
|
);
|
|
MyIfrNVData = (CHIPSET_CONFIGURATION *)gSUBrowser->SCBuffer;
|
|
|
|
Status = EFI_SUCCESS;
|
|
StringPtr = NULL;
|
|
HiiHandle = CallbackInfo->HiiHandle;
|
|
SUCInfo = gSUBrowser->SUCInfo;
|
|
|
|
switch (QuestionId) {
|
|
//=================//
|
|
// KEY_WAKE_ON_PME //
|
|
//=================//
|
|
case KEY_WAKE_ON_PME:
|
|
PmBase = PmcGetAcpiBase ();
|
|
Pm1EnData = IoRead16 (PmBase + R_ACPI_IO_PM1_EN);
|
|
|
|
if ( MyIfrNVData->WakeOnPME ) {
|
|
Pm1EnData &= ~BIT14; // B_ACPI_IO_PM1_EN_PCIEXPWAK_DIS;
|
|
} else {
|
|
Pm1EnData |= BIT14;
|
|
}
|
|
IoWrite16 (PmBase + R_ACPI_IO_PM1_EN, Pm1EnData);
|
|
break;
|
|
//=========//
|
|
// default //
|
|
//=========//
|
|
default:
|
|
Status = HotKeyCallBack (
|
|
This,
|
|
Action,
|
|
QuestionId,
|
|
Type,
|
|
Value,
|
|
ActionRequest
|
|
);
|
|
break;
|
|
}
|
|
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
|
|
SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) gSUBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
PowerCallbackRoutineByAction (
|
|
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;
|
|
EFI_CALLBACK_INFO *CallbackInfo;
|
|
UINTN BufferSize;
|
|
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
|
|
|
|
if ((This == NULL) ||
|
|
((Value == NULL) &&
|
|
(Action != EFI_BROWSER_ACTION_FORM_OPEN) &&
|
|
(Action != EFI_BROWSER_ACTION_FORM_CLOSE))||
|
|
(ActionRequest == NULL)) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
|
CallbackInfo = EFI_CALLBACK_INFO_FROM_THIS (This);
|
|
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
switch (Action) {
|
|
|
|
case EFI_BROWSER_ACTION_FORM_OPEN:
|
|
if (QuestionId == 0) {
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) gSUBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
}
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_FORM_CLOSE:
|
|
if (QuestionId == 0) {
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) gSUBrowser->SCBuffer,
|
|
TRUE
|
|
);
|
|
}
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_CHANGING:
|
|
Status = EFI_SUCCESS;
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING:
|
|
if (QuestionId == KEY_SCAN_F9) {
|
|
Status = HotKeyCallBack (
|
|
This,
|
|
Action,
|
|
QuestionId,
|
|
Type,
|
|
Value,
|
|
ActionRequest
|
|
);
|
|
SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) gSUBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
}
|
|
//
|
|
// avoid GetQuestionDefault execute ExtractConfig
|
|
//
|
|
return EFI_SUCCESS;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
InstallPowerCallbackRoutine (
|
|
IN EFI_HANDLE DriverHandle,
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_GUID FormsetGuid = FORMSET_ID_GUID_POWER;
|
|
|
|
mPowerCallBackInfo = AllocatePool (sizeof(EFI_CALLBACK_INFO));
|
|
if (mPowerCallBackInfo == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
mPowerCallBackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
|
|
mPowerCallBackInfo->DriverCallback.ExtractConfig = gSUBrowser->ExtractConfig;
|
|
mPowerCallBackInfo->DriverCallback.RouteConfig = gSUBrowser->RouteConfig;
|
|
mPowerCallBackInfo->DriverCallback.Callback = PowerCallbackRoutine;
|
|
mPowerCallBackInfo->HiiHandle = HiiHandle;
|
|
CopyGuid (&mPowerCallBackInfo->FormsetGuid, &FormsetGuid);
|
|
|
|
//
|
|
// Install protocol interface
|
|
//
|
|
Status = gBS->InstallProtocolInterface (
|
|
&DriverHandle,
|
|
&gEfiHiiConfigAccessProtocolGuid,
|
|
EFI_NATIVE_INTERFACE,
|
|
&mPowerCallBackInfo->DriverCallback
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
Status = InitPowerMenu (HiiHandle);
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
UninstallPowerCallbackRoutine (
|
|
IN EFI_HANDLE DriverHandle
|
|
)
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
if (mPowerCallBackInfo == NULL) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
Status = gBS->UninstallProtocolInterface (
|
|
DriverHandle,
|
|
&gEfiHiiConfigAccessProtocolGuid,
|
|
&mPowerCallBackInfo->DriverCallback
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
gBS->FreePool (mPowerCallBackInfo);
|
|
mPowerCallBackInfo = NULL;
|
|
return Status;
|
|
}
|
|
|
|
|
|
EFI_STATUS
|
|
InitPowerMenu (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
return Status;
|
|
}
|