/** @file\r
FrontPage routines to handle the callbacks and browser calls\r
\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
#include "Language.h"\r
#include "Hotkey.h"\r
\r
-BOOLEAN mSetupModeInitialized = FALSE;\r
-UINT32 mSetupTextModeColumn;\r
-UINT32 mSetupTextModeRow;\r
-UINT32 mSetupHorizontalResolution;\r
-UINT32 mSetupVerticalResolution;\r
+BOOLEAN mModeInitialized = FALSE;\r
\r
BOOLEAN gConnectAllHappened = FALSE;\r
UINTN gCallbackKey;\r
+CHAR8 *mLanguageString;\r
+\r
+//\r
+// Boot video resolution and text mode.\r
+//\r
+UINT32 mBootHorizontalResolution = 0;\r
+UINT32 mBootVerticalResolution = 0;\r
+UINT32 mBootTextModeColumn = 0;\r
+UINT32 mBootTextModeRow = 0;\r
+//\r
+// BIOS setup video resolution and text mode.\r
+//\r
+UINT32 mSetupTextModeColumn = 0;\r
+UINT32 mSetupTextModeRow = 0;\r
+UINT32 mSetupHorizontalResolution = 0;\r
+UINT32 mSetupVerticalResolution = 0;\r
\r
EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;\r
\r
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
)\r
{\r
- CHAR8 *LanguageString;\r
CHAR8 *LangCode;\r
CHAR8 *Lang;\r
UINTN Index;\r
EFI_STATUS Status;\r
- CHAR8 *PlatformSupportedLanguages;\r
- CHAR8 *BestLanguage;\r
\r
- if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+ if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+ //\r
+ // All other action return unsupported.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ \r
+ gCallbackKey = QuestionId;\r
+\r
+ if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
if ((Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- gCallbackKey = QuestionId;\r
-\r
- //\r
- // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
- // describe to their customers in documentation how to find their setup information (namely\r
- // under the device manager and specific buckets)\r
- //\r
switch (QuestionId) {\r
case FRONT_PAGE_KEY_CONTINUE:\r
//\r
// This is the continue - clear the screen and return an error to get out of FrontPage loop\r
//\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
break;\r
\r
case FRONT_PAGE_KEY_LANGUAGE:\r
- //\r
- // Collect the languages from what our current Language support is based on our VFR\r
- //\r
- LanguageString = HiiGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
- ASSERT (LanguageString != NULL);\r
//\r
// Allocate working buffer for RFC 4646 language in supported LanguageString.\r
//\r
- Lang = AllocatePool (AsciiStrSize (LanguageString));\r
- ASSERT (Lang != NULL);\r
+ Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
+ ASSERT (Lang != NULL); \r
\r
Index = 0;\r
- LangCode = LanguageString;\r
+ LangCode = mLanguageString;\r
while (*LangCode != 0) {\r
GetNextLanguage (&LangCode, Lang);\r
\r
Index++;\r
}\r
\r
- PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes");\r
- if (PlatformSupportedLanguages == NULL) {\r
- PlatformSupportedLanguages = AllocateCopyPool (\r
- AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
- (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
- );\r
- ASSERT (PlatformSupportedLanguages != NULL);\r
- }\r
-\r
- //\r
- // Select the best language in platform supported Language.\r
- //\r
- BestLanguage = GetBestLanguage (\r
- PlatformSupportedLanguages,\r
- FALSE,\r
- Lang,\r
- NULL\r
- );\r
- if (BestLanguage != NULL) {\r
+ if (Index == Value->u8) {\r
Status = gRT->SetVariable (\r
L"PlatformLang",\r
&gEfiGlobalVariableGuid,\r
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- AsciiStrSize (BestLanguage),\r
+ AsciiStrSize (Lang),\r
Lang\r
);\r
ASSERT_EFI_ERROR(Status);\r
- FreePool (BestLanguage);\r
} else {\r
ASSERT (FALSE);\r
}\r
\r
- FreePool (PlatformSupportedLanguages);\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+\r
FreePool (Lang);\r
- FreePool (LanguageString);\r
break;\r
\r
+ default:\r
+ break;\r
+ }\r
+ } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+ if (Value == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
+ // describe to their customers in documentation how to find their setup information (namely\r
+ // under the device manager and specific buckets)\r
+ //\r
+ switch (QuestionId) {\r
case FRONT_PAGE_KEY_BOOT_MANAGER:\r
//\r
// Boot Manager\r
gCallbackKey = 0;\r
break;\r
}\r
-\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-\r
- return EFI_SUCCESS;\r
}\r
\r
- //\r
- // All other action return unsupported.\r
- //\r
- return EFI_UNSUPPORTED;\r
+ return EFI_SUCCESS; \r
}\r
\r
/**\r
)\r
{\r
EFI_STATUS Status;\r
- CHAR8 *LanguageString;\r
CHAR8 *LangCode;\r
CHAR8 *Lang;\r
CHAR8 *CurrentLang;\r
- CHAR8 *BestLanguage;\r
UINTN OptionCount;\r
CHAR16 *StringBuffer;\r
EFI_HII_HANDLE HiiHandle;\r
VOID *EndOpCodeHandle;\r
EFI_IFR_GUID_LABEL *StartLabel;\r
EFI_IFR_GUID_LABEL *EndLabel;\r
- BOOLEAN FirstFlag;\r
+ EFI_HII_STRING_PROTOCOL *HiiString;\r
+ UINTN StringSize;\r
+\r
+ Lang = NULL;\r
+ StringBuffer = NULL;\r
\r
if (InitializeHiiData) {\r
//\r
// Collect the languages from what our current Language support is based on our VFR\r
//\r
HiiHandle = gFrontPagePrivate.HiiHandle;\r
- LanguageString = HiiGetSupportedLanguages (HiiHandle);\r
- ASSERT (LanguageString != NULL);\r
- //\r
- // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
- //\r
- Lang = AllocatePool (AsciiStrSize (LanguageString));\r
- ASSERT (Lang != NULL);\r
\r
CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
+\r
//\r
- // Select the best language in LanguageString as the default one.\r
- //\r
- BestLanguage = GetBestLanguage (\r
- LanguageString,\r
- FALSE,\r
- (CurrentLang != NULL) ? CurrentLang : "",\r
- (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
- LanguageString,\r
- NULL\r
- );\r
- //\r
- // BestLanguage must be selected as it is the first language in LanguageString by default\r
+ // Get Support language list from variable.\r
//\r
- ASSERT (BestLanguage != NULL);\r
-\r
- OptionCount = 0;\r
- LangCode = LanguageString;\r
- FirstFlag = FALSE;\r
+ if (mLanguageString == NULL){\r
+ mLanguageString = GetEfiGlobalVariable (L"PlatformLangCodes");\r
+ if (mLanguageString == NULL) {\r
+ mLanguageString = AllocateCopyPool (\r
+ AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
+ (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
+ );\r
+ ASSERT (mLanguageString != NULL);\r
+ }\r
+ }\r
\r
if (gFrontPagePrivate.LanguageToken == NULL) {\r
+ //\r
+ // Count the language list number.\r
+ // \r
+ LangCode = mLanguageString;\r
+ Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
+ ASSERT (Lang != NULL);\r
+ OptionCount = 0;\r
while (*LangCode != 0) {\r
GetNextLanguage (&LangCode, Lang);\r
OptionCount ++;\r
}\r
- gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID));\r
+\r
+ //\r
+ // Allocate extra 1 as the end tag.\r
+ //\r
+ gFrontPagePrivate.LanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
- FirstFlag = TRUE;\r
- }\r
\r
- OptionCount = 0;\r
- LangCode = LanguageString;\r
- while (*LangCode != 0) {\r
- GetNextLanguage (&LangCode, Lang);\r
+ Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- if (FirstFlag) {\r
- StringBuffer = HiiGetString (HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, Lang);\r
- ASSERT (StringBuffer != NULL);\r
+ LangCode = mLanguageString;\r
+ OptionCount = 0;\r
+ while (*LangCode != 0) {\r
+ GetNextLanguage (&LangCode, Lang);\r
\r
- //\r
- // Save the string Id for each language\r
- //\r
+ StringSize = 0;\r
+ Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ StringBuffer = AllocateZeroPool (StringSize);\r
+ ASSERT (StringBuffer != NULL);\r
+ Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ StringBuffer = AllocatePool (AsciiStrSize (Lang) * sizeof (CHAR16));\r
+ ASSERT (StringBuffer != NULL);\r
+ AsciiStrToUnicodeStr (Lang, StringBuffer);\r
+ }\r
+\r
+ ASSERT (StringBuffer != NULL);\r
gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
FreePool (StringBuffer);\r
+\r
+ OptionCount++;\r
}\r
+ }\r
\r
- if (AsciiStrCmp (Lang, BestLanguage) == 0) {\r
+ ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
+ LangCode = mLanguageString;\r
+ OptionCount = 0;\r
+ if (Lang == NULL) {\r
+ Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
+ ASSERT (Lang != NULL);\r
+ }\r
+ while (*LangCode != 0) {\r
+ GetNextLanguage (&LangCode, Lang);\r
+\r
+ if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
HiiCreateOneOfOptionOpCode (\r
OptionsOpCodeHandle,\r
gFrontPagePrivate.LanguageToken[OptionCount],\r
if (CurrentLang != NULL) {\r
FreePool (CurrentLang);\r
}\r
- FreePool (BestLanguage);\r
FreePool (Lang);\r
- FreePool (LanguageString);\r
\r
HiiCreateOneOfOpCode (\r
StartOpCodeHandle,\r
SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
-\r
- //\r
- // Clear the progress status bar first\r
- //\r
+ \r
TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
- if (TmpStr != NULL) {\r
- PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
+\r
+ if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
+ //\r
+ // Clear the progress status bar first\r
+ //\r
+ if (TmpStr != NULL) {\r
+ PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
+ }\r
}\r
+ \r
\r
TimeoutRemain = TimeoutDefault;\r
while (TimeoutRemain != 0) {\r
break;\r
}\r
TimeoutRemain--;\r
-\r
- //\r
- // Show progress\r
- //\r
- if (TmpStr != NULL) {\r
- PlatformBdsShowProgress (\r
- Foreground,\r
- Background,\r
- TmpStr,\r
- Color,\r
- ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
- 0\r
- );\r
+ \r
+ if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
+ //\r
+ // Show progress\r
+ //\r
+ if (TmpStr != NULL) {\r
+ PlatformBdsShowProgress (\r
+ Foreground,\r
+ Background,\r
+ TmpStr,\r
+ Color,\r
+ ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
+ 0\r
+ );\r
+ }\r
}\r
}\r
- gBS->FreePool (TmpStr);\r
+ \r
+ if (TmpStr != NULL) {\r
+ gBS->FreePool (TmpStr);\r
+ }\r
\r
//\r
// Timeout expired\r
//\r
// User pressed some key\r
//\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
- //\r
- // User pressed enter, equivalent to select "continue"\r
- //\r
- return EFI_TIMEOUT;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function will change video resolution and text mode for setup when setup is launched.\r
-\r
- @param None.\r
-\r
- @retval EFI_SUCCESS Mode is changed successfully.\r
- @retval Others Mode failed to changed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ChangeModeForSetup (\r
- VOID\r
- )\r
-{\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
- UINTN SizeOfInfo;\r
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
- UINT32 MaxGopMode;\r
- UINT32 MaxTextMode;\r
- UINT32 ModeNumber;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN CurrentColumn;\r
- UINTN CurrentRow; \r
-\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- (VOID**)&GraphicsOutput\r
- );\r
- if (EFI_ERROR (Status)) {\r
- GraphicsOutput = NULL;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- (VOID**)&SimpleTextOut\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SimpleTextOut = NULL;\r
- } \r
-\r
- if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- //\r
- // Get user defined text mode for setup only once.\r
- // \r
- if (!mSetupModeInitialized) {\r
- mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
- mSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); \r
- mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);\r
- mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow);\r
- mSetupModeInitialized = TRUE;\r
- }\r
-\r
- MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
- MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
-\r
- //\r
- // 1. If current video resolution is same with setup video resolution,\r
- // video resolution need not be changed.\r
- // 1.1. If current text mode is same with setup text mode, text mode need not be changed.\r
- // 1.2. If current text mode is different with setup text mode, text mode need be changed to setup text mode.\r
- // 2. If current video resolution is different with setup video resolution, we need restart whole console drivers.\r
- //\r
- for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
- Status = GraphicsOutput->QueryMode (\r
- GraphicsOutput,\r
- ModeNumber,\r
- &SizeOfInfo,\r
- &Info\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if ((Info->HorizontalResolution == mSetupHorizontalResolution) &&\r
- (Info->VerticalResolution == mSetupVerticalResolution)) {\r
- if ((GraphicsOutput->Mode->Info->HorizontalResolution == mSetupHorizontalResolution) &&\r
- (GraphicsOutput->Mode->Info->VerticalResolution == mSetupVerticalResolution)) {\r
- //\r
- // If current video resolution is same with setup video resolution, \r
- // then check if current text mode is same with setup text mode.\r
- //\r
- Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
- ASSERT_EFI_ERROR (Status);\r
- if (CurrentColumn == mSetupTextModeColumn && CurrentRow == mSetupTextModeRow) {\r
- //\r
- // Current text mode is same with setup text mode, text mode need not be change.\r
- //\r
- FreePool (Info);\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // Current text mode is different with setup text mode, text mode need be change to new text mode.\r
- //\r
- for (Index = 0; Index < MaxTextMode; Index++) {\r
- Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
- if (!EFI_ERROR(Status)) {\r
- if ((CurrentColumn == mSetupTextModeColumn) && (CurrentRow == mSetupTextModeRow)) {\r
- //\r
- // setup text mode is supported, set it.\r
- //\r
- Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Update text mode PCD.\r
- //\r
- PcdSet32 (PcdConOutColumn, mSetupTextModeColumn);\r
- PcdSet32 (PcdConOutRow, mSetupTextModeRow);\r
- FreePool (Info);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
- if (Index == MaxTextMode) {\r
- //\r
- // If setup text mode is not supported, return error.\r
- //\r
- FreePool (Info);\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
- } else {\r
- FreePool (Info);\r
- //\r
- // If current video resolution is not same with the setup video resolution, set new video resolution.\r
- // In this case, the drivers which produce simple text out need be restarted.\r
- //\r
- Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Set PCD to restart GraphicsConsole and Consplitter to change video resolution \r
- // and produce new text mode based on new resolution.\r
- //\r
- PcdSet32 (PcdVideoHorizontalResolution, mSetupHorizontalResolution);\r
- PcdSet32 (PcdVideoVerticalResolution, mSetupVerticalResolution);\r
- PcdSet32 (PcdConOutColumn, mSetupTextModeColumn);\r
- PcdSet32 (PcdConOutRow, mSetupTextModeRow);\r
- \r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
- }\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
- }\r
- if (HandleBuffer != NULL) {\r
- FreePool (HandleBuffer);\r
- }\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- FreePool (Info);\r
+ if (!PcdGetBool (PcdConInConnectOnDemand)) {\r
+ Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
- }\r
\r
- if (ModeNumber == MaxGopMode) {\r
- //\r
- // If the new resolution is not supported, return error.\r
- //\r
- return EFI_UNSUPPORTED;\r
+ if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
+ //\r
+ // User pressed enter, equivalent to select "continue"\r
+ //\r
+ return EFI_TIMEOUT;\r
+ }\r
}\r
\r
return EFI_SUCCESS;\r
IN BOOLEAN ConnectAllHappened\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
+ EFI_STATUS Status;\r
+ EFI_STATUS StatusHotkey; \r
+ EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
+ UINTN BootTextColumn;\r
+ UINTN BootTextRow;\r
+ UINT64 OsIndication;\r
+ UINTN DataSize;\r
+ EFI_INPUT_KEY Key;\r
+\r
+ GraphicsOutput = NULL;\r
+ SimpleTextOut = NULL;\r
\r
PERF_START (NULL, "BdsTimeOut", "BDS", 0);\r
//\r
gConnectAllHappened = TRUE;\r
}\r
\r
- HotkeyBoot ();\r
- if (TimeoutDefault != 0xffff) {\r
- Status = ShowProgress (TimeoutDefault);\r
- HotkeyBoot ();\r
+ if (!mModeInitialized) {\r
+ //\r
+ // After the console is ready, get current video resolution \r
+ // and text mode before launching setup at first time.\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID**)&GraphicsOutput\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ GraphicsOutput = NULL;\r
+ }\r
+ \r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ (VOID**)&SimpleTextOut\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ SimpleTextOut = NULL;\r
+ } \r
+\r
+ if (GraphicsOutput != NULL) {\r
+ //\r
+ // Get current video resolution and text mode.\r
+ //\r
+ mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+ mBootVerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution;\r
+ }\r
+\r
+ if (SimpleTextOut != NULL) {\r
+ Status = SimpleTextOut->QueryMode (\r
+ SimpleTextOut,\r
+ SimpleTextOut->Mode->Mode,\r
+ &BootTextColumn,\r
+ &BootTextRow\r
+ );\r
+ mBootTextModeColumn = (UINT32)BootTextColumn;\r
+ mBootTextModeRow = (UINT32)BootTextRow;\r
+ }\r
+\r
+ //\r
+ // Get user defined text mode for setup.\r
+ // \r
+ mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
+ mSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); \r
+ mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);\r
+ mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow);\r
+\r
+ mModeInitialized = TRUE;\r
+ }\r
+\r
+\r
+ //\r
+ // goto FrontPage directly when EFI_OS_INDICATIONS_BOOT_TO_FW_UI is set\r
+ //\r
+ OsIndication = 0;\r
+ DataSize = sizeof(UINT64);\r
+ Status = gRT->GetVariable (\r
+ L"OsIndications",\r
+ &gEfiGlobalVariableGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &OsIndication\r
+ );\r
+\r
+ //\r
+ // goto FrontPage directly when EFI_OS_INDICATIONS_BOOT_TO_FW_UI is set. Skip HotkeyBoot\r
+ //\r
+ if (!EFI_ERROR(Status) && ((OsIndication & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0)) {\r
+ //\r
+ // Clear EFI_OS_INDICATIONS_BOOT_TO_FW_UI to acknowledge OS\r
+ // \r
+ OsIndication &= ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI;\r
+ Status = gRT->SetVariable (\r
+ L"OsIndications",\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof(UINT64),\r
+ &OsIndication\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Follow generic rule, Call ReadKeyStroke to connect ConIn before enter UI\r
+ //\r
+ if (PcdGetBool (PcdConInConnectOnDemand)) {\r
+ gST->ConIn->ReadKeyStroke(gST->ConIn, &Key);\r
+ }\r
\r
//\r
// Ensure screen is clear when switch Console from Graphics mode to Text mode\r
gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
gST->ConOut->ClearScreen (gST->ConOut);\r
\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Timeout or user press enter to continue\r
- //\r
- goto Exit;\r
+ } else {\r
+\r
+ HotkeyBoot ();\r
+ if (TimeoutDefault != 0xffff) {\r
+ Status = ShowProgress (TimeoutDefault);\r
+ StatusHotkey = HotkeyBoot ();\r
+\r
+ if (!FeaturePcdGet(PcdBootlogoOnlyEnable) || !EFI_ERROR(Status) || !EFI_ERROR(StatusHotkey)){\r
+ //\r
+ // Ensure screen is clear when switch Console from Graphics mode to Text mode\r
+ // Skip it in normal boot \r
+ //\r
+ gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
+ gST->ConOut->ClearScreen (gST->ConOut);\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Timeout or user press enter to continue\r
+ //\r
+ goto Exit;\r
+ }\r
}\r
}\r
\r
BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
}\r
\r
+ Status = EFI_SUCCESS;\r
do {\r
//\r
// Set proper video resolution and text mode for setup\r
//\r
- ChangeModeForSetup ();\r
+ BdsSetConsoleMode (TRUE);\r
\r
InitializeFrontPage (FALSE);\r
\r
UpdateFrontPageStrings ();\r
\r
gCallbackKey = 0;\r
- Status = CallFrontPage ();\r
+ CallFrontPage ();\r
\r
//\r
// If gCallbackKey is greater than 1 and less or equal to 5,\r
\r
} while ((Status == EFI_SUCCESS) && (gCallbackKey != FRONT_PAGE_KEY_CONTINUE));\r
\r
+ if (mLanguageString != NULL) {\r
+ FreePool (mLanguageString);\r
+ mLanguageString = NULL;\r
+ }\r
//\r
//Will leave browser, check any reset required change is applied? if yes, reset system\r
//\r
//\r
PERF_END (NULL, "BdsTimeOut", "BDS", 0);\r
}\r
+\r
+/**\r
+ This function will change video resolution and text mode\r
+ according to defined setup mode or defined boot mode \r
+\r
+ @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
+\r
+ @retval EFI_SUCCESS Mode is changed successfully.\r
+ @retval Others Mode failed to be changed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BdsSetConsoleMode (\r
+ BOOLEAN IsSetupMode\r
+ )\r
+{\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ UINT32 MaxGopMode;\r
+ UINT32 MaxTextMode;\r
+ UINT32 ModeNumber;\r
+ UINT32 NewHorizontalResolution;\r
+ UINT32 NewVerticalResolution;\r
+ UINT32 NewColumns;\r
+ UINT32 NewRows;\r
+ UINTN HandleCount;\r
+ EFI_HANDLE *HandleBuffer;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINTN CurrentColumn;\r
+ UINTN CurrentRow; \r
+\r
+ MaxGopMode = 0;\r
+ MaxTextMode = 0;\r
+\r
+ //\r
+ // Get current video resolution and text mode \r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID**)&GraphicsOutput\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ GraphicsOutput = NULL;\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ (VOID**)&SimpleTextOut\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ SimpleTextOut = NULL;\r
+ } \r
+\r
+ if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (IsSetupMode) {\r
+ //\r
+ // The requried resolution and text mode is setup mode.\r
+ //\r
+ NewHorizontalResolution = mSetupHorizontalResolution;\r
+ NewVerticalResolution = mSetupVerticalResolution;\r
+ NewColumns = mSetupTextModeColumn;\r
+ NewRows = mSetupTextModeRow;\r
+ } else {\r
+ //\r
+ // The required resolution and text mode is boot mode.\r
+ //\r
+ NewHorizontalResolution = mBootHorizontalResolution;\r
+ NewVerticalResolution = mBootVerticalResolution;\r
+ NewColumns = mBootTextModeColumn;\r
+ NewRows = mBootTextModeRow; \r
+ }\r
+ \r
+ if (GraphicsOutput != NULL) {\r
+ MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
+ } \r
+\r
+ if (SimpleTextOut != NULL) {\r
+ MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
+ }\r
+\r
+ //\r
+ // 1. If current video resolution is same with required video resolution,\r
+ // video resolution need not be changed.\r
+ // 1.1. If current text mode is same with required text mode, text mode need not be changed.\r
+ // 1.2. If current text mode is different from required text mode, text mode need be changed.\r
+ // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
+ //\r
+ for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
+ Status = GraphicsOutput->QueryMode (\r
+ GraphicsOutput,\r
+ ModeNumber,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
+ (Info->VerticalResolution == NewVerticalResolution)) {\r
+ if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
+ (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
+ //\r
+ // Current resolution is same with required resolution, check if text mode need be set\r
+ //\r
+ Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
+ //\r
+ // If current text mode is same with required text mode. Do nothing\r
+ //\r
+ FreePool (Info);\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ //\r
+ // If current text mode is different from requried text mode. Set new video mode\r
+ //\r
+ for (Index = 0; Index < MaxTextMode; Index++) {\r
+ Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
+ if (!EFI_ERROR(Status)) {\r
+ if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
+ //\r
+ // Required text mode is supported, set it.\r
+ //\r
+ Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
+ ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Update text mode PCD.\r
+ //\r
+ PcdSet32 (PcdConOutColumn, mSetupTextModeColumn);\r
+ PcdSet32 (PcdConOutRow, mSetupTextModeRow);\r
+ FreePool (Info);\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+ if (Index == MaxTextMode) {\r
+ //\r
+ // If requried text mode is not supported, return error.\r
+ //\r
+ FreePool (Info);\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ }\r
+ } else {\r
+ //\r
+ // If current video resolution is not same with the new one, set new video resolution.\r
+ // In this case, the driver which produces simple text out need be restarted.\r
+ //\r
+ Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+ if (!EFI_ERROR (Status)) {\r
+ FreePool (Info);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ FreePool (Info);\r
+ }\r
+ }\r
+\r
+ if (ModeNumber == MaxGopMode) {\r
+ //\r
+ // If the resolution is not supported, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Set PCD to Inform GraphicsConsole to change video resolution.\r
+ // Set PCD to Inform Consplitter to change text mode.\r
+ //\r
+ PcdSet32 (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
+ PcdSet32 (PcdVideoVerticalResolution, NewVerticalResolution);\r
+ PcdSet32 (PcdConOutColumn, NewColumns);\r
+ PcdSet32 (PcdConOutRow, NewRows);\r
+ \r
+ \r
+ //\r
+ // Video mode is changed, so restart graphics console driver and higher level driver.\r
+ // Reconnect graphics console driver and higher level driver.\r
+ // Locate all the handles with GOP protocol and reconnect it.\r
+ //\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ NULL,\r
+ &HandleCount,\r
+ &HandleBuffer\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
+ gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
+ }\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
+ gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
+ }\r
+ if (HandleBuffer != NULL) {\r
+ FreePool (HandleBuffer);\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r