alder_lake_bios/Lcfc/LfcPkg/DebugPageDxe/DebugPageDxe.c

875 lines
25 KiB
C

/*****************************************************************************
*
*
* Copyright (c) 2012 - 2015, Hefei LCFC Information Technology Co.Ltd.
* And/or its affiliates. All rights reserved.
* Hefei LCFC Information Technology Co.Ltd. PROPRIETARY/CONFIDENTIAL.
* Use is subject to license terms.
*
*****************************************************************************/
/*
Data Name Version Description
2014.06.06 Jansen.Jia v1.00 Modify the code sequence for post code variable always can be used.
*/
/*
Data Name Version Description
2015.12.16 Ken.Zhang v1.01 Add show Shutdown ID on debug page function.
*/
#include "DebugPageDxe.h"
//#include "GetEcShutdownID.h"
#include <Library/OemSvcLfcPeiGetBoardID.h>
UINTN mMaxColumn;
UINTN mMaxRow;
BOOLEAN gEcDebugFlag = FALSE;
BOOLEAN gMfgModeFlag = FALSE;
UINT8 gLfcPostCode[EC_POSTCODE_MAX_LENGTH];
UINT8 gWakeSource = 0;
//UINT8 gLfcShutdownId = 0;
//
// Length of temp string buffer to store value string.
//
#define CHARACTER_NUMBER_FOR_VALUE 30
CHAR16 *mOptionStringList[] = { \
LFC_DEBUG_PAGE_BLANK_STRING, LFC_DEBUG_PAGE_PLATFORM_TYPE_STRING, LFC_DEBUG_PAGE_BLANK_STRING,\
LFC_DEBUG_PAGE_POST_CODE_STRING, LFC_DEBUG_PAGE_BLANK_STRING, LFC_DEBUG_PAGE_WAKE_SOURCE_STRING,\
LFC_DEBUG_PAGE_BLANK_STRING, LFC_DEBUG_PAGE_SHUTDOWN_ID_STRING, LFC_DEBUG_PAGE_BLANK_STRING,\
LFC_DEBUG_PAGE_MFG_MODE_STRING, LFC_DEBUG_PAGE_BLANK_STRING,\
};
CHAR16 *mWakeSourceStringList[] = { \
LFC_WAKE_BY_UNKNOWN_STRING,\
LFC_WAKE_BY_POWER_BTN_STRING, LFC_WAKE_BY_NOVO_BTN_STRING, LFC_WAKE_BY_POWER_BTN_S4S5_STRING,\
LFC_WAKE_BY_RTC_S4S5_STRING, LFC_WAKE_BY_POWER_BTN_S3_STRING, LFC_WAKE_BY_RTC_S3_STRING,\
LFC_WAKE_BY_PCIE_S3_STRING, LFC_WAKE_BY_PME_S3_STRING, LFC_WAKE_BY_EC_WAKE_LID_STRING,\
};
//SHUTDOWNID_DESC ShutdownIdMapArryStd[] = {
////ShutdownId, ShutdownIdString
// { 0x01, LFC_SHUTDOWN_ID_S5_STRING},
// { 0x04, LFC_SHUTDOWN_ID_COMMAND_STRING},
// { 0x05, LFC_SHUTDOWN_ID_FLASH_STRING},
// { 0x06, LFC_SHUTDOWN_ID_COLDBOOT_STRING},
// { 0x08, LFC_SHUTDOWN_ID_BOOTFAIL_STRING},
// { 0x0A, LFC_SHUTDOWN_ID_BATTOVERTEMP_STRING},
// { 0x0B, LFC_SHUTDOWN_ID_THERMALCOMMFAIL_STRING},
// { 0x0C, LFC_SHUTDOWN_ID_BATTEMPTY_STRING},
// { 0x0E, LFC_SHUTDOWN_ID_BATTCOMMFAIL_STRING},
// { 0x0F, LFC_SHUTDOWN_ID_BATTABNORMAL_STRING},
// { 0x11, LFC_SHUTDOWN_ID_DTSOVERTEMP_STRING},
// { 0x12, LFC_SHUTDOWN_ID_VGAOVERTEMP_STRING},
// { 0x13, LFC_SHUTDOWN_ID_BATTLOWVOLT_STRING},
// { 0x1C, LFC_SHUTDOWN_ID_EXTVGAOVERTEMP_STRING},
// { 0x20, LFC_SHUTDOWN_ID_VGACOMMFAIL_STRING},
// { 0x21, LFC_SHUTDOWN_ID_EXTVGACOMMFAIL_STRING},
// { 0x22, LFC_SHUTDOWN_ID_CPUCOMMFAIL_STRING},
// { 0x30, LFC_SHUTDOWN_ID_TICLOCALOVERTEPM_STRING},
// { 0x31, LFC_SHUTDOWN_ID_TICREMOTOVERTEPM_STRING},
// { 0x32, LFC_SHUTDOWN_ID_TNTC_V_OVER_TEPM_STRING},
// { 0x33, LFC_SHUTDOWN_ID_CMISTOR_OVERTEMP_STRING},
// { 0x34, LFC_SHUTDOWN_ID_GMISTOR_OVERTEMP_STRING},
// { 0x40, LFC_SHUTDOWN_ID_RSOC_1PtO0P_STRING},
// { 0xA6, LFC_SHUTDOWN_ID_SHIP_MODE_STRING},
// { 0xA7, LFC_SHUTDOWN_ID_SHIP_MODE_STRING},
// { 0xA8, LFC_SHUTDOWN_ID_SHIP_MODE_STRING},
// { 0xEC, LFC_SHUTDOWN_ID_EC_RESET0_INFO_STRING},
// { 0xFC, LFC_SHUTDOWN_ID_EC_RESET1_INFO_STRING},
// { 0xFD, LFC_SHUTDOWN_ID_EC_RESET2_INFO_STRING},
// { 0xFE, LFC_SHUTDOWN_ID_EC_RESET3_INFO_STRING},
// { 0xFF, LFC_SHUTDOWN_ID_EC_RESET4_INFO_STRING},
//};
static CHAR16 mHexStr[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' };
//VOID
//GetAndSaveShutdownID (
// VOID
// )
//{
// EFI_STATUS Status = EFI_SUCCESS;
// UINT8 *FileBuf = NULL;
// UINTN BufSize = 0;
// BOOLEAN EcAd = FALSE;
// UINTN Index;
// UINT32 ShutdownIdAddr = 0;
//
// //
// // Allocating the file buffer
// //
// BufSize = 1 * BLOCK_SIZE_1K;
// Status = gBS->AllocatePages (
// AllocateAnyPages,
// EfiBootServicesData,
// EFI_SIZE_TO_PAGES(BufSize),
// (EFI_PHYSICAL_ADDRESS *) (&FileBuf)
// );
// if (EFI_ERROR (Status)) {
// goto Exit;
// }
//
// //
// // Get Shutdown Id address, this can't be execute after enter into falsh mode, it will hang up.
// // EC will not accept any command in the flash mode.
// //
// ShutdownIdAddr = GetShutdownIdAddr();
//
// //
// // Disable Keyboard
// //
// SendKbCmd (0xAD);
// EcAd = TRUE;
//
// //
// // Send command to EC, and prepare to enter into the flash mode.
// //
// SendEcCmd (0xDC);
//
// //
// // Checking EC status
// //
// if (ReadEcData () != 0x33) {
// Status = EFI_DEVICE_ERROR;
// goto Exit;
// }
//
// //
// // Dump EC ROM about Shutdown ID region
// //
// Status = ReadShutdownId1K (ShutdownIdAddr, FileBuf);
// if (EFI_ERROR (Status)) {
// goto Exit;
// }
//
// //
// // To do: progress shutdown id
// //
// for (Index = 4; Index < BLOCK_SIZE_1K; Index += 16){
// if (FileBuf[Index] == 0xFF) {
// gLfcShutdownId = FileBuf[Index-16];
// break;
// }
// }
//
// //
// // Save Shutdown ID data into variable.
// //
// Status = gRT->SetVariable (
// LFC_SHUTDOWN_ID_DATA,
// &gLfcVariableGuid,
// EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
// sizeof (gLfcShutdownId),
// (VOID *)&gLfcShutdownId
// );
//
// if (EFI_ERROR (Status)) {
// goto Exit;
// }
//
// if (FileBuf != NULL) {
// gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)FileBuf, EFI_SIZE_TO_PAGES (BufSize));
// }
//
//Exit:
//
// if (EcAd) {
// SendKbCmd (0xAE); // Enable Keyboard.
// SendEcCmd (0xFE); // EC will force to Reset the System.
// }
//
// if (FileBuf != NULL) {
// gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)FileBuf, EFI_SIZE_TO_PAGES (BufSize));
// }
//}
UINTN
PrintAt (
IN UINTN Column,
IN UINTN Row,
IN CHAR16 *Fmt,
...
)
{
CHAR16 *Buffer;
UINTN StrLen;
VA_LIST Marker;
Buffer = AllocateZeroPool (0x10000);
ASSERT(Buffer);
if (Column != (UINTN) -1) {
gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
}
VA_START (Marker, Fmt);
StrLen = UnicodeVSPrint (Buffer, 0x10000 , Fmt, Marker);
VA_END (Marker);
if (gST->ConOut != NULL) {
gST->ConOut->OutputString (gST->ConOut, Buffer);
}
gBS->FreePool (Buffer);
return StrLen;
}
UINTN
EfiValueToHexStr (
IN OUT CHAR16 *Buffer,
IN UINT64 Value,
IN UINTN Flags,
IN UINTN Width
)
/*++
Routine Description:
VSPrint worker function that prints a Value as a hex number in Buffer
Arguments:
Buffer - Location to place ascii hex string of Value.
Value - Hex value to convert to a string in Buffer.
Flags - Flags to use in printing Hex string, see file header for details.
Width - Width of hex value.
Returns:
Number of characters printed.
--*/
{
CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];
CHAR16 *TempStr;
CHAR16 Prefix;
CHAR16 *BufferPtr;
UINTN Count;
UINTN Index;
TempStr = AllocateZeroPool (100);
BufferPtr = AllocateZeroPool (100);
TempStr = TempBuffer;
BufferPtr = Buffer;
//
// Count starts at one since we will null terminate. Each iteration of the
// loop picks off one nibble. Oh yea TempStr ends up backwards
//
Count = 0;
if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) {
Width = CHARACTER_NUMBER_FOR_VALUE - 1;
}
do {
Index = ((UINTN)Value & 0xf);
*(TempStr++) = mHexStr[Index];
Value = RShiftU64 (Value, 4);
Count++;
} while (Value != 0);
if (Flags & PREFIX_ZERO) {
Prefix = '0';
} else {
Prefix = ' ';
}
Index = Count;
if (!(Flags & LEFT_JUSTIFY)) {
for (; Index < Width; Index++) {
*(TempStr++) = Prefix;
}
}
//
// Reverse temp string into Buffer.
//
if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {
TempStr = TempBuffer + Width;
}
Index = 0;
while (TempStr != TempBuffer) {
*(BufferPtr++) = *(--TempStr);
Index++;
}
*BufferPtr = 0;
gBS->FreePool(TempStr);
gBS->FreePool(BufferPtr);
return Index;
}
VOID
DrawLfcDebugPageDialog (
IN UINTN DialogColumn,
IN UINTN DialogRow
)
{
UINTN Index;
UINTN Color;
UINTN LeftCol, RightCol;
UINTN UpRow, DownRow;
CHAR16 CleanLine[MAX_STRING_LENGTH];
LeftCol = (mMaxColumn - DialogColumn) / 2;
RightCol = LeftCol + DialogColumn + 1;
UpRow = (mMaxRow - DialogRow) /2 ;
DownRow = UpRow + DialogRow + 1;
Color = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLUE);
gST->ConOut->SetAttribute (gST->ConOut, Color);
for (Index = 0; Index <= DialogColumn; Index++) {
CleanLine[Index] = 0x20;
}
CleanLine[Index] = 0;
for (Index = UpRow; Index <= DownRow; Index++) {
PrintAt (LeftCol, Index, L"%s", CleanLine);
}
for (Index = LeftCol; Index < RightCol; Index++) {
PrintAt (Index, UpRow, L"%c", BOXDRAW_HORIZONTAL);
PrintAt (Index, UpRow + 2, L"%c", BOXDRAW_HORIZONTAL);
PrintAt (Index, DownRow, L"%c", BOXDRAW_HORIZONTAL);
}
for (Index = UpRow; Index < DownRow; Index++) {
PrintAt (LeftCol, Index, L"%c", BOXDRAW_VERTICAL);
PrintAt (RightCol, Index, L"%c", BOXDRAW_VERTICAL);
}
PrintAt (RightCol, DownRow, L"%c", BOXDRAW_UP_LEFT);
PrintAt (RightCol, UpRow, L"%c", BOXDRAW_DOWN_LEFT);
PrintAt (LeftCol, DownRow, L"%c", BOXDRAW_UP_RIGHT);
PrintAt (LeftCol, UpRow, L"%c", BOXDRAW_DOWN_RIGHT);
PrintAt (LeftCol, UpRow + 2, L"%c", BOXDRAW_VERTICAL_RIGHT);
PrintAt (RightCol, UpRow + 2, L"%c", BOXDRAW_VERTICAL_LEFT);
PrintAt ((mMaxColumn - (StrSize (LFC_DEBUG_PAGE_TITLE_STRING) / sizeof (CHAR16))) / 2, UpRow + 1, L"%s", LFC_DEBUG_PAGE_TITLE_STRING);
Color = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK);
gST->ConOut->SetAttribute (gST->ConOut, Color);
if (!PcdGetBool (PcdLcfcGoldenBiosEnable)) {
PrintAt ((mMaxColumn - (StrSize (LFC_DEBUG_PAGE_HELP_STRING) / sizeof (CHAR16))) / 2, mMaxRow - 1, L"%s", LFC_DEBUG_PAGE_HELP_STRING);
}
}
VOID
DrawLfcDebugPageItmeArea (
IN UINTN DialogColumn,
IN UINTN DialogRow,
IN UINTN MaxSelection
)
{
UINTN Index;
//UINTN ShutdownIdIndex;
UINTN NormalColor;
UINTN HighLightColor;
UINTN LeftCol;
UINTN UpRow;
EFI_STATUS Status = EFI_SUCCESS;
CHAR16 *PlatformTypeString = NULL;
CHAR16 *TempBuffer = NULL;
CHAR16 *EcPostString = NULL;
UINTN IndexPostCode;
UINT8 CheckUmaOrDis;
LeftCol = (mMaxColumn - DialogColumn) / 2;
UpRow = (mMaxRow - DialogRow) /2 ;
NormalColor = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLUE);
HighLightColor = EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_CYAN);
gST->ConOut->SetAttribute (gST->ConOut, NormalColor);
for (Index = 0; Index < MaxSelection; Index++) {
switch(Index) {
case DebugPagePlatformType:
//
// Get Platform Type
//
PlatformTypeString = AllocateZeroPool (100);
{
OemSvcLfcGetBoardID(GPU_ID, &CheckUmaOrDis);
}
if (!EFI_ERROR (Status)) {
if (CheckUmaOrDis == GPU_ID_UMA_ONLY) {
PlatformTypeString = L"UMA";
}
else if (CheckUmaOrDis == GPU_ID_DIS_NVIDIA) {
PlatformTypeString = L"Discrete Nvidia";
}
else if (CheckUmaOrDis == GPU_ID_DIS_AMD) {
PlatformTypeString = L"Discrete AMD";
}
else if (CheckUmaOrDis == GPU_ID_DIS_INTEL) {
PlatformTypeString = L"Discrete Intel";
}
}
else {
PlatformTypeString = L"Error";
}
PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s%s", mOptionStringList[Index], PlatformTypeString);
gBS->FreePool(PlatformTypeString);
break;
case DebugPagePostCode:
//
// Show Dumped Debug Code.
//
EcPostString = AllocateZeroPool (100);
TempBuffer = AllocateZeroPool (100);
for(IndexPostCode = 0; IndexPostCode < EC_POSTCODE_MAX_LENGTH; IndexPostCode ++) {
EfiValueToHexStr (TempBuffer, gLfcPostCode[IndexPostCode], PREFIX_ZERO, 2);
//[-start-210517-KEBIN00001-modify]//
StrCatS (EcPostString, 100/sizeof(CHAR16), TempBuffer);
StrCatS (EcPostString, 100/sizeof(CHAR16), L"h ");
//[-end-210517-KEBIN00001-modify]//
}
//
// Display EC post code
//
PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s%s", mOptionStringList[Index], EcPostString);
gBS->FreePool(EcPostString);
gBS->FreePool(TempBuffer);
break;
case DebugPageWakeSource:
//
// Show Wake Source.
//
PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s%02Xh%s", mOptionStringList[Index], gWakeSource, mWakeSourceStringList[gWakeSource]);
break;
case DebugPageShutDownId:
// //
// // Show ShutdownId.
// //
// TempBuffer = LFC_SHUTDOWN_ID_UNKNOW_STRING;
// for (ShutdownIdIndex = 0; ShutdownIdIndex < sizeof (ShutdownIdMapArryStd) / sizeof (ShutdownIdMapArryStd[0]); ShutdownIdIndex++) {
// if (ShutdownIdMapArryStd[ShutdownIdIndex].ShutdownId == gLfcShutdownId) {
// TempBuffer = ShutdownIdMapArryStd[ShutdownIdIndex].ShutdownIdString;
// break;
// }
// }
//
// PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s%02Xh%s", mOptionStringList[Index], gLfcShutdownId, TempBuffer);
//
// gBS->FreePool(TempBuffer);
break;
case DebugPageMfgMode:
if (gMfgModeFlag) {
PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s%s", mOptionStringList[Index], L"Enabled ");
break;
}
default:
PrintAt (LeftCol + 1, UpRow + 3 + Index, L"%s", mOptionStringList[Index]);
break;
}
}
}
//
// due to h2offt loaded at hte end of bds, so add a flag change here to indicate develop engineer need skip flash EC this time
// 1st time boot here, change to another value
// 2nd time boot here, change to a invalid value
//
VOID
HandleFlashEcOneTime (
)
{
UINT8 DataH, DataL;
UINT8 InputData=0x55;
UINT8 SecondData=0xAA;
UINT8 DefaultData=0;
IoWrite8(LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_H_INDEX);
DataH = IoRead8(LFC_CMOS_DATA);
IoWrite8(LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_L_INDEX);
DataL = IoRead8(LFC_CMOS_DATA);
if((InputData == DataH) && (InputData == DataH) ){
IoWrite8 (LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_H_INDEX);
IoWrite8 (LFC_CMOS_DATA, SecondData);
IoWrite8 (LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_L_INDEX);
IoWrite8 (LFC_CMOS_DATA, SecondData);
} else if((SecondData == DataH) && (SecondData == DataH) ){
IoWrite8 (LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_H_INDEX);
IoWrite8 (LFC_CMOS_DATA, DefaultData);
IoWrite8 (LFC_CMOS_INDEX, LFC_FLASH_EC_ONCE_L_INDEX);
IoWrite8 (LFC_CMOS_DATA, DefaultData);
}
return;
}
EFI_STATUS
ShowLfcDebugPage (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status = EFI_UNSUPPORTED;
UINT8 Flag = 0;
UINT32 FlagDataSize = 1;
LENOVO_VARIABLE_PROTOCOL*LenovoVariable;
EFI_GUID gLvarMfgModeFlagGuid = LVAR_MFG_MODE_FLAG_GUID;
EFI_INPUT_KEY Key;
UINTN OldAttribute, OldColumn, OldRow;
UINTN DialogColumn;
UINTN DialogRow;
UINTN MaxSelection;
UINTN Size;
BOOLEAN mShowHiddenPage;
BOOLEAN mShowHiddenPageFlag;
BOOLEAN mFndPressedFlag;
HandleFlashEcOneTime();
//
// If L"cE!" had been created by Fn + D last time. Remove L"cE!" and hidden the page.
//
//
// Get Fn + D Pressed Flag.
//
Size = sizeof (mFndPressedFlag);
Status = gRT->GetVariable (
LFC_FND_PRESSED_FLAG,
&gLfcVariableGuid,
NULL,
&Size,
(VOID *)&mFndPressedFlag
);
if (!EFI_ERROR (Status)) {
gEcDebugFlag = TRUE;
Status = gRT->SetVariable (
LFC_FND_PRESSED_FLAG,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0,
(VOID *)&mFndPressedFlag
);
Size = sizeof (gLfcPostCode);
Status = gRT->GetVariable (
LFC_POST_CODE_DATA,
&gLfcVariableGuid,
NULL,
&Size,
(VOID *)&gLfcPostCode
);
Size = sizeof (gWakeSource);
Status = gRT->GetVariable (
LFC_WAKE_SOURCE_DATA,
&gLfcVariableGuid,
NULL,
&Size,
(VOID *)&gWakeSource
);
// Status = gRT->GetVariable (
// LFC_SHUTDOWN_ID_DATA,
// &gLfcVariableGuid,
// NULL,
// &Size,
// (VOID *)&gLfcShutdownId
// );
}
if (!gEcDebugFlag) {
Size = sizeof (mShowHiddenPageFlag);
mShowHiddenPageFlag = FALSE;
Status = gRT->GetVariable (
LFC_HIDDEN_PAGE_FLAG,
&gLfcVariableGuid,
NULL,
&Size,
(VOID *)&mShowHiddenPageFlag
);
//
// If the Hidden page is opened by debug page last time, close it.
//
if (!EFI_ERROR (Status)) {
Status = gRT->SetVariable (
LFC_HIDDEN_PAGE_FLAG,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0,
(VOID *)&mShowHiddenPageFlag
);
mShowHiddenPage = FALSE;
Status = gRT->SetVariable (
L"cE!",
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0,
(VOID *)&mShowHiddenPage
);
}
return EFI_SUCCESS;
}
Status = gBS->LocateProtocol (&gLenovoVariableProtocolGuid, NULL, &LenovoVariable) ;
if (EFI_ERROR (Status) ) {
return Status;
}
Status = LenovoVariable->GetVariable (LenovoVariable, &gLvarMfgModeFlagGuid, &FlagDataSize, (VOID*) (&Flag)) ;
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)){
return Status;
}
if (Flag == 'Y') {
gMfgModeFlag = TRUE;
}
//
// Init environment variable
//
gST->ConOut->QueryMode (
gST->ConOut,
gST->ConOut->Mode->Mode,
&mMaxColumn,
&mMaxRow
);
//
// Show Lfc Debug Page if pressed Fn+D during last Boot.
//
MaxSelection = 9;
if (gMfgModeFlag) {
MaxSelection = 11;
}
DialogColumn = LFC_DEBUG_PAGE_STRING_MAX_LENGTH;
DialogRow = MaxSelection + 2;
gST->ConOut->EnableCursor (gST->ConOut, FALSE);
gST->ConOut->ClearScreen(gST->ConOut);
OldAttribute = gST->ConOut->Mode->Attribute;
OldColumn = gST->ConOut->Mode->CursorColumn;
OldRow = gST->ConOut->Mode->CursorRow;
//
// Draw Lfc Debug Page dialog
//
DrawLfcDebugPageDialog (DialogColumn, DialogRow);
DrawLfcDebugPageItmeArea (DialogColumn, DialogRow, MaxSelection);
//
// Process input
//
do {
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
if (!EFI_ERROR (Status)) {
if (Key.ScanCode == SCAN_F2) {
if (!PcdGetBool (PcdLcfcGoldenBiosEnable)) {
mShowHiddenPage = TRUE;
Status = gRT->SetVariable (
L"cE!",
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (mShowHiddenPage),
(VOID *)&mShowHiddenPage
);
//
// Create the flag to hide the Hidden Page for normal boot next time, and keep it will not conflict with other method.
//
mShowHiddenPageFlag = TRUE;
Status = gRT->SetVariable (
LFC_HIDDEN_PAGE_FLAG,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (mShowHiddenPageFlag),
(VOID *)&mShowHiddenPageFlag
);
}
break;
}
else {
if(Key.ScanCode == SCAN_ESC) {
break;
}
}
}
} while (TRUE);
gST->ConOut->SetAttribute (gST->ConOut, OldAttribute);
gST->ConOut->SetCursorPosition (gST->ConOut, OldColumn, OldRow);
Status = EFI_SUCCESS;
gST->ConOut->ClearScreen(gST->ConOut);
return Status;
}
EFI_STATUS
InitialLfcDebugPage (
VOID
)
{
EFI_STATUS Status = EFI_SUCCESS;
BOOLEAN DisableFastBootFlag = 1;
BOOLEAN mFndPressedFlag = TRUE;
Status = LfcEcLibCheckEcDebugFlag (KBC_CMD_STATE, KBC_DATA, &gEcDebugFlag);
if (EFI_ERROR (Status)) {
return Status;
}
if (gEcDebugFlag) {
//
// Dump EC post code
//
Status = LfcEcLibDumpEcPostCode (KBC_CMD_STATE, KBC_DATA, gLfcPostCode);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Get the wake source data
//
IoWrite8(LFC_CMOS_INDEX, LFC_LAST_WAKE_SRC_INDEX);
gWakeSource = IoRead8(LFC_CMOS_DATA);
//
// Disable Fast boot by one time flag.
//
Status = gRT->SetVariable (
L"OneTimeDisableFastBoot",
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (DisableFastBootFlag),
&DisableFastBootFlag
);
//
// Save Fn + D Pressed Flag into variable.
//
Status = gRT->SetVariable (
LFC_FND_PRESSED_FLAG,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (mFndPressedFlag),
(VOID *)&mFndPressedFlag
);
//
// Save Post code data into variable.
//
Status = gRT->SetVariable (
LFC_POST_CODE_DATA,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (gLfcPostCode),
(VOID *)&gLfcPostCode
);
//
// Save wake source data into variable.
//
Status = gRT->SetVariable (
LFC_WAKE_SOURCE_DATA,
&gLfcVariableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof (gWakeSource),
(VOID *)&gWakeSource
);
// //
// // Get and Save Shutdown ID, the EC will force to reset the system.
// //
// GetAndSaveShutdownID ();
//
//Reset start system for Hot key can't work after fast boot and S4 Resume.
//
gST->RuntimeServices->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
}
return Status;
}
EFI_STATUS
DebugPageDxeEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*++
Routine Description:
Arguments:
None
Returns:
None
--*/
{
EFI_STATUS Status = EFI_SUCCESS;
//#[-start-220414-dennis0017-Modify]//
#if defined(C770_SUPPORT) || defined(C970_SUPPORT) || defined(S77014_SUPPORT) || defined(S77014IAH_SUPPORT) || defined(S370_SUPPORT) || defined(S570_SUPPORT)
#else
VOID *StartOfBdsDiagnosticsEventRegistration = NULL;
EFI_EVENT StartOfBdsDiagnosticsEvent = NULL;
InitialLfcDebugPage ();
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
ShowLfcDebugPage,
NULL,
&StartOfBdsDiagnosticsEvent
);
if (EFI_ERROR (Status)) {
return EFI_ABORTED;
}
Status = gBS->RegisterProtocolNotify (
&gEfiStartOfBdsDiagnosticsProtocolGuid,
StartOfBdsDiagnosticsEvent,
&StartOfBdsDiagnosticsEventRegistration
);
if (EFI_ERROR (Status)) {
return EFI_ABORTED;
}
#endif
//#[-end-220414-dennis0017-Modify]//
return Status;
}