summaryrefslogtreecommitdiff
path: root/EDK/MiniSetup/BootOnly/protocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'EDK/MiniSetup/BootOnly/protocol.c')
-rw-r--r--EDK/MiniSetup/BootOnly/protocol.c1870
1 files changed, 1870 insertions, 0 deletions
diff --git a/EDK/MiniSetup/BootOnly/protocol.c b/EDK/MiniSetup/BootOnly/protocol.c
new file mode 100644
index 0000000..d112674
--- /dev/null
+++ b/EDK/MiniSetup/BootOnly/protocol.c
@@ -0,0 +1,1870 @@
+//*****************************************************************//
+//*****************************************************************//
+//*****************************************************************//
+//** **//
+//** (C)Copyright 2014, American Megatrends, Inc. **//
+//** **//
+//** All Rights Reserved. **//
+//** **//
+//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **//
+//** **//
+//** Phone (770)-246-8600 **//
+//** **//
+//*****************************************************************//
+//*****************************************************************//
+//*****************************************************************//
+// $Archive: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/BootOnly/protocol.c $
+//
+// $Author: Premkumara $
+//
+// $Revision: 51 $
+//
+// $Date: 8/28/14 7:36a $
+//
+//*****************************************************************//
+//*****************************************************************//
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/BootOnly/protocol.c $
+//
+// 51 8/28/14 7:36a Premkumara
+// [TAG] EIP107833, 125388
+// [Category] Improvement
+// [Symptom:] Setting best text and GOP mode while using TSEPostinterfaces
+// before TSE or after TSE.
+// [Files] Protocol.c, AMITSE.sdl, CommonHelper.c, MiniSetup.sdl,
+// PostMgmtc, PostmgmtExt.c, MessagBox.c
+//
+// 50 5/02/14 7:06a Premkumara
+// [TAG] EIP137373
+// [Category] Improvement
+// [Description] Added signal event for BeforeTimeOut and AfterTimeOut
+// with guids
+// [Files] AMIVfr.h,protocol.c
+//
+// 49 5/02/14 6:15a Arunsb
+// [TAG] EIP128665
+// [Category] Improvement
+// [Description] Providing support to invalidate the BGRT status bit.
+// Defined gTSEInvalidateBgrtStatusProtocolGuid
+// [Files] protocol.c and amivfr.h
+//
+// 48 5/02/14 6:12a Arunsb
+// [TAG] EIP128665
+// [Category] Improvement
+// [Description] Providing support to invalidate the BGRT status bit
+// [Files] protocol.c and amivfr.h
+//
+// 47 2/11/14 8:09p Arunsb
+// Changes reverted for 2.16.1243 label
+//
+// 46 11/07/13 1:55a Premkumara
+// [TAG] EIP-137373
+// [Category] Improvement
+// [Description] Added signal event for BeforeTimeOut and AfterTimeOut
+// with GUID
+// [Files] Protocol.c, AMIVfr.h
+//
+// 45 10/07/13 3:17a Premkumara
+// Resolved build error in EIP-128665
+//
+// 44 9/13/13 2:01p Premkumara
+// Uploaded back for EIP-128665 after TSEBootOnly 1240 release
+// Files - Protocol.c, Protocol.h, AMIPostMgr.h
+//
+// 43 8/26/13 2:16a Premkumara
+// Reverted back for BootOnly1240 release
+//
+// 41 4/18/13 6:15a Arunsb
+// [TAG] EIP113081
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] Post message displays twice
+// [RootCause] Buffer not cleared after displaying post message
+// [Solution] Buffer cleared properly. Save and restored the post
+// graphics screen properly.
+// [Files] protocol.c, screen.c and string.c
+//
+// 40 4/17/13 12:38p Arunsb
+// [TAG] EIP107967
+// [Category] Bug Fix
+// [Severity] Important
+// [Symptom] Ami Post Management functionalities reliant on ConOut need
+// checks added.
+// [Files] protocol.c
+//
+// 39 12/05/12 5:31a Rajashakerg
+// [TAG] EIP103381
+// [Category] Improvement
+// [Description] adopting SDL to control timeout spec
+// [Files] AMITSE.sdl, CommonHelper.c, protocol.c
+//
+// 38 12/05/12 4:50a Arunsb
+// [TAG] EIP107967
+// [Category] Improvement
+// [Description] Ami Post Management functionalities reliant on ConOut
+// need checks added
+// [Files] protocol.c
+//
+// 37 10/18/12 5:59a Arunsb
+// Updated for 2.16.1235 QA submission
+//
+// 31 10/10/12 12:36p Arunsb
+// Synched the source for v2.16.1232, backup with Aptio
+//
+// 35 9/24/12 9:14a Premkumara
+// [TAG] EIP 93797
+// [Category] Improvement
+// [Description] Add support to check for enabled device in BBS priority
+// order before launching legacy boot.
+// [Files] bbs.c, Boot.c, Protocol.c
+//
+// 34 9/17/12 6:10a Rajashakerg
+// Updated EIP changes for 2.16 release.
+//
+// 32 8/27/12 6:21a Premkumara
+// [TAG] EIP 94616
+// [Category] Improvement
+// [Description] TSE should not wait for key if fast boot is in progress
+// [Files] AMITSE.sdl, CommonHelper.c, Notify.c, Protocol.c
+//
+// 31 5/29/12 4:35a Arunsb
+// [TAG] EIP91109
+// [Category] Improvement
+// [Description] Sync the Aptio IV source for AptioV
+//
+// 30 5/28/12 5:52a Premkumara
+// [TAG] EIP75236
+// [Category] Improvement
+// [Description] Add the support to control the GOP dependency in TSE
+// notification.
+// [Files] AMITSE.sdl, CommonHelper.c, Notify.c, Minisetup.h,
+// Minisetup.sdl, protocol.c, FormBrowser.c, FormBrowser2.c
+//
+// 29 4/27/12 10:25a Premkumara
+// [TAG] EIP87769
+// [Category] Bug Fix
+// [Severity] Minor
+// [Symptom] Strings are not cleared after calling
+// PostManagerSwitchToPostScreen() function
+// [RootCause] DoRealFlushLines() is not done in
+// PostManagerSwitchToPostScreen() function
+// [Solution] Updateed the PostManagerSwitchToPostScreen() function to
+// perform DoRealFlushLines().
+// [Files] Protocol.c
+//
+// 28 4/04/12 12:27a Rajashakerg
+// [TAG] EIP86253
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] Mouse and SoftKbd does not work after displaying "No option
+// to boot to" in POST
+// [RootCause] Mouse timer cleared once after displaying the "No option
+// to boot to" in POST
+// [Solution] Mouse timer cleared only when its going to boot.
+// [Files] CommonHelper.c, commonoem.c, minisetupext.c, protocol.c
+//
+// 27 4/03/12 9:54a Premkumara
+// [TAG] EIP84150
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] All the timers for mouse drivers before exiting from setup
+// is not stopped
+// [RootCause] MouseDestroy() is not called StopPointingDevice()
+// function to stop Mouse device
+// [Solution] StopPointingDevice() function is called in MouseDestroy()
+// function
+// [Files] Mouse.c, Protocol.c, Ezport/StyleCommon.c,
+// EzportPlus/StyleCommon.c, Legacy/StyleCommon.c, Minisetupext.c
+//
+// 26 4/03/12 3:01a Premkumara
+// [TAG] EIP84150
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] All the timers for mouse drivers before exiting from setup
+// is not stopped
+// [RootCause] MouseDestroy() is not called StopPointingDevice()
+// function to stop Mouse device
+// [Solution] StopPointingDevice() function is called in MouseDestroy()
+// function
+// [Files] Mouse.c, Protocol.c, Ezport/StyleCommon.c,
+// EzportPlus/StyleCommon.c, Legacy/StyleCommon.c, Minisetupext.c
+//
+// 25 1/25/12 5:12a Rajashakerg
+// [TAG] EIP81549
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] BOOT_FLOW_NORMAL_INFINITE_LOOP enabled and pressing F7
+// while displaying "No option to boot to" is not working properly
+// [RootCause] When F7 key is pressed we have gBootFlow =
+// BOOT_FLOW_CONDITION_BBS_POPUP, and returning from checkforkey() and the
+// F7 key is not getting consumed and keeps on looping.
+// [Solution] Checking gBootFlow and making to normal in the loop.
+// [Files] protocol.c
+//
+// 24 12/30/11 1:51a Arunsb
+// [TAG] EIP76721
+// [Category] Bug Fix
+// [Severity] Important
+// [Symptom] BOOT_FLOW_NORMAL_INFINITE_LOOP option is not working
+// properly
+// [RootCause] Iterating variable reinitialized to 0 so in next loop it
+// becoming 1 so its missing first boot option
+// [Solution] Iterating vairable reinitialized to -1.
+// [Files] Protocol.c
+//
+// 23 11/21/11 5:48a Rajashakerg
+// [TAG] EIP74591
+// [Category] Improvement
+// [Description] Make MainSetupLoop as board module hook
+// [Files] AMITSE.sdl, CommonHelper.c, protocol.c, minisetup.h,
+// FormBrowser.c, FormBrowser2.c
+//
+// 22 11/20/11 7:19a Rajashakerg
+// [TAG] EIP62763
+// [Category] Improvement
+// [Description] Utilize the Improvements done from mouse driver in
+// AMITSE
+// [Files] HookAnchor.h, TseCommon.h, AMITSE.sdl, CommonHelper.c,
+// commonoem.c, commonoem.h, buffer.c, globals.c, HookAnchor.c,
+// minisetup.h, notify.c, postmgmt.c, protocol.c, ezport.c, stylecommon.c,
+// Mouse.c, Action.c, Date.c, frame.c, MessageBox.c, minisetupext.c,
+// minisetupext.h, numeric.c, numeric.h, page.c, PopupEdit.c, PopupEdit.h,
+// PopupPassword.c, postmgmtext.c, time.c.
+//
+// 21 10/31/11 2:14p Premkumara
+// [TAG] EIP73751
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] L"BootFlow" variable uses inconsistent attributes
+// [RootCause] L"BootFlow" variable uses inconsistent attributes in
+// protocol.c
+// [Solution] Made consistent use of L"Bootlow" variable with
+// EFI_VARIABLE_BOOTSERVICE_ACCESS attribute
+// [Files] protocol.c
+//
+// 20 9/29/11 7:02p Blaines
+// [TAG] - EIP 66860
+// [Category]- Function Request
+// [Synopsis]- AmiPostManager interface for text entry.
+// [Files] - LogoLib.h, AMIPostMgr.h, protocol.c, protocol.h,
+// TseAdvanced.c, TseLitehelper.c, TseUefiHii.h, Uefi21Wapper.c
+//
+// 19 6/23/11 7:38p Arunsb
+// [TAG] EIP57660
+// [Category] New Feature
+// [Description] Non-removable media boot behavior as described in UEFI
+// specification v 2.3.1, p. 3.4.1.
+// Checks for the setup key if no boot options avail
+// or not succedded to boot. If setup key pressed launches
+// the setup.
+// If no boot option avail then inserting thumb drive with
+// image efi\boot\bootxxxx.efi TSE will launch that image.
+// [Files] amitse.sdl, bootflow.c and protocol.c
+//
+// 18 6/20/11 3:59p Arunsb
+// [TAG] EIP57660
+// [Category] New Feature
+// [Description] Non-removable media boot behavior as described in UEFI
+// specification v 2.3.1, p. 3.4.1.
+// Checks for the setup key if no boot options avail
+// or succedded to boot and launches the setup.
+// [Files] amitse.sdl, bootflow.c, bootflow.h, commonoem.c,
+// boot.c and protocol.c
+//
+// 17 1/06/11 1:58a Mallikarjunanv
+// [TAG] EIP50479
+// [Category] Bug Fix
+// [Severity] Important
+// [Symptom] Calls to PostManagerProtocol->SwitchToPostScreen() after
+// legacy option ROM execution cause CPU exception.
+// [RootCause] After the notification, if the graphics driver
+// uninstalled and reinstalled from core module then gGOP is getting
+// corrupted.
+// [Solution] Updated the files, by making gGOP/gUgaDraw to NULL in the
+// update function and in switch to posty screen returining status as
+// aborted if the gGOP/gUgaDraw is NULL
+// [Files] protocol.c,notify.c,postmgmt.c
+//
+// 16 12/29/10 2:33a Mallikarjunanv
+// [TAG] EIP50479
+// [Category] Bug Fix
+// [Severity] Important
+// [Symptom] Calls to PostManagerProtocol->SwitchToPostScreen() after
+// legacy option ROM execution cause CPU exception.
+// [RootCause] After the notification, if the graphics driver
+// uninstalled and reinstalled from core module then gGOP getting
+// corrupted.
+// [Solution] Updated gGop/Ugadraw before using it in AMITSE.
+// [Files] logo.c,minisetup.h, notify.c, postmgmt.c ,protocol.c
+//
+// 15 12/02/10 1:07p Madhans
+// [TAG] - EIP 41838
+// [Category]- Enhancement
+// [Severity]- Mordarate
+// [Symptom]- Update AMI Post Manager Protocol witht he following. 2.
+// Updating the interface PostManagerDisplayPostMessageEx to handle the
+// cursor position properly. 2. Need to add new interface to GetAttribute
+// To keep the GetAttribute to end of protocol.
+// [Rootcause] - 1. Display string is over written by the next string if
+// the interface PostManagerDisplayPostMessageEx used simultaneously. 2.
+// Need to get the attribute info to use PostManagerDisplayPostMessage
+// interfaces effectively
+// [Solution]- Fix in string.c to handle cursor and line positions. The
+// files Protocol.c, Protocol.h and AmiPostMgr.h have the new interface
+// implementaion to get the attribute.
+// [Files] - Protocol.c, Protocol.h, AmiPostMgr.h and string.c
+//
+// 14 11/16/10 8:56a Mallikarjunanv
+// [TAG] - EIP 41838
+// [Category]- Enhancement
+// [Severity]- Mordarate
+// [Symptom]- Update AMI Post Manager Protocol witht he following. 2.
+// Updating the interface PostManagerDisplayPostMessageEx to handle the
+// cursor position properly. 2. Need to add new interface to GetAttribute
+// [Rootcause] - 1. Display string is over written by the next string if
+// the interface PostManagerDisplayPostMessageEx used simultaneously. 2.
+// Need to get the attribute info to use PostManagerDisplayPostMessage
+// interfaces effectively
+// [Solution]- Fix in string.c to handle cursor and line positions. The
+// files Protocol.c, Protocol.h and AmiPostMgr.h have the new interface
+// implementaion to get the attribute.
+// [Files] - Protocol.c, Protocol.h, AmiPostMgr.h and string.c
+//
+// 13 10/05/10 6:41p Madhans
+// [TAG] - EIP 45301
+// [Category]- Bug Fix
+// [Severity]- Minor
+// [Symptom]- when TSE_PRESERVE_DISABLED_BBS_DEVICE_ORDER is set disabling
+// first device cause system not to boot.
+// [Rootcause] - protocol.c was assuming disabled opens are coming in the
+// End.
+// [Solution]- Fix in protocol.c to handle this case.
+// [Files] - protocol.c
+//
+// 12 9/16/10 8:38p Madhans
+// Update for TSE 2.10. Refer Changelog.log for more details.
+//
+// 23 9/13/10 4:34p Madhans
+// 1. To preserve FastBootflow condition before going to Boottimeout.
+// 2. Preformance Calls optimized.
+//
+// 22 9/13/10 12:11p Blaines
+// Fix for the gPostMsgProtocolActive not being available past a certain
+// point
+//
+// 21 9/08/10 6:53a Mallikarjunanv
+// EIP-42080: TSE updates with respect to Fast Boot Support
+//
+// 20 6/17/10 4:19p Madhans
+//
+// 19 6/17/10 3:20p Blaines
+// Added error checking to PostManagerDisplayQuietBootMessage() for
+// messages that are 0 in length.
+//
+// 18 6/14/10 7:06p Madhans
+//
+// 17 4/02/10 4:34p Madhans
+//
+// 16 3/30/10 4:45p Blaines
+// Fix to prevent BBS Popup from being launched twice when selecting
+// ENTER_SETUP option
+//
+// 15 3/23/10 5:09p Blaines
+// Add PostManager Extentions
+//
+// 14 2/19/10 8:14a Mallikarjunanv
+// updated year in copyright message
+//
+// 13 2/17/10 7:02p Madhans
+// To support PrintQuiteBootmessage for UEFI 2.1
+//
+// 12 2/15/10 10:12p Madhans
+// To support Printquitebootmessage
+//
+// 11 2/04/10 11:21p Madhans
+// To remove Conout dependance
+//
+// 10 2/04/10 12:10p Blaines
+// Correct function header description for PostManagerSetAtribute.
+//
+// 9 2/04/10 12:03p Blaines
+// EIP-28005
+//
+// Added PostManagerSetAttribute to support display of text in color.
+// Added support for handling string characters --- \n, \r.
+//
+// 8 1/09/10 5:35a Mallikarjunanv
+// Updated TSE2.01 Release sources with coding standards
+//
+// 7 12/14/09 12:21p Blaines
+// Include EIP Comment
+//
+// EIP 28007, FIX: If Post message printed in the Quiteboot by using Set
+// cur position It is better to flash all the screen.
+//
+//
+// 6 10/28/09 5:37p Madhans
+//
+// 5 9/17/09 9:04a Sudhirv
+// Remove Load Driver Option from TSE 2.x as it will be handled from Core
+//
+// 4 9/16/09 6:15p Madhans
+// EIP 25416 : Support have 1/10 sec Timeout
+//
+// 3 6/23/09 6:56p Blaines
+// Coding standard update,
+// Remove spaces from file header to allow proper chm function list
+// creation.
+//
+// 2 6/12/09 7:41p Presannar
+// Initial implementation of coding standards
+//
+// 1 6/04/09 8:05p Madhans
+//
+// 2 5/13/09 2:22p Madhans
+// To patch the version number in the Bootonly TSE. update the build
+// number.
+//
+// 1 4/28/09 11:12p Madhans
+// Tse 2.0 Code complete Checkin.
+//
+// 6 4/28/09 9:39p Madhans
+// Tse 2.0 Code complete Checkin.
+//
+// 5 3/31/09 4:00p Madhans
+// UEFI2.1
+//
+// 4 2/05/09 5:19p Madhans
+// PostMgrStatus interface added.
+//
+// 3 2/05/09 10:15a Madhans
+// Style Module created.
+//
+// 2 1/30/09 6:06p Madhans
+// Function headers added.
+//
+// 1 12/18/08 7:58p Madhans
+// Intial version of TSE Lite sources
+//*****************************************************************//
+//*****************************************************************//
+
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------------
+//
+// Name: PROTOCOL.C
+//
+// Description: This file contains code for TSE exported protocol
+// functions.
+//
+//----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+
+#include "minisetup.h"
+
+UINT32 gBootFlow = BOOT_FLOW_CONDITION_NORMAL;
+
+BOOLEAN gDoNotBoot = FALSE;
+VOID StopClickEvent(VOID);//EIP-84150 Stopping ClickEvents
+
+static EFI_HANDLE gProtocolHandle = NULL;
+EFI_GUID gAmiPostManagerProtocolGuid = AMI_POST_MANAGER_PROTOCOL_GUID;
+EFI_GUID gTSEInvalidateBgrtStatusProtocolGuid = TSE_INVALIDATE_BGRT_STATUS_PROTOCOL_GUID;
+
+BOOLEAN TseIgnoreKeyForFastBoot(); //EIP-94616 Don't wait for key when FastBoot is Enabled
+BOOLEAN GetBBSOptionStatus(BOOT_DATA *pBootData); //EIP-93797
+
+static AMI_POST_MANAGER_PROTOCOL gPostManagerProtocol =
+{
+ PostManagerHandshake,
+ PostManagerDisplayPostMessage,
+ PostManagerDisplayPostMessageEx,
+ PostManagerDisplayQuietBootMessage,
+ PostManagerDisplayMsgBox,
+ PostManagerSwitchToPostScreen,
+ PostManagerSetCursorPosition,
+ PostManagerGetCursorPosition,
+ PostManagerInitProgressBar,
+ PostManagerSetProgressBarPosition,
+ PostManagerGetPostStatus,
+ PostManagerDisplayInfoBox,
+ PostManagerSetAttribute,
+ PostManagerDisplayMenu,
+ PostManagerDisplayMsgBoxEx,
+ PostManagerDisplayProgress,
+ PostManagerGetAttribute, //EIP-41838: New interface added to get the attribute
+ PostManagerDisplayTextBox //EIP-64877: New interface added to get the text input
+};
+
+//EIP 128665 starts
+EFI_STATUS InvalidateBgrtStatusByProtocol (VOID);
+TSE_INVALIDATE_BGRT_STATUS_PROTOCOL gInvalidateBgrtStatus = {InvalidateBgrtStatusByProtocol};
+EFI_STATUS InstallInvalBGRTStatusProtocol (EFI_HANDLE Handle);
+//EIP 128665 ends
+
+EFI_STATUS ShowPostMsgBox(IN CHAR16 *MsgBoxTitle,IN CHAR16 *Message,IN UINT8 MsgBoxType, UINT8 *pSelection);
+
+
+EFI_STATUS ShowPostMsgBoxEx(
+ IN CHAR16 *Title,
+ IN CHAR16 *Message,
+ IN CHAR16 *Legend,
+ IN MSGBOX_EX_CATAGORY MsgBoxExCatagory,
+ IN UINT8 MsgBoxType,
+ IN UINT16 *OptionPtrTokens, // Valid only with MSGBOX_TYPE_CUSTOM
+ IN UINT16 OptionCount, // Valid only with MSGBOX_TYPE_CUSTOM
+ IN AMI_POST_MGR_KEY *HotKeyList, // NULL - AnyKeyPress closes
+ IN UINT16 HotKeyListCount,
+ OUT UINT8 *MsgBoxSel,
+ OUT AMI_POST_MGR_KEY *OutKey
+ );
+EFI_STATUS ShowInfoBox(IN CHAR16 *InfoBoxTitle, IN CHAR16 *Message, IN UINTN TimeLimit, EFI_EVENT *RetEvent);
+
+EFI_STATUS HiiString2BltBuffer( CHAR16 *Message,
+ EFI_UGA_PIXEL Foreground,
+ EFI_UGA_PIXEL Background,
+ OUT UINTN *Width,
+ OUT EFI_UGA_PIXEL **BltBuffer,
+ OUT UINTN *BltGlyphWidth);
+EFI_STATUS DrawHiiStringBltBuffer(CHAR16 *Message, INTN CoOrdX, INTN CoOrdY, CO_ORD_ATTRIBUTE Attribute, EFI_UGA_PIXEL Foreground, EFI_UGA_PIXEL Background);
+EFI_STATUS ShowPostMenu (
+ IN VOID *HiiHandle,
+ IN UINT16 TitleToken,
+ IN UINT16 LegendToken,
+ IN POSTMENU_TEMPLATE *MenuData,
+ IN UINT16 MenuCount,
+ OUT UINT16 *pSelection
+);
+
+EFI_STATUS ShowPostTextBox(
+ IN VOID *HiiHandle,
+ IN UINT16 TitleToken,
+ IN TEXT_INPUT_TEMPLATE *InputData,
+ IN UINT16 ItemCount,
+ IN DISPLAY_TEXT_KEY_VALIDATE DisplayTextKeyValidate
+);
+
+EFI_STATUS ShowPostProgress(
+ IN UINT8 ProgressBoxState,
+ IN CHAR16 *Title,
+ IN CHAR16 *Message,
+ IN CHAR16 *Legend,
+ IN UINTN Percent,
+ IN OUT VOID **Handle,
+ OUT AMI_POST_MGR_KEY *OutKey
+);
+BOOLEAN IsTseBestTextGOPModeSupported (VOID);
+EFI_STATUS SaveCurrentTextGOP ( UINTN *currenttextModeCols, UINTN *currenttextModeRows, UINT32 *currentGOPMode ); //EIP-107833 Fixing proper mode and resolution for post interfaces
+EFI_STATUS RestoreTextGOPMode ( UINTN prevTextModeCols, UINTN prevTextModeRows, UINT32 prevGOPMode ); //EIP-107833 Fixing proper mode and resolution for post interfaces
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: InstallProtocol
+//
+// Description: This function installs different protocols exported.
+//
+// Input: VOID
+//
+// Output: Return Status based on errors that occurred in library
+// functions.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS InstallProtocol( VOID )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->InstallMultipleProtocolInterfaces(
+ &gProtocolHandle,
+ &gAmiPostManagerProtocolGuid, &gPostManagerProtocol,
+#ifdef USE_COMPONENT_NAME
+ &gEfiComponentNameProtocolGuid, &gComponentName,
+#endif
+ NULL
+ );
+ if ( !EFI_ERROR( Status ) )
+ {
+ Status = InstallFormBrowserProtocol(gProtocolHandle);
+ Status = InstallInvalBGRTStatusProtocol (gProtocolHandle);
+ }
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: UninstallProtocol
+//
+// Description: This function uninstalls different protocols exported.
+//
+// Input: VOID
+//
+// Output: VOID
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID UninstallProtocol( VOID )
+{
+ gBS->UninstallMultipleProtocolInterfaces(
+ &gProtocolHandle,
+ &gAmiPostManagerProtocolGuid, &gPostManagerProtocol,
+#ifdef USE_COMPONENT_NAME
+ &gEfiComponentNameProtocolGuid, &gComponentName,
+#endif
+ NULL
+ );
+
+ UnInstallFormBrowserProtocol(gProtocolHandle);
+
+}
+
+VOID SetBootTimeout( EFI_EVENT Event, BOOLEAN *timeout )
+{
+ if ( timeout != NULL )
+ *timeout = TRUE;
+}
+
+VOID AboartFastBootPath(VOID)
+{
+ gBootFlow = BOOT_FLOW_CONDITION_NORMAL;
+ gPostManagerHandshakeCallIndex--;
+ gRT->SetVariable(
+ L"BootFlow",
+ &_gBootFlowGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS,
+ sizeof(gBootFlow),
+ &gBootFlow
+ );
+}
+BOOLEAN IsBootTimeOutValueZero(VOID);
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerHandshake
+//
+// Description: This function is the handshake function to which BDS
+// hands-off.
+//
+// Input: VOID
+//
+// Output: This function never returns. It only boots different
+// options.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerHandshake( VOID )
+{
+ EFI_EVENT timer = NULL;
+ EFI_STATUS Status = EFI_UNSUPPORTED;
+
+ volatile BOOLEAN bootTimeout = FALSE;
+ UINT16 Value = 1;
+ UINT64 TimeoutValue;
+ UINTN size = 0;
+ EFI_GUID AmitseAfterFirstBootOptionGuid = AMITSE_AFTER_FIRST_BOOT_OPTION_GUID;
+ EFI_GUID AmiTseBeforeTimeOutGuid = AMITSE_BEFORE_TIMEOUT_GUID;
+ EFI_GUID AmiTseAfterTimeOutGuid = AMITSE_AFTER_TIMEOUT_GUID;
+ BOOLEAN AfterFirstBootSignalled = FALSE;
+ UINT16 *pBootOrder=NULL;
+ UINT16 u16BootCount = 0,i; //Dont change i data type, in infinite loop it is reinitialized to -1.
+ UINT16 BootNext, *pBootNext = NULL;
+
+ // Performance measurement starta
+ PERF_START (0, AMITSE_TEXT("Boot"), NULL, 0);
+
+ RUNTIME_DEBUG( L"mre" );
+
+ gPostManagerHandshakeCallIndex++;
+
+ if(gPostManagerHandshakeCallIndex!=1)
+ {
+ gEnterSetup = TRUE;
+ goto _ShowMainMenu;
+ }
+
+ PostManagerHandShakeHookHook();
+
+#ifndef STANDALONE_APPLICATION
+ if ( ! gConsoleControl )
+ {
+ //All necessary protocols are not available yet.
+ //We can still proceed if Uga Draw is the only protocol not available yet.
+ ActivateApplication();
+ //EIP-75236
+ if (!IsDelayLogoTillInputSupported())
+ ActivateInput();
+ }
+#endif
+
+ if(!gVariableList)
+ VarLoadVariables( (VOID **)&gVariableList, NULL );
+
+ TimerStopTimer( &gKeyTimer );
+
+ // this *MUST* be run a EFI_TPL_APPLICATION
+ gBS->RaiseTPL( EFI_TPL_HIGH_LEVEL ); // guarantees that RestoreTPL won't ASSERT
+ gBS->RestoreTPL( EFI_TPL_APPLICATION );
+
+ // Performance measurement Pause
+// PERF_END (0,L"Boot", NULL, 0);
+ // Exclude IDEPasswordCheck IDEPasswordCheck that it may get the use input.
+ // IDE password Module takes care of the Password check.
+ //TSEIDEPasswordCheck();
+
+ // Performance measurement continue
+// PERF_START (0, L"Boot", NULL, 0);
+
+ // get the current boot options and languages
+ BootGetBootOptions();
+ BootGetLanguages();
+
+ StyleUpdateVersionString();
+
+ gPostStatus = TSE_POST_STATUS_IN_BOOT_TIME_OUT;
+
+ //EIP 103381 - Providing boot time out value depending on TSE_BOOT_TIME_OUT_AS_ZERO token
+ if(!IsBootTimeOutValueZero())
+ Value = GetBootTimeOut(Value);
+ else
+ Value = 0;
+
+#ifdef STANDALONE_APPLICATION
+ Value = 0;
+ gEnterSetup = TRUE;
+#endif
+
+ if ( Value == 0 )
+ bootTimeout = TRUE;
+
+ if ( !TseIgnoreKeyForFastBoot() ) //EIP-94616
+ {
+ CheckForKeyHook( (EFI_EVENT)NULL, NULL );
+ }
+
+ if((BOOT_FLOW_CONDITION_NORMAL != gBootFlow) || (gEnterSetup==TRUE))
+ {
+ UINT32 condition = BOOT_FLOW_CONDITION_NORMAL;
+ UINT32 *conditionPtr;
+
+ size = 0;
+ conditionPtr = VarGetNvramName( L"BootFlow", &_gBootFlowGuid, NULL, &size );
+ if ( conditionPtr != NULL )
+ condition = *conditionPtr;
+
+ MemFreePointer( (VOID **)&conditionPtr );
+
+ if((condition == BOOT_FLOW_CONDITION_FAST_BOOT) && ((gBootFlow != condition)||(gEnterSetup==TRUE)))
+ {
+ // Take the Normal boot path as Fast boot path is altered by CheckForKeyHook().
+ AboartFastBootPath();
+ return EFI_UNSUPPORTED;
+ }
+
+ if(BOOT_FLOW_CONDITION_NORMAL == condition)
+ {
+ gRT->SetVariable(
+ L"BootFlow",
+ &_gBootFlowGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS,//EIP-73751 BootFlow wil use RS attribute to avoid inconsistent attributes
+ sizeof(UINT32),
+ &gBootFlow
+ );
+ }
+ else
+ gBootFlow = BOOT_FLOW_CONDITION_NORMAL;
+ }
+
+ Status = BootFlowManageEntry();
+ if (Status == EFI_UNSUPPORTED)
+ {
+ Value = 0xFFFF;
+ gDoNotBoot = TRUE;
+ }
+ if(Status == EFI_NOT_STARTED)
+ bootTimeout = TRUE;
+
+ if(gBootFlow == BOOT_FLOW_CONDITION_FAST_BOOT)
+ {
+ UINT32 PasswordInstalled = PasswordCheckInstalled();
+
+ if((gPasswordType == AMI_PASSWORD_NONE) && (PasswordInstalled != AMI_PASSWORD_NONE))
+ {
+ if(CheckSystemPasswordPolicy(PasswordInstalled))
+ {
+ // Take the Normal boot path as Password is installed and not validated by the user yet
+ AboartFastBootPath();
+ return EFI_UNSUPPORTED;
+ }
+ }
+ }
+ else
+ {
+ // Reinit Before Boottimeout So any action can set the boot flow again.
+ gBootFlow = BOOT_FLOW_CONDITION_NORMAL;
+ }
+
+ if ( Value != 0xFFFF )
+ {
+ TimeoutValue = (UINT64) TIMER_TENTH_SECOND;
+ TimeoutValue = MultU64x32( TimeoutValue, (UINT32) Value );
+
+ TimerCreateTimer( &timer, SetBootTimeout, (VOID *)&bootTimeout, TimerRelative, TimeoutValue, EFI_TPL_CALLBACK );
+ }
+
+ // Performance measurement Pause
+ PERF_END (0, AMITSE_TEXT("Boot"), NULL, 0);
+
+ // While the boot timeout has not expired
+ EfiLibNamedEventSignal (&AmiTseBeforeTimeOutGuid);
+ while ( ! bootTimeout )
+ {
+ if ( gEnterSetup || gBootFlow )
+ {
+ bootTimeout = TRUE;
+ continue;
+ }
+ if ( !TseIgnoreKeyForFastBoot() ) //EIP-94616
+ {
+ // check for 'hotkey' actions that would invoke something
+ CheckForKeyHook( (EFI_EVENT)NULL, NULL );
+ }
+
+ TimeOutLoopHookHook();
+ }
+ EfiLibNamedEventSignal (&AmiTseAfterTimeOutGuid);
+
+ // Performance measurement continue
+ PERF_START (0, AMITSE_TEXT("Boot"), NULL, 0);
+
+ TimerStopTimer( &timer );
+
+ if ((!gDoNotBoot) && (gBootFlow))
+ {
+ gRT->SetVariable(
+ L"BootFlow",
+ &_gBootFlowGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS,//EIP-73751 BootFlow wil use RS attribute to avoid inconsistent attributes
+ sizeof(UINT32),
+ &gBootFlow
+ );
+ BootFlowManageEntry();
+ }
+
+_ShowMainMenu:
+
+ if ( gEnterSetup )
+ {
+ // Performance measurement Pause
+ PERF_END (0, AMITSE_TEXT("Boot"), NULL, 0);
+ // Disable access to the post manager protocol display post message functions and to
+ // the switch to post screen functions of post manager protocol
+ gPostMsgProtocolActive = FALSE;
+
+ gPostStatus = TSE_POST_STATUS_ENTERING_TSE;
+ gSetupContextActive = TRUE;
+
+ Status = gST->ConIn->Reset( gST->ConIn, FALSE );
+ Status = MainSetupLoopHook();//EIP74591 : Modified MainSetupLoop as board module hook
+ gSetupContextActive = FALSE;
+
+
+ // Reenable access to the post manager protocol display post message functions and to
+ // the switch to post screen functions of post manager protocol
+ gPostMsgProtocolActive = TRUE;
+ // Performance measurement continue
+ PERF_START (0, AMITSE_TEXT("Boot"), NULL, 0);
+ }
+
+
+ if(gPostManagerHandshakeCallIndex!=1)
+ {
+ // In case of not a first call
+ // Don't do the Boot Manager Work just exit the to caller.
+ gPostManagerHandshakeCallIndex--;
+ return Status;
+ }
+
+ // Pass control to the boot process to handle the selected boot option
+ // if the boot is allowed
+ if (gDoNotBoot)
+ {
+ if(!ItkSupport())
+ {
+ gEnterSetup = TRUE;
+ goto _ShowMainMenu;
+ }
+ else
+ gEnterSetup = FALSE;
+ }
+
+ if(!NoVarStoreSupport())
+ {
+ size = 0;
+ //VarGetNvram( VARIABLE_ID_AMITSESETUP, &size );
+ HelperGetVariable( VARIABLE_ID_AMITSESETUP, (CHAR16 *)NULL, (EFI_GUID *)NULL, NULL, &size );
+
+ if(size < sizeof(AMITSESETUP))
+ {
+ Status = MiniSetupEntry();
+ MiniSetupExit( Status );
+ }
+ }
+
+ gPostStatus = TSE_POST_STATUS_PROCEED_TO_BOOT;
+
+ // LoadDriverOrder(); //EIP: 25799 - Remove Load Driver Option from TSE 2.x as it is handling from Core.
+
+ ProcessProceedToBootHook();
+
+ TSEUnlockHDD();
+
+ if(ItkSupport())
+ BbsItkBoot();
+ else
+ {
+ //Try boot next first
+ size = 0;
+ pBootNext = (UINT16 *)VarGetNvramName(L"BootNext", &gEfiGlobalVariableGuid, NULL, &size);
+ if(pBootNext && (size == sizeof(UINT16)))
+ {
+ BootNext = *pBootNext;
+ //Clear Boot next
+ VarSetNvramName(L"BootNext",
+ &gEfiGlobalVariableGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ pBootNext,
+ 0);
+ if( gBootFlow == BOOT_FLOW_CONDITION_FAST_BOOT) {
+ // FastBoot module normally checks for Bootnext before taking the FastBoot path
+ // If the Boot next is set in FastBoot case then do the full boot.
+ AboartFastBootPath();
+ return Status;
+ }
+ else {
+ BootLaunchBootOption(BootNext, NULL, 0);
+ }
+ }
+
+
+ if(pBootNext)
+ MemFreePointer((void **) &pBootNext);
+
+ size =0 ;
+ pBootOrder = (UINT16 *)VarGetNvramName( L"BootOrder", &gEfiGlobalVariableGuid, NULL, &size );
+
+ #ifdef EFI_NT_EMULATOR
+ if(!pBootOrder || !gBootData)
+ {
+ VarSetNvramName(L"BootOrder",
+ &gEfiGlobalVariableGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ NULL,
+ 0);
+
+ return Status;
+ }
+ #endif
+
+ //Get enabled options count
+ for(u16BootCount=0; u16BootCount<(UINT16)(size/sizeof(UINT16)); u16BootCount++ )
+ {
+ if(!IsPreservedDisabledBootOptionOrder())
+ {
+ BOOT_DATA *pBootData;
+
+ pBootData = BootGetBootData(pBootOrder[u16BootCount]);
+ if(!(pBootData->Active & LOAD_OPTION_ACTIVE))
+ break;
+ }
+ }
+
+ if(!u16BootCount)
+ {
+ //No valid/enabled boot option
+ Status = BootFlowManageExit();
+ //infinite loop
+ while(EFI_NOT_STARTED == Status)
+ {
+ CHAR16 *text = NULL;
+
+ text = HiiGetString( gHiiHandle, STRING_TOKEN(STR_NO_BOOT_OPTIONS));
+ if ( ( text != NULL ) && (gST->ConOut != NULL))
+ gST->ConOut->OutputString(gST->ConOut, text);
+
+ //Wait for key
+ gBS->WaitForEvent( 1, &gST->ConIn->WaitForKey, &size );
+ CheckForKeyHook( (EFI_EVENT)NULL, NULL );
+ if (TRUE == gEnterSetup) //If setup key detects then launch the setup
+ {
+ goto _ShowMainMenu;
+ }
+ Status = BootFlowManageExit (); //EIP: 57660 Condition: If user plugs the any thumb drive after boot then TSE will try to launch the image from that file system using the path efi\boot\bootxxxx.efi
+ if( gBootFlow )//EIP 81549 : Checking for gBootFlow, making gBootFlow to normal such that the key will be consumed in chcekforkey
+ gBootFlow = BOOT_FLOW_CONDITION_NORMAL;
+ }
+ }
+
+ if ( !gEnterSetup )//EIP-86253 If no key is pressed to go to setup then stopping MousePointingDevice and stopping ClickEvents
+ {
+ StopClickEvent();
+ MouseDestroy();
+ }
+ for ( i = 0; i < u16BootCount; i++)
+ {
+ BOOT_DATA *pBootData;
+
+ pBootData = BootGetBootData(pBootOrder[i]);
+
+ if(pBootData == NULL || !(pBootData->Active & LOAD_OPTION_ACTIVE))
+ continue;
+
+ if ( BBSValidDevicePath(pBootData->DevicePath) ) //EIP-93797
+ if ( GetBBSOptionStatus (pBootData) )
+ continue;
+
+ Status = BootLaunchBootOption(pBootOrder[i], pBootOrder+i, u16BootCount - i);
+
+ if ( !AfterFirstBootSignalled )
+ {
+ EfiLibNamedEventSignal ( &AmitseAfterFirstBootOptionGuid );
+
+ if( gBootFlow == BOOT_FLOW_CONDITION_FAST_BOOT) {
+ AboartFastBootPath();
+ return Status;
+ }
+
+ AfterFirstBootSignalled = TRUE;
+ }
+
+ if((i+1) >= u16BootCount)
+ {
+ Status = BootFlowManageExit();
+ if ( EFI_NOT_STARTED == Status )
+ {
+ CheckForKeyHook( (EFI_EVENT)NULL, NULL );
+ if (TRUE == gEnterSetup) //If setup key detects then launch the setup
+ {
+ goto _ShowMainMenu;
+ }
+ // Infinite loop is true so we start again
+ i = -1; //Changed 0 to -1. Then only in next iteration it will be zero otherwise it will be 1.
+ } //If it is i = 0 then it will miss first boot option
+ }
+ }
+
+ }
+#ifndef STANDALONE_APPLICATION
+ gEnterSetup = TRUE;
+ goto _ShowMainMenu;
+#else
+ return Status;
+#endif
+
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerDisplayPostMessage
+//
+// Description: This function is the protocol to display messages in
+// the post screen.
+//
+// Input: CHAR16 *message: Unicode string to be displayed.
+//
+// Output: Return Status based on errors that occurred in library
+// functions.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerDisplayPostMessage( CHAR16 *message )
+{
+ if ( ! gPostMsgProtocolActive )
+ return EFI_UNSUPPORTED;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ return PrintPostMessage(message, TRUE);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerDisplayPostMessageEx
+//
+// Description: This function is the protocol to display messages with
+// attributes in the post screen.
+//
+// Input: CHAR16 *message: Unicode string to be displayed.
+// UINTN Attribute: Attribute for the message
+//
+// Output: Return Status based on errors that occurred in library
+// functions.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerDisplayPostMessageEx( CHAR16 *message, UINTN Attribute )
+{
+ if ( ! gPostMsgProtocolActive )
+ return EFI_UNSUPPORTED;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ switch(Attribute)
+ {
+ case PM_EX_DONT_ADVANCE_TO_NEXT_LINE:
+ return PrintPostMessage(message, FALSE);
+ }
+
+ return EFI_UNSUPPORTED;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerSwitchToPostScreen
+//
+// Description: This function is the protocol to switch to post screen
+//
+// Input: VOID
+//
+// Output: Return Status based on errors that occurred in library
+// functions.
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerSwitchToPostScreen( VOID )
+{
+#ifdef STANDALONE_APPLICATION
+ return EFI_UNSUPPORTED;
+#else
+ if ( ! gPostMsgProtocolActive )
+ return EFI_UNSUPPORTED;
+
+ if ( gQuietBoot )
+ {
+ UpdateGoPUgaDraw();//EIP:50479 : Function to Update gGop before using it in AMITSE.
+#if SETUP_USE_GRAPHICS_OUTPUT_PROTOCOL
+ if (!gGOP)
+#else
+ if (!gUgaDraw)
+#endif
+ return EFI_UNSUPPORTED;//EIP:50479 : Returning unsupported if the GOP is NULL
+
+ gQuietBoot = FALSE;
+ CleanUpLogo();
+ //EIP 28007, FIX: If Post message printed in the Quiteboot by using Set cur position
+ // It is better to flash all the screen.
+ FlushLines( 0, gMaxRows - 1 );
+ DoRealFlushLines(); //EIP-87769
+ InitPostScreen();
+ return EFI_SUCCESS;
+ }
+
+ return EFI_UNSUPPORTED;
+#endif
+}
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerInitProgressBar
+//
+// Description: Initializes the PostManagerProgressBar
+//
+// Input: UINTN x - Column or Left screen position of ProgressBar in pixels
+// UINTN y - Row or Top screen position of ProgressBar in pixels
+// UINTN w - Width of ProgressBar in pixels
+// UINTN h - Height of ProgressBar in pixels
+// UINTN iterate - Total number of iterations or Calls
+// to advanced the progressbar to 100% of the given width.
+// The delta or changed value will be computed.
+//
+// Output: EFI_STATUS status - If the function runs correctly, returns
+// EFI_SUCCESS, else other EFI defined error values.
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS PostManagerInitProgressBar(
+ UINTN x,
+ UINTN y,
+ UINTN w,
+ UINTN h,
+ UINTN iterate)
+{
+ EFI_STATUS Status = 0;
+
+ EFI_UGA_PIXEL *BGColor;
+ EFI_UGA_PIXEL *BDRColor;
+ EFI_UGA_PIXEL *FillColor;
+
+ BGColor = EfiLibAllocateZeroPool(sizeof (EFI_UGA_PIXEL));
+ BDRColor = EfiLibAllocateZeroPool(sizeof (EFI_UGA_PIXEL));
+ FillColor = EfiLibAllocateZeroPool(sizeof (EFI_UGA_PIXEL));
+
+ GetProgressColor(BGColor,BDRColor,FillColor);
+
+ gProgress->delta = w/iterate;
+ gProgress->w = gProgress->delta*iterate;
+ gProgress->h = h;
+ gProgress->x = x;
+ gProgress->y = y;
+ gProgress->backgroundColor = BGColor;
+ gProgress->borderColor = BDRColor;
+ gProgress->fillColor = FillColor;
+ gProgress->quiteBootActive = FALSE ;
+ gProgress->active = TRUE ; // progressbar has been initialized
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerSetProgressBarPosition
+//
+// Description: Increments the PostManagerProgressBar
+//
+// Input: None
+//
+//
+// Output: EFI_STATUS status - If the function runs correctly, returns
+// EFI_SUCCESS, else other EFI defined error values.
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS PostManagerSetProgressBarPosition()
+{
+ EFI_STATUS Status = EFI_SUCCESS;
+ if(gProgress->active)
+ DrawBltProgressBar();
+ else
+ Status = EFI_UNSUPPORTED;
+
+ return Status;
+}
+
+
+
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerSetCursorPosition
+//
+// Description: Wrapper function for SetCurPos
+//
+// Input: UINTN X - Value of the column
+// UINTN Y - Number of row below the last written line
+//
+// Output: EFI_STATUS status - If the function runs correctly, returns
+// EFI_SUCCESS, else other EFI defined error values.
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS PostManagerSetCursorPosition(UINTN X, UINTN Y)
+{
+ return SetCurPos(X,Y);
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerGetCursorPosition
+//
+// Description: Wrapper function for GetCurPos
+// Writes cursor position into given X and Y locations.
+//
+// Input: UINTN *pX - Pointer to storage for current column value
+// UINTN *pY - Pointer to storage for current row value
+//
+// Output: EFI_STATUS status - EFI_SUCCESS if OK,
+// EFI_INVALID_PARAMETER if NULL pointer
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+
+EFI_STATUS PostManagerGetCursorPosition(UINTN *pX, UINTN *pY)
+{
+ return GetCurPos(pX, pY);
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerDisplayMsgBox
+//
+// Description:
+//
+//
+// Input: IN CHAR16 *MsgBoxTitle,
+// IN CHAR16 *Message,
+// IN UINT8 MsgBoxType,
+//
+// Output: EFI_STATUS status and UINT8 MsgBoxSel
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID SaveGraphicsScreen(VOID);
+VOID RestoreGraphicsScreen(VOID);
+EFI_STATUS
+PostManagerDisplayMsgBox (
+ IN CHAR16 *MsgBoxTitle,
+ IN CHAR16 *Message,
+ IN UINT8 MsgBoxType,
+ OUT UINT8 *MsgBoxSel
+ )
+{
+ UINTN currenttextModeCols = 0, currenttextModeRows = 0;
+ UINT32 currentGOPMode = 0;
+
+ EFI_STATUS Status = EFI_UNSUPPORTED;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ if( gPostStatus == TSE_POST_STATUS_IN_POST_SCREEN )
+ SaveGraphicsScreen();
+
+ Status = SaveCurrentTextGOP (&currenttextModeCols, &currenttextModeRows, &currentGOPMode);
+ if (EFI_ERROR(Status))
+ return Status;
+
+ Status = ShowPostMsgBox(MsgBoxTitle, Message, MsgBoxType,MsgBoxSel);
+
+ RestoreTextGOPMode (currenttextModeCols, currenttextModeRows, currentGOPMode);
+
+ if( gPostStatus == TSE_POST_STATUS_IN_POST_SCREEN )
+ RestoreGraphicsScreen();
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerDisplayQuietBootMessage
+//
+// Description: Function for the quit booting display.
+//
+// Input: CHAR16 *Message, INTN CoOrdX, INTN CoOrdY,
+// CO_ORD_ATTRIBUTE Attribute, EFI_UGA_PIXEL Foreground,
+// EFI_UGA_PIXEL Background
+//
+// Output: Status
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+PostManagerDisplayQuietBootMessage(
+ CHAR16 *Message,
+ INTN CoOrdX,
+ INTN CoOrdY,
+ CO_ORD_ATTRIBUTE Attribute,
+ EFI_UGA_PIXEL Foreground,
+ EFI_UGA_PIXEL Background
+ )
+{
+#ifdef STANDALONE_APPLICATION
+ return EFI_UNSUPPORTED;
+#elif defined TSE_FOR_APTIO_4_50
+ UINTN BltGlyphWidth=0;
+ EFI_UGA_PIXEL *BltBuffer=NULL;
+ UINTN BltIndex;
+ EFI_STATUS Status = EFI_SUCCESS;
+ UINTN SizeOfX, SizeOfY;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ UpdateGoPUgaDraw();//EIP:50479 : Function to Update gGop before using it in AMITSE.
+ if(EFI_SUCCESS != HiiInitializeProtocol())
+ return EFI_UNSUPPORTED;
+
+ if(
+ (EFI_SUCCESS != GetScreenResolution(&SizeOfX, &SizeOfY))||
+ (!gQuietBoot)
+ )
+ return EFI_UNSUPPORTED;
+
+ if ((Message != NULL) && (EfiStrLen(Message) == 0))
+ return EFI_SUCCESS;
+ BltIndex = 0;
+
+ Status = HiiString2BltBuffer(Message,Foreground,Background,&BltIndex,&BltBuffer,&BltGlyphWidth);
+ if(Status == EFI_SUCCESS)
+ DrawBltBuffer(BltBuffer, Attribute, BltIndex, HiiGetGlyphHeight(), CoOrdX, CoOrdY, BltGlyphWidth);
+
+ //Free BltBuffer
+ MemFreePointer((VOID **)&BltBuffer);
+
+ return Status;
+#else
+// For EDK Nt32 support.
+// Status = DrawHiiStringBltBuffer(Message, CoOrdX, CoOrdY, Attribute, Foreground, Background);
+ return EFI_UNSUPPORTED;
+#endif
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerGetPostStatus
+//
+// Description: Function returns current Post status.
+//
+// Input: none
+//
+// Output: One of the TSE_POST_STATUS
+// TSE_POST_STATUS_BEFORE_POST_SCREEN - TSE Loaded and yet goto post screen
+// TSE_POST_STATUS_IN_POST_SCREEN - In the post screen
+// TSE_POST_STATUS_IN_QUITE_BOOT_SCREEN- In the quite boot screen
+// TSE_POST_STATUS_IN_BOOT_TIME_OUT - Witing for Boot timeout
+// TSE_POST_STATUS_ENTERING_TSE - Entering TSE
+// TSE_POST_STATUS_IN_TSE - Inside TSE
+// TSE_POST_STATUS_IN_BBS_POPUP - Inside BBS Poupup
+// TSE_POST_STATUS_PROCEED_TO_BOOT - Outside TSE and Booting or in Shell
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+TSE_POST_STATUS PostManagerGetPostStatus(VOID)
+{
+ return gPostStatus;
+}
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PostManagerDisplayInfoBox
+//
+// Description: Function to display the Information box
+//
+// Input: none
+//
+// Output: One of the TSE_POST_STATUS
+// TSE_POST_STATUS_BEFORE_POST_SCREEN - TSE Loaded and yet goto post screen
+// TSE_POST_STATUS_IN_POST_SCREEN - In the post screen
+// TSE_POST_STATUS_IN_QUITE_BOOT_SCREEN- In the quite boot screen
+// TSE_POST_STATUS_IN_BOOT_TIME_OUT - Witing for Boot timeout
+// TSE_POST_STATUS_ENTERING_TSE - Entering TSE
+// TSE_POST_STATUS_IN_TSE - Inside TSE
+// TSE_POST_STATUS_IN_BBS_POPUP - Inside BBS Poupup
+// TSE_POST_STATUS_PROCEED_TO_BOOT - Outside TSE and Booting or in Shell
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+PostManagerDisplayInfoBox( IN CHAR16 *InfoBoxTitle,
+ IN CHAR16 *InfoString,
+ IN UINTN Timeout,
+ OUT EFI_EVENT *Event
+ )
+{
+ UINTN currenttextModeCols = 0, currenttextModeRows = 0;
+ UINT32 currentGOPMode = 0;
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ Status = SaveCurrentTextGOP (&currenttextModeCols, &currenttextModeRows, &currentGOPMode);
+
+ if ( EFI_ERROR(Status) )
+ return Status;
+
+ Status = ShowInfoBox(InfoBoxTitle, InfoString, Timeout, Event);
+
+ RestoreTextGOPMode (currenttextModeCols, currenttextModeRows, currentGOPMode);
+
+ return Status;
+
+}
+
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerSetAtribute
+//
+// Description: Function to set color
+//
+// Input: UINT8 Attrib - Text color
+//
+//
+// Output: EFI_STATUS status - If the function runs correctly, returns
+// EFI_SUCCESS, else other EFI defined error values.
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerSetAttribute(UINT8 Attrib)
+{
+ gPostMgrAttribute = Attrib ;
+ return EFI_SUCCESS ;
+}
+//EIP-41838: New interface to get the attribute using AMI Post Manager Protocol
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerGetAttribute
+//
+// Description: Function to Get color
+//
+// Input: UINT8 *Attrib - Pointer to get Text color
+//
+//
+// Output: EFI_STATUS status - If the function runs correctly, returns
+// EFI_SUCCESS, else other EFI defined error values.
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerGetAttribute(UINT8 *Attrib)
+{
+ *Attrib = gPostMgrAttribute ;
+ return EFI_SUCCESS ;
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerDisplayMsgBoxEx
+//
+// Description: Wrapper function for Display OEM Message box.
+//
+//
+// Input: IN CHAR16 *MsgBoxTitle - Caption of the Message Box
+// IN CHAR16 *Message - String to be displayed by the Message Box
+// IN CHAR16 *Legend - Legend String to be displayed by the Message Box
+// IN UINT8 MsgBoxType - Message Box type
+//
+// Output: EFI_STATUS status - EFI_SUCCESS if OK,
+// EFI_INVALID_PARAMETER if NULL pointer
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerDisplayMsgBoxEx (
+ IN CHAR16 *Title,
+ IN CHAR16 *Message,
+ IN CHAR16 *Legend,
+ IN MSGBOX_EX_CATAGORY MsgBoxExCatagory,
+ IN UINT8 MsgBoxType,
+ IN UINT16 *OptionPtrTokens, // Valid only with MSGBOX_TYPE_CUSTOM
+ IN UINT16 OptionCount, // Valid only with MSGBOX_TYPE_CUSTOM
+ IN AMI_POST_MGR_KEY *HotKeyList, // NULL - AnyKeyPress closes
+ IN UINT16 HotKeyListCount,
+ OUT UINT8 *MsgBoxSel,
+ OUT AMI_POST_MGR_KEY *OutKey
+)
+{
+ UINTN currenttextModeCols = 0, currenttextModeRows = 0;
+ UINT32 currentGOPMode = 0;
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ Status = SaveCurrentTextGOP (&currenttextModeCols, &currenttextModeRows, &currentGOPMode);
+
+ if ( EFI_ERROR(Status) )
+ return Status;
+
+ Status = ShowPostMsgBoxEx (Title, Message, Legend, MsgBoxExCatagory,
+ MsgBoxType, OptionPtrTokens, OptionCount,
+ HotKeyList, HotKeyListCount, MsgBoxSel, OutKey
+ );
+
+ RestoreTextGOPMode (currenttextModeCols, currenttextModeRows, currentGOPMode);
+
+ return Status;
+}
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerDisplayProgress
+//
+// Description: Wrapper function for Display OEM Message box.
+//
+//
+// Input: IIN UINTN Percent - Percent Complete
+//
+// Output: EFI_STATUS status - EFI_SUCCESS if OK,
+// EFI_INVALID_PARAMETER if NULL pointer
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerDisplayProgress (
+ IN UINT8 ProgressBoxState,
+ IN CHAR16 *Title,
+ IN CHAR16 *Message,
+ IN CHAR16 *Legend,
+ IN UINTN Percent, // 0 - 100
+ IN OUT VOID **Handle, //Out HANDLE. Valid Handle for update and close
+ OUT AMI_POST_MGR_KEY *OutKey //Out Key
+)
+{
+ EFI_STATUS Status = EFI_UNSUPPORTED;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ Status = ShowPostProgress( ProgressBoxState, Title, Message, Legend, Percent, Handle, OutKey) ;
+ return Status ;
+}
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerDisplayMenu
+//
+// Description: Wrapper function for Display Menu.
+//
+//
+// Input: IN VOID *HiiHandle, - Handle that contains String
+// IN UINT16 TitleToken, - Menu Title Token
+// IN UINT16 LegendToken, - Menu Legend Token
+// IN POSTMENU_TEMPLATE *MenuData, - Menu Items to be displayed
+// IN UINT16 MenuCount, - Number of Menu items
+// OUT UINT16 *pSelection - Menu selection (DEFAULT)
+//
+// Output: EFI_STATUS status - EFI_SUCCESS if OK,
+// EFI_INVALID_PARAMETER if NULL pointer
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS PostManagerDisplayMenu (
+ IN VOID *HiiHandle,
+ IN UINT16 TitleToken,
+ IN UINT16 LegendToken,
+ IN POSTMENU_TEMPLATE *MenuData,
+ IN UINT16 MenuCount,
+ OUT UINT16 *pSelection
+)
+{
+ UINTN currenttextModeCols = 0, currenttextModeRows = 0;
+ UINT32 currentGOPMode = 0;
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ if(gPostStatus < TSE_POST_STATUS_IN_BOOT_TIME_OUT)
+ return EFI_NOT_READY;
+
+ Status = SaveCurrentTextGOP (&currenttextModeCols, &currenttextModeRows, &currentGOPMode);
+
+ if ( EFI_ERROR(Status) )
+ return Status;
+
+ Status = ShowPostMenu(HiiHandle, TitleToken, LegendToken, MenuData, MenuCount, pSelection);
+
+ RestoreTextGOPMode (currenttextModeCols, currenttextModeRows, currentGOPMode);
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: PostManagerDisplayTextBox
+//
+// Description: Function to display text entry interface
+//
+//
+// Input: IN VOID *HiiHandle,
+// IN UINT16 TitleToken,
+// IN TEXT_INPUT_TEMPLATE *InputData,
+// IN UINT16 ItemCount,
+// IN DISPLAY_TEXT_KEY_VALIDATE ValidateKeyFunc
+//
+// Output: EFI_STATUS
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS
+PostManagerDisplayTextBox (
+ IN VOID *HiiHandle,
+ IN UINT16 TitleToken,
+ IN TEXT_INPUT_TEMPLATE *InputData,
+ IN UINT16 ItemCount,
+ IN DISPLAY_TEXT_KEY_VALIDATE ValidateKeyFunc
+ )
+{
+ UINTN currenttextModeCols = 0, currenttextModeRows = 0;
+ UINT32 currentGOPMode = 0;
+ EFI_STATUS Status = EFI_UNSUPPORTED;
+
+ if (NULL == gST->ConOut)
+ return EFI_NOT_READY;
+
+ Status = SaveCurrentTextGOP (&currenttextModeCols, &currenttextModeRows, &currentGOPMode);
+
+ if ( EFI_ERROR(Status) )
+ return Status;
+
+ Status = ShowPostTextBox(HiiHandle, TitleToken, InputData, ItemCount, ValidateKeyFunc);
+
+ RestoreTextGOPMode (currenttextModeCols, currenttextModeRows, currentGOPMode);
+
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: StopClickEvent
+//
+// Description: Function to Stop the Click Event
+//
+// Input: VOID
+//
+// Output: VOID
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID StopClickEvent(VOID)
+{
+ if(gClickTimer)
+ {
+ gBS->SetTimer ( gClickTimer,TimerCancel,0);
+ TimerStopTimer( &gClickTimer );
+ }
+}
+
+//EIP 128665 starts
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name: InvalidateBgrtStatusByProtocol
+//
+// Description: Protocol interface to invalidate BGRT status
+//
+//
+// Input: VOID
+//
+//
+// Output: EFI_STATUS
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID InvalidateStatusInBgrtWrapper (VOID);
+EFI_STATUS InvalidateBgrtStatusByProtocol (VOID)
+{
+ InvalidateStatusInBgrtWrapper();
+ return EFI_SUCCESS;
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+//
+// Procedure: InvalidateBGRTStatusProtocol
+//
+// Description: Install Invalidate BGRT status protocol
+//
+// Parameter: EFI_HANDLE Handle
+//
+// Return value:EFI_STATUS
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS InstallInvalBGRTStatusProtocol (EFI_HANDLE Handle)
+{
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gTSEInvalidateBgrtStatusProtocolGuid,
+ &gInvalidateBgrtStatus,
+ NULL
+ );
+
+ return Status;
+}
+//EIP 128665 ends
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name : SaveCurrentTextGOP
+//
+// Description : Function to Save current TextMode and GOP
+//
+// Input : UINTN currentTextModCols, UINTN currentTextModRows, UINT32 currentGOPMode
+//
+// Output : EFI_STATUS
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS SaveCurrentTextGOP ( UINTN *currenttextModeCols, UINTN *currenttextModeRows, UINT32 *currentGOPMode )
+{
+
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if ( IsTseBestTextGOPModeSupported() && TSE_POST_STATUS_IN_TSE != gPostStatus )
+ {
+ if (gGOP)
+ {
+ *currentGOPMode = gGOP->Mode->Mode;
+ }
+
+ if (TSE_BEST_HORIZONTAL_RESOLUTION != gGOP->Mode->Info->HorizontalResolution || TSE_BEST_VERTICAL_RESOLUTION != gGOP->Mode->Info->VerticalResolution)
+ {
+ SetScreenResolution(TSE_BEST_HORIZONTAL_RESOLUTION,TSE_BEST_VERTICAL_RESOLUTION); //If any postinterface is invoked during QuietBoot
+ }
+
+ Status = gST->ConOut->QueryMode( gST->ConOut, gST->ConOut->Mode->Mode, currenttextModeCols, currenttextModeRows);
+ if (EFI_ERROR(Status))
+ return EFI_NOT_FOUND;
+
+ if ((STYLE_FULL_MAX_COLS != *currenttextModeCols) || (STYLE_FULL_MAX_ROWS != *currenttextModeRows))
+ {
+ gMaxRows = STYLE_FULL_MAX_ROWS;
+ gMaxCols = STYLE_FULL_MAX_COLS;
+ SetDesiredTextMode ();
+ }
+ }
+ return Status;
+}
+
+//<AMI_PHDR_START>
+//--------------------------------------------------------------------------
+//
+// Name : RestoreTextGOPMode
+//
+// Description : Function to Save current TextMode and GOP
+//
+// Input : UINTN currentTextModCols, UINTN currentTextModRows, UINT32 currentGOPMode
+//
+// Output : EFI_STATUS
+//
+//--------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS RestoreTextGOPMode ( UINTN prevTextModeCols, UINTN prevTextModeRows, UINT32 prevGOPMode )
+{
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ if ( IsTseBestTextGOPModeSupported() && TSE_POST_STATUS_IN_TSE != gPostStatus )
+ {
+ if ( (gMaxRows != prevTextModeRows) || (gMaxCols != prevTextModeCols) )
+ {
+ gMaxRows = prevTextModeRows;
+ gMaxCols = prevTextModeCols;
+ SetDesiredTextMode (); //Restoring to previous textmode if any changed
+ }
+
+ if (gGOP && prevGOPMode != gGOP->Mode->Mode)
+ {
+ Status = gGOP->SetMode (gGOP, prevGOPMode); //In some case changing text mode will change the graphcis mode, so reverting here.
+ }
+ }
+ return Status;
+}
+//EIP-107833 END
+
+//**********************************************************************
+//**********************************************************************
+//** **
+//** (C)Copyright 2014, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//**********************************************************************
+//**********************************************************************