875 lines
25 KiB
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;
|
|
}
|