diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Core/EM/FastBoot | |
download | zprj-master.tar.xz |
Diffstat (limited to 'Core/EM/FastBoot')
26 files changed, 8350 insertions, 0 deletions
diff --git a/Core/EM/FastBoot/FastBoot.c b/Core/EM/FastBoot/FastBoot.c new file mode 100644 index 0000000..1021e72 --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.c @@ -0,0 +1,4537 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBoot.c 58 8/06/13 10:42p Simonchen $ +// +// $Revision: 58 $ +// +// $Date: 8/06/13 10:42p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBoot.c $ +// +// 58 8/06/13 10:42p Simonchen +// [TAG] EIP130731 +// [Category] Improvement +// [Description] Use file system protocol to check boot loader. +// [Files] FastBoot.c +// +// 57 7/17/13 2:59a Simonchen +// [TAG] EIP125309 +// [Category] New Feature +// [Description] Add function to make sure before boot to OS, BIOS is in +// fastboot path. +// [Files] FastBoot.sdl +// FastBootTseHook.c +// FastBoot.c +// FastBoot.h +// +// 56 7/14/13 10:10p Simonchen +// [TAG] EIP118901 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] The Rumtime Memory Allocation in SmiVariable Module may +// cause S4 Resume Failure +// [RootCause] Memory mapping changed between Normal Boot Path and +// FastBoot Path if SmiVariable is enabled +// [Solution] Publish HII data in fastboot path. +// [Files] FastBoot.c +// +// 55 7/11/13 10:10p Simonchen +// [TAG] EIP126196 +// [Category] Bug Fix +// [Severity] Minor +// [Symptom] If set two HDD password and use Raid mode, fastboot will +// fail. +// [RootCause] Because when AHCI driver unlock first HDD, Raid driver +// will try to read all HDD, but second HDD is still lock, so access will +// fail. +// [Solution] Make sure all HDD unlock then Raid can access HDD. +// And add "Support Raid Driver" token to control fastboot support Raid +// feature or not. +// [Files] FastBoot.c +// FastBoot.sd +// FastBoot.sdl +// FastBootRuntime.c +// FastBoot.h +// +// 54 4/18/13 5:39a Simonchen +// [TAG] EIP113454 +// [Category] New Feature +// [Description] This eip is created for implement or experiment for +// Intel raid mode on fastboot. +// [Files] FastBoot.sdl +// FastBootRuntime.c +// FastBoot.c +// FastBoot.sd +// FastBoot.uni +// +// 53 1/15/13 1:50a Bibbyyeh +// Boot variables is in upper case from version 4.6.4.1. +// +// 52 1/07/13 2:04a Bibbyyeh +// [TAG] EIP111095 +// [Category] Improvement +// [Description] Win8 will create "WINDOWS BOOT MANAGER" and change this +// boot option as the highest boot priority when first time boot into +// Win8. It may cause fast boot fail because boot order is changed by OS. +// To avoid this problem, we check devcie path again if boot option number +// is check failure. +// [Files] FastBoot.c +// +// 51 12/21/12 2:38a Bibbyyeh +// [TAG] EIP110027 +// [Category] Improvement +// [Description] The parameter BootPolicy should NOT set as TRUE when +// load image if this loading is not for boot. +// [Files] FastBoot.c +// +// 50 12/12/12 2:59a Bibbyyeh +// [TAG] EIP107729 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] When fastboot enable, the floppy disk driver can¡¦t +// detect by OS(already test on Win7 32 and 64(not UEFI)) +// [RootCause] BIOS didn't install INT13 service for floppy. +// [Solution] Don't set bbs priority of floppy as BBS_IGNORE_ENTRY, +// set as BBS_DO_NOT_BOOT_FROM. +// [Files] FastBoot.c +// +// 49 11/29/12 9:30p Bibbyyeh +// [Description] Fix build error because AMI_AMT_BOOT_OPTION_GUID is not +// found on non-Intel platforms. +// [Files] FastBoot.c +// +// 48 10/30/12 3:13a Bibbyyeh +// [TAG] EIP105175 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] USB controller does not skip in Fast Boot path when set +// USB support as disabled. +// [RootCause] The Runtime flag is set too early, and it make USB +// controller connect again when TSE call ReadKeyStroke. +// [Solution] Set Runtime flag just before boot into image or legacy +// environment to make sure the ReadKeyStroke is called by OS, not BIOS. +// [Files] FastBoot.c +// +// 47 10/11/12 2:34a Bibbyyeh +// [TAG] EIP103422 +// [Category] Improvement +// [Description] FastBoot behavior is conflict with Fixed boot order. +// System cannot Enter windows 7 most of the time and will just show the +// message no bootable device found. +// [Files] FastBoot.c +// +// 46 10/04/12 11:52p Bibbyyeh +// [TAG] EIP102931 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] When issue the Local HDD Boot from WebUI, sometimes the +// BIOS can't boot from Local Hard Disk drive and enter BIOS setup. +// [RootCause] It's possible AMT boot device is skipped in fast boot +// path, and enter setup. +// [Solution] If AMT boot is request, boot with normal boot path and +// set Setup boot flow as BOOT_FLOW_CONDITION_NORMAL. +// [Files] FastBoot.c FastBoot.sdl +// +// 45 9/06/12 8:01a Bibbyyeh +// The definition in USB_SKIP_LIST is changed from bNotUsed to bFlag. +// +// 44 9/06/12 6:20a Bibbyyeh +// [TAG] EIP100342 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] System hangs if remove monitor cable (D-SUB\DVI\HDMI) +// when FastBoot enabled. +// [RootCause] When monitor cable is removed ,there is no simple text +// out protocol installed for ConOut service in fastboot mode. +// [Solution] Signal CONSOLE_OUT_DEVICES_STARTED_PROTOCOL_GUID and +// install simple text out protocol even if there is no ConOut devcie. +// [Files] FastBoot.c +// +// 43 9/06/12 3:41a Bibbyyeh +// [TAG] EIP96292 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] Bitlock test failure when fast boot enabled and USB +// support is as "partial initial". +// [RootCause] Usb key can NOT be connected by Windows successfully. +// [Solution] Usb module provides the policy control for USB mass +// storage driver enabled/disabled dynamically. +// +// 42 8/28/12 11:58p Bibbyyeh +// Consider fast boot failed case, chagne boot flow back to +// BOOT_FLOW_CONDITION_NORMAL. +// +// 41 8/27/12 6:08a Bibbyyeh +// Fixed the logic of IsFastBoot elink. System only enter FastBoot path +// when all the IsFastBoot elinks return TRUE. +// +// 40 8/24/12 1:09a Bibbyyeh +// Fixed the logic of IsFastBoot elink. System only enter FastBoot path +// when all the IsFastBoot elinks return TRUE. +// +// 39 8/23/12 6:07a Bibbyyeh +// Modify Dp macro and add a flag "InFastBootPath". +// +// 38 8/22/12 5:42a Bibbyyeh +// [TAG] EIP95568 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] SATA HDD device is not found under UEFI Shell when SATA +// mode is RAID +// [RootCause] RAID controller is not connected in fast boot path. +// [Solution] Connect RAID controller in ConnectAllSATADevices +// procedure. +// [Files] FastBoot.c +// +// 37 8/16/12 1:27a Bibbyyeh +// Refine the code base and add Dp macro. +// +// 36 8/10/12 6:00a Bibbyyeh +// [TAG] EIP97474 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] Some ConIn devices are not workable in fastboot path. +// [RootCause] Some handles are not connectted in FbConnectEverything. +// [Solution] Connect all handles and only skip the devices we +// expected. +// [Files] FastBoot.c FastBoot.sdl +// +// 35 8/10/12 3:23a Bibbyyeh +// [TAG] EIP96276 +// [Category] New Feature +// [Description] Function request for PTT_12 +// EIP96276.2 Fixed USB skip table issue. +// EIP96276.3 Add token ¡¥CONNECT_ALL_SATA_DEVICE_IN_FASTBOOT¡¦ to +// gFastBootPolicy. +// EIP96276.4 Add IsValidFBBootOptionPtr support by driver type. Exp : usb +// type skip or other type +// EIP96276.5 Add token ¡¥Test mode¡¨ to gFastBootPolicy Setup menu. +// EIP96276.6 Disable Tse Hotkey support in fastboot path. +// EIP96276.7 Modify TRACE message. +// [Files] FastBoot.c FastBoot.sd FastBoot.sdl FastBoot.uni +// FastBootRuntime.c FastBootProtocol.c +// +// 34 8/07/12 4:40a Bibbyyeh +// [TAG] EIP97545 +// [Category] Improvement +// [Description] Updated PTT Module to Implement Support for +// Initializing the Keyboard in First Call of Readkeystroke on Fastboot. +// [Files] FastBoot.c FastBoot.h FastBootProtocol.h +// +// 33 6/27/12 4:21a Bibbyyeh +// [TAG] EIP93038 +// [Category] New Feature +// [Description] Ability to customize fast boot boot option selection +// [Files] FastBoot.c FastBoot.h FastBoot.sdl +// +// 32 6/22/12 2:49a Bibbyyeh +// [TAG] EIP91458 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] System hangs if USB LAN is first boot priority +// [RootCause] USB LAN is identified as USB Hdd, and it cause fast +// boot behavior wrong. +// [Solution] Add checking rule for USB LAN, this kind of device +// would not be the fast boot device. +// [Files] FastBoot.c +// +// 31 6/13/12 8:49a Bibbyyeh +// Add checking Built in Shell device path when building Fast Efi Boot +// Option. +// +// 30 6/12/12 10:15p Bibbyyeh +// Add a item "Auto" for fastboot "VGA Support". Only install Legacy OpRom +// only when previous boot is Legacy OS. +// +// 29 6/07/12 7:42a Bibbyyeh +// [TAG] EIP91800 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] The USB_SKIP_LIST which in the SBDXE.c in the routing +// ¡§sbUsbProtocolCallback¡¨ is not working. +// [RootCause] UsbSkipTable is updated by PTT module +// [Solution] Backup SkipTable pointer before set new skip table in +// Fastboot path. If return to normal boot mode, restore the skip table +// pointer to backup one. +// [Files] FastBoot.c +// +// 28 6/04/12 4:34a Bibbyyeh +// Compliant with Core 4.6.4.0 +// +// 27 6/01/12 7:04a Bibbyyeh +// [TAG] EIP90455 +// [Category] New Feature +// [Description] PTT improvement - fastboot policy protocol for dynamic +// control fast boot behavior. +// [Files] FastBoot.c FastBoot.sdl FastBoot.sd FastBoot.uni +// FastBootRuntime.c FastBootTseHook.c FastBootProtocol.h FastBoot.h +// +// 26 5/29/12 3:19a Bibbyyeh +// [TAG] EIP87390 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] TCG Bitlocker Driver Encryption error if set the Fast +// boot enable +// [RootCause] USB INT13 service is not installed and Pci OpRom is not +// measured by TPM in fastboot path. +// [Solution] Set USB device priority as BBS_DO_NOT_BOOT_FROM for +// install int13 service. Raise TPL as TPL_HIGH_LEVEL for invoking TPM +// callback function "OnPciIOInstalled". +// [Files] FastBoot.h +// +// 25 4/13/12 4:17a Bibbyyeh +// [TAG] EIP86159 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] SUT can't be unlock by network when FastBoot enabled, +// it always needs to input PIN code and recovery key even connected to +// WDS Server. +// [RootCause] Network stack protocol didn't install in fastboot path. +// [Solution] Connect Network device and install network stack +// protocol. +// [Files] FastBoot.c +// +// 24 4/11/12 6:12a Bibbyyeh +// [TAG] EIP87526 +// [Category] New Feature +// [Description] Fastboot from specific device without recording device +// infomration from previous boot +// [Files] FastBoot.c +// +// 23 4/10/12 9:08a Bibbyyeh +// Fix a typo for pervious check in. +// +// 22 4/10/12 8:47a Bibbyyeh +// [TAG] EIP87452 +// [Category] Improvement +// [Description] 1. Create an elink "ReturnNormalMode", OEM/ODM can link +// their procedure to handle the fastboot failure case. 2. Disconnect USB +// controller when return to normal mode. +// [Files] FastBoot.c FastBoot.h FastBoot.mak FastBoot.sdl +// +// 21 4/09/12 9:09a Bibbyyeh +// [Category] Improvement +// [Description] Replace procedure "FbAllDriverConnect" by elink +// "CallTheDispatcher" and "SignalAllDriversConnectedEvent". +// [Files] FastBoot.c FastBoot.sdl +// +// 20 3/22/12 6:42a Bibbyyeh +// [TAG] EIP86042 +// [Category] Improvement +// [Description] For Win8 seamless boot, BIOS should not clear screen +// when boot into OS. +// [Files] FastBoot.c +// +// 19 3/22/12 3:19a Bibbyyeh +// [TAG] EIP85135 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] When enabled XHCI support difficult into setup menu +// [RootCause] Usb addon is not connected successfully when connect +// Console In devices. +// [Solution] Create FbConnectEverything procedure to connect usb +// controller. +// [Files] FastBoot.c FastBoot.sdl +// +// 18 1/29/12 11:34p Bibbyyeh +// [TAG] EIP75969 +// [Category] Improvement +// [Description] Moved signaling of ReadyToBoot event on EFI boot path +// before call to LoadImage as per UEFI spec. +// [Files] FastBoot.c +// +// 17 11/21/11 5:41a Bibbyyeh +// [TAG] EIP75718 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] After reboot 2 times, system will show error message +// and hang up if enabled Fast boot with skip VGA +// [RootCause] In SG mode, fastboot need to consider mutli VGA case. +// [Solution] Disable PCI VGA device when check or install VGA rom +// failure. +// [Files] FastBoot.c +// +// 16 10/25/11 2:16a Bibbyyeh +// [TAG] EIP73019 +// [Category] Improvement +// [Description] Code logic improvment, 'Index' used on line 1489, +// conditionally not set +// [Files] FastBoot.c +// +// 15 10/25/11 2:12a Bibbyyeh +// [TAG] EIP71257 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] SugarBay got build errors if TSE is disabled. +// [RootCause] TSE_MAJOR and TSE_MINOR are not defined when TSE is +// disabled. +// [Solution] Add define for TSE_MINOR and TSE_MAJOR if they are not +// defined. +// [Files] FastBoot.c +// +// 14 9/08/11 5:26a Bibbyyeh +// [TAG] EIP68329 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] OS can't back to desktop correctly after resumed from +// S3. +// [RootCause] TSEIDEPasswordFreezeDevices is skipped in fastboot path +// if SKIP_TSE_HANDSHAKE is enabled. +// [Solution] Call TSEIDEPasswordFreezeDevices after ReadyToBoot +// Event in fastboot path. +// [Files] FastBoot.c FastBootProtocol.h FastBootTseHook.c +// +// 13 8/04/11 8:10a Bibbyyeh +// [TAG] EIP62845 +// [Category] New Feature +// [Description] Connect all Sata devices in fastboot path. +// [Files] FastBoot.c FastBoot.mak FastBoot.sdl +// +// 12 7/07/11 10:07a Bibbyyeh +// [TAG] EIP63924 +// [Category] Improvement +// [Description] +// 1. Add elink for FastBoot mode change, default checking rule is check +// post hotkey. +// 2. Timer call back for check hotkey is not necessary. Create a protocol +// for calling checkforkey in TSE. +// 3. Since EIP68383 improve the performance of ps2 keyboard, we don't +// need to exchange the initial order of ConIn/ConOut for getting more +// time to detect hotkey. +// [Files] FastBoot.sdl FastBoot.mak FastBoot.c FastBootTseHook.c +// FastBoot.h FastBootProtocol.h +// +// 11 6/22/11 11:45p Bibbyyeh +// [TAG] EIP62683 +// [Category] New Feature +// [Description] Add an Elink after AllDriverConnect in fastboot path +// [Files] FastBoot.c FastBoot.sdl FastBoot.mak +// +// 10 5/30/11 4:34a Bibbyyeh +// [TAG] EIP60794 +// [Category] Improvement +// [Description] Post Time Tuning eModule improvement for CSP. +// 1. Clear screen before boot into shell and enable +// cursor. +// 2. Move Fastboot.h to include folder. +// [Files] FastBoot.c +// FastBoot.cif +// FastBootIncludes.cif +// +// 9 3/17/11 7:18a Bibbyyeh +// [TAG] EIP56151 +// [Category] Improvement +// [Description] PTT eModule has several compiled errors if CSM eModule +// is removed, that must be solved. +// [Files] FastBoot.c FastBoot.sd +// +// 8 3/11/11 10:01p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +// 7 2/22/11 4:06a Bibbyyeh +// [TAG] EIP54286 +// [Category] Improvement +// [Description] Add elink for IsFastBoot Function to overwirte it, it +// can help OEM/ODM to implement their "FAST BOOT" feature easily. +// [Files] FastBoot.sdl FastBoot.mak FastBoot.c +// +// 6 11/26/10 12:10a Bibbyyeh +// [TAG] EIP48698 +// [Category] Bug Fix +// [Severity] Critical +// [Symptom] CPU exception when all ConIn are skipped. +// [RootCause] It's side effect of "EIP48698". "FBTimerCallback" is +// called when pBS-> ConIn is Null. +// [Solution] Move "FBTimerCallback" to after +// "InstallDummySimpleTextProtocol" to make sure pBS->Con is not Null. +// [Files] FastBoot.c +// +// 5 11/22/10 7:49a Bibbyyeh +// [TAG] EIP48698 +// [Category] Improvement +// [Description] For improving success ratio of mode change by hotkey. +// Move some work into PTT module, it can make BIOS have more time to +// detect hotkey. 1.Install and execute VGA OpRom in PTT module. 2.Replace +// the order of connect ConIn/ConOut. +// [Files] FastBoot.c +// +// 4 11/17/10 9:43a Bibbyyeh +// [TAG] EIP47397 +// [Category] Improvement +// [Description] 1. Move all console related functions into PTT module +// to avoid uncompatible with different core version. +// 2. Install dumy SimpleTextCoin protocol when pBS->ConIn & pBS-ConOut is +// Null. +// 3. Raise timer call back as TPL_HIGH_LEVEL level, it will give BIOS +// more chance to mode change successfully. +// 4. Remove FASTBOOT_CONSOLE_SETTING token.Add setup option for fastboot +// setting, "Skip VGA", "Skip USB", Skip "PS2". +// [Files] FastBoot.c +// FastBoot.h +// FastBoot.sd +// FastBoot.sdl +// FastBoot.uni +// +// 3 10/22/10 8:26a Bibbyyeh +// [TAG] EIP46688 +// [Category] Bug Fix +// [Severity] Critical +// [Symptom] After dd PTT moduel and enable fast boot, the system will +// have a CPU exception 0xOD error during POST +// [RootCause] The root cause is EFI_COMPONENT_NAME_PROTOCOL_GUID and +// EFI_COMPONENT_NAME2_PROTOCOL_GUID is used in different UEFI version. +// [Solution] Add UEFU versrion checking rule to avoid this problem. +// [Files] fastboot.c +// +// 2 10/13/10 5:08a Bibbyyeh +// Replace BeforeFastBoot to BeforeFastBootHook to solve build error +// +// 1 10/12/10 9:04a Bibbyyeh +// Initial check in +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBoot.c +// +// Description: +// Implementation of fast boot functionality +// +//<AMI_FHDR_END> +//************************************************************************* + +//============================================================================ +// Includes +//============================================================================ + +#include <Token.h> +#include <AmiDxeLib.h> +#include <Setup.h> +#include <Protocol/BlockIo.h> +#include <Protocol/LoadedImage.h> + +#include <Protocol/PciRootBridgeIo.h> +#include <Protocol/PciIo.h> +#include <Protocol/ConsoleControl.h> +#include <Pci.h> +#include <Protocol/AMIPostMgr.h> +#include <Protocol/FastBootProtocol.h> +#include <Protocol/AmiUsbController.h> //(EIP85135+) +#include <Protocol/UsbPolicy.h> + +//#include <PPI\SBPPI.h> +#include <Protocol\PIDEController.h> +#include <Protocol\PDiskInfo.h> + +#if CSM_SUPPORT +#include <Protocol/LegacyBios.h> +#endif + +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT +#include <CmosAccess.h> + #endif +#endif + +#include <Protocol\PIDEBus.h> +#include <Protocol\PAhciBus.h> + +#include "FastBoot.h" +#include "Core\EM\USB\rt\usbdef.h" + +#include <Protocol\SimpleFileSystem.h> +//============================================================================ +// Define +//============================================================================ + //(EIP71257+)> +#if !defined(AMITSE_SUPPORT) || (!AMITSE_SUPPORT) + #ifndef TSE_MAJOR + #define TSE_MAJOR 0 + #endif + #ifndef TSE_MINOR + #define TSE_MINOR 0 + #endif +#endif + //<(EIP71257+) +#define AMI_MEDIA_DEVICE_PATH_GUID \ + { 0x5023b95c, 0xdb26, 0x429b, 0xa6, 0x48, 0xbd, 0x47, 0x66, 0x4c, 0x80, 0x12 } + +#define BOOT_IA32 44 //size in bytes of string L"EFI\\BOOT\\BOOTIA32.EFI" +#define BOOT_X64 42 //size in bytes of string L"EFI\\BOOT\\BOOTx64.EFI" + +struct { + EFI_DEVICE_PATH_PROTOCOL Header; + CHAR16 FileName[22]; +} FilePathNode = { + { + MEDIA_DEVICE_PATH, + MEDIA_FILEPATH_DP, +#ifdef EFIx64 + BOOT_X64 + 4 +#else + BOOT_IA32 + 4 +#endif + }, +#ifdef EFIx64 + { L"EFI\\BOOT\\BOOTx64.EFI"} +#else + { L"EFI\\BOOT\\BOOTIA32.EFI" } +#endif +}; + +struct { + EFI_DEVICE_PATH_PROTOCOL Header; + CHAR16 FileName[20]; +} TestFilePathNode = { + { + MEDIA_DEVICE_PATH, + MEDIA_FILEPATH_DP, +#ifdef EFIx64 + 38 + 4 +#else + 40 + 4 +#endif + }, +#ifdef EFIx64 + { L"EFI\\DP\\BOOTx64.EFI"} +#else + { L"EFI\\DP\\BOOTIA32.EFI" } +#endif +}; + +#define BOOT_FLOW_CONDITION_FAST_BOOT 7 +#define BOOT_FLOW_CONDITION_NORMAL 0 + +#define EFI_SHELL_PROTOCOL_GUID \ + {0x47C7B223, 0xC42A, 0x11D2, 0x8E, 0x57, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} + +#if CORE_COMBINED_VERSION > 0x40281 +#define gBootName L"Boot%04X" +#else +#define gBootName L"Boot%04x" +#endif +//============================================================================ +// Globel Variable +//============================================================================ +static EFI_GUID AmiMediaDevicePathGuid = AMI_MEDIA_DEVICE_PATH_GUID; +static EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; +static EFI_GUID FastBootVariableGuid = FAST_BOOT_VARIABLE_GUID; +static EFI_GUID gSimpleTextOutProtocolGuid = EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID; +static EFI_GUID gSimpleTextInProtocolGuid = EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID; +static EFI_GUID guidBootFlow = BOOT_FLOW_VARIABLE_GUID; +#if FASTBOOT_NEED_RESTART +static EFI_GUID FastbootRestartGuid = FAST_BOOT_RESTART_GUID; +static EFI_GUID FastbootRestartCountGuid = FAST_BOOT_RESTART_COUNT_GUID; +#endif +extern EFI_GUID AmiPostMgrProtocolGuid; +extern EFI_HANDLE ThisImageHandle; + +EFI_GUID gUsbPolicyGuid = EFI_USB_POLICY_PROTOCOL_GUID; +EFI_GUID gEfiPciIoProtocolGuid2 = EFI_PCI_IO_PROTOCOL_GUID; +EFI_GUID FbConInStartedProtocolGuid = CONSOLE_IN_DEVICES_STARTED_PROTOCOL_GUID; +EFI_GUID FbConOutStartedProtocolGuid = CONSOLE_OUT_DEVICES_STARTED_PROTOCOL_GUID; +EFI_GUID FbBdsAllDriversConnectedProtocolGuid = \ + {0xdbc9fd21, 0xfad8, 0x45b0, 0x9e, 0x78, 0x27, 0x15, 0x88, 0x67, 0xcc, 0x93}; + +FAST_BOOT_TSE_PROTOCOL *gFastBootTseProtocol=NULL; //(EIP63924+) + +EFI_HANDLE gDummyConInHdl = NULL; +EFI_HANDLE gDummyConOutHdl = NULL; +EFI_HANDLE EFIBootImageHanlde = NULL; +EFI_HANDLE LegacyBootDeviceHandle = NULL; +EFI_HANDLE *RootHandles; +UINTN NumberOfHandles; +SETUP_DATA FbSetupData; +static BOOLEAN Runtime = FALSE; +BOOLEAN StopBlkIo = FALSE; +EFI_HANDLE gHandle = NULL; +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT +EFI_CMOS_ACCESS_INTERFACE *CmosInterface = NULL; + #endif +#endif + +static AMI_FAST_BOOT_PROTOCOL FastBootProtocol = { + NULL, + FbConnectInputDevices, + IsRuntime +}; + +EFI_SIMPLE_TEXT_INPUT_PROTOCOL DummySimpleInProtocol = { + DummyInReset, + DummyReadKeyStroke, + NULL + } ; + +SIMPLE_TEXT_OUTPUT_MODE DummyMasterMode = + { + 1, // MaxMode + 0, // Current Mode + 0x0F, // Attribute + 0, // Column + 0, // Row + 1 // CursorVisible + }; + +EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL DummySimpleOutProtocol = { + DummyReset, + DummyOutputString, + DummyTestString, + DummyQueryMode, + DummySetMode, + DummySetAttribute, + DummyClearScreen, + DummySetCursorPosition, + DummyEnableCursor, + &DummyMasterMode + }; + +typedef BOOLEAN (IsFastBootElink)( + IN SETUP_DATA *Setupdata +); + +extern IsFastBootElink IS_FAST_BOOT_LIST EndOfIsFastBootList; +IsFastBootElink* IsFastBootList[] = {IS_FAST_BOOT_LIST NULL}; + //(EIP62683+)> +typedef VOID (AfterAllDrirverConnectElink)(); +extern AfterAllDrirverConnectElink AFTER_ALL_DRIVER_CONNECT_HOOK EndOfList; +AfterAllDrirverConnectElink* AfterAllDriverConnectList[] = {AFTER_ALL_DRIVER_CONNECT_HOOK NULL}; + //<(EIP62683+) + //(EIP63924+)> +typedef BOOLEAN (FastBootCheckModeChangeElink)(); +extern FastBootCheckModeChangeElink FAST_BOOT_CHECK_MODE_CHANGE_HOOK EndOfFastBootModeChangeList; +FastBootCheckModeChangeElink* FastBootModeChange[] = {FAST_BOOT_CHECK_MODE_CHANGE_HOOK NULL}; + //<(EIP63924+) + //<(EIP62845+) +typedef VOID (BeforeConnectFastBootDeviceElink)(); //(EIP85135+) +extern BeforeConnectFastBootDeviceElink BEFORE_CONNECT_FAST_BOOT_DEVICE_HOOK EndOfBeforeConnectFastBootDeviceElink; +BeforeConnectFastBootDeviceElink* BeforeConnectFastBootDeviceHook[] = {BEFORE_CONNECT_FAST_BOOT_DEVICE_HOOK NULL}; + //<(EIP62845+) +typedef VOID (ReturnNormalModeElink)(); +extern ReturnNormalModeElink RETURN_NORMAL_MODE_HOOK EndOfReturnNormalModeElink; +ReturnNormalModeElink* ReturnNormalModeHook[] = {RETURN_NORMAL_MODE_HOOK NULL}; +FAST_BOOT_POLICY *gFastBootPolicy; +BOOLEAN FBUsbSkipTableIsSet = FALSE; +UINT8 *BackupSkipTable = NULL; + +EFI_USB_POLICY_PROTOCOL *gUsbPolicyProtocol = NULL; +BOOLEAN BackupUsbMassDriverSupport; + +extern IS_VALID_FASTBOOT_BOOT_OPTION_FUNC_PTR IS_VALID_FASTBOOT_BOOT_OPTION_FUNC; +IS_VALID_FASTBOOT_BOOT_OPTION_FUNC_PTR *IsValidFBBootOptionPtr = IS_VALID_FASTBOOT_BOOT_OPTION_FUNC; + +#if FASTBOOT_NEED_RESTART +#define AMITSE_EVENT_BEFORE_BOOT_GUID \ + { 0x3677770f, 0xefb2, 0x43b2, 0xb8, 0xae, 0xb3, 0x2, 0xe9, 0x60, 0x48, 0x82 } + +#define EFI_AMI_LEGACYBOOT_PROTOCOL_GUID \ + {0x120d28aa, 0x6630, 0x46f0, 0x81, 0x57, 0xc0, 0xad, 0xc2, 0x38, 0x3b, 0xf5}; + +EFI_GUID FBBeforeBootProtocolGuid = AMITSE_EVENT_BEFORE_BOOT_GUID; +EFI_GUID FBBeforeLegacyBootProtocolGuid = EFI_AMI_LEGACYBOOT_PROTOCOL_GUID; +#endif + +//============================================================================ +// Function Definitions +//============================================================================ + +BOOLEAN CapsulePresent(VOID); +VOID ReadyToBoot(UINT16 OptionNumber); + +VOID ConnectDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *pPath); +VOID InstallFwLoadFile(VOID); +EFI_DEVICE_PATH_PROTOCOL* DiscoverPartition( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath +); + +#ifdef EFI_DXE_PERFORMANCE +VOID SavePerformanceData(IN EFI_EVENT Event, IN VOID *Context); +#endif + +#if CORE_COMBINED_VERSION <= 0x40280 //Core 4.6.4.0 +#if SINGAL_ALL_DRIVERS_CONNECTED_EVENT +extern VOID SignalProtocolEvent(IN EFI_GUID *ProtocolGuid); +#endif +#endif + +EFI_STATUS ConnectFastEfiBootDevice(); +EFI_STATUS ConnectFastLegacyBootDevice(); + +EFI_STATUS ConnectAllSataDevices(); +EFI_STATUS ConnectHddDevices(); +EFI_STATUS ConnectLastHddDevice(); + +//============================================================================ +// Procedures +//============================================================================ + +//<EIP118901+> 2013/06/21 >>> +VOID BdsLoadStrings() +{ + EFI_STATUS Status; + EFI_HII_HANDLE HiiHandle = NULL; + Status = LoadStrings(TheImageHandle, &HiiHandle); +} +//<EIP118901+> 2013/06/21 >>> + +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + #else +UINT8 ReadCMOS( + IN UINT8 Address +) +{ + IoWrite8( (UINTN)CMOS_ADDR_PORT, Address ); + return IoRead8( (UINTN)CMOS_DATA_PORT ); +} + +VOID WriteCMOS( + IN UINT8 Address, + IN UINT8 Data +) +{ + IoWrite8( (UINTN)CMOS_ADDR_PORT, Address ); + IoWrite8( (UINTN)CMOS_DATA_PORT, Data ); +} + #endif +#endif + + +VOID EnableLegacy16Fastboot() +{ +#if AMILEGACY16_FASTBOOT_SOLUTION + + UINT8 LastBootedIPLIndex=0; + +//clear the 7th bit of cmos index when fast boot is succeded. +//so that int 19 would not update the cmos index on fast boot path +//do this only if cmos index has a valid data (non 0xff value) +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + CmosInterface->Read( + CmosInterface, + 0x38,//CMOS_FASTBOOT_INDEX_REG, + &LastBootedIPLIndex + ); + #else + LastBootedIPLIndex = ReadCMOS( 0x38 ); + #endif +#endif + + if (LastBootedIPLIndex != 0xff) { +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + CmosInterface->Write( + CmosInterface, + 0x38,//CMOS_FASTBOOT_INDEX_REG, + LastBootedIPLIndex & 0x7f + ); + #else + WriteCMOS( 0x38, LastBootedIPLIndex & 0x7F ); + #endif +#endif + } + +#endif //AMILEGACY16_FASTBOOT_SOLUTION +} + +VOID DisableLegacy16Fastboot() +{ +#if AMILEGACY16_FASTBOOT_SOLUTION + + UINT8 LastBootedIPLIndex=0; + +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + CmosInterface->Read( + CmosInterface, + 0x38,//CMOS_FASTBOOT_INDEX_REG, + &LastBootedIPLIndex + ); + #else + LastBootedIPLIndex = ReadCMOS( 0x38 ); + #endif +#endif + +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + CmosInterface->Write( + CmosInterface, + 0x38, + LastBootedIPLIndex|0x80 + ); + #else + WriteCMOS( 0x38, LastBootedIPLIndex | 0x80 ); + #endif +#endif + +#endif //AMILEGACY16_FASTBOOT_SOLUTION +} + +#if CORE_COMBINED_VERSION <= 0x40280 //Core 4.6.4.0 +VOID CallDispatcherAgain() +{ + static EFI_GUID guidDXE = DXE_SERVICES_TABLE_GUID; + DXE_SERVICES *pDxe; + //before boot call dispatcher again. + pDxe = GetEfiConfigurationTable(pST,&guidDXE); + if (pDxe) pDxe->Dispatch(); +} +#endif +// +// Connect Console realted Procedures ================> +// +EFI_DEVICE_PATH_PROTOCOL* FbAddDevicePath( + EFI_DEVICE_PATH_PROTOCOL *pDp1, + EFI_DEVICE_PATH_PROTOCOL *pDp2 +) +{ + if (!pDp2) return pDp1; + if (!pDp1) + { + return DPCopy(pDp2); + } + else + { + pDp2 = DPAddInstance(pDp1,pDp2); + pBS->FreePool(pDp1); + return pDp2; + } +} + +EFI_STATUS FbGetPciHandlesByClass( + UINT8 Class, + UINT8 SubClass, + UINTN *NumberOfHandles, + EFI_HANDLE **HandleBuffer +) +{ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; + + if (!NumberOfHandles || !HandleBuffer) return EFI_INVALID_PARAMETER; + //Get a list of all PCI devices + Status = pBS->LocateHandleBuffer( + ByProtocol,&gEfiPciIoProtocolGuid2, NULL, &Number, &Handle + ); + if (EFI_ERROR(Status)) return Status; + *NumberOfHandles = 0; + for(i=0; i<Number; i++) + { + EFI_PCI_IO_PROTOCOL *PciIo; + UINT8 PciClass[4]; + Status=pBS->HandleProtocol(Handle[i],&gEfiPciIoProtocolGuid2,&PciIo); + if (EFI_ERROR(Status)) continue; + Status=PciIo->Pci.Read(PciIo, EfiPciIoWidthUint32, PCI_REV_ID_OFFSET, 1, &PciClass); + if( PciClass[3]==Class && PciClass[2]==SubClass) + Handle[(*NumberOfHandles)++] = Handle[i]; + } + if (*NumberOfHandles == 0){ + pBS->FreePool(Handle); + return EFI_NOT_FOUND; + } + *HandleBuffer = Handle; + return EFI_SUCCESS; +} + + +VOID FbReportConnectConOutProgressCode() +{ + PROGRESS_CODE(DXE_CON_OUT_CONNECT); +} + +VOID FbReportConnectConInProgressCode() +{ + PROGRESS_CODE(DXE_CON_IN_CONNECT); +} + + +VOID FbConnectVgaConOut() +{ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; + EFI_DEVICE_PATH_PROTOCOL *OnBoard=NULL, *OffBoard=NULL; + UINT64 PciAttributes; + + //Get a list of all PCI devices + Status = pBS->LocateHandleBuffer( + ByProtocol,&gEfiPciIoProtocolGuid2, NULL, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + for(i=0; i<Number; i++) + { + EFI_PCI_IO_PROTOCOL *PciIo; + EFI_DEVICE_PATH_PROTOCOL *Dp; + UINT8 PciClass; + Status=pBS->HandleProtocol(Handle[i],&gEfiPciIoProtocolGuid2,&PciIo); + if (EFI_ERROR(Status)) continue; + Status=PciIo->Pci.Read(PciIo, EfiPciIoWidthUint8, 0xB, 1, &PciClass); + if (EFI_ERROR(Status)) continue; + if (PciClass!=PCI_CL_DISPLAY) continue; + Status=pBS->HandleProtocol(Handle[i],&gEfiDevicePathProtocolGuid,&Dp); + if (EFI_ERROR(Status)) continue; + //We found Display adapter + // Check if this is on-board device + //(EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE is set). + Status = PciIo->Attributes( + PciIo, EfiPciIoAttributeOperationGet, 0, &PciAttributes + ); + if ( !EFI_ERROR(Status) + && (PciAttributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE) + ) OnBoard = FbAddDevicePath(OnBoard,Dp); + else OffBoard = FbAddDevicePath(OffBoard,Dp); + } + pBS->FreePool(Handle); + //Offboard has a higher priority + OffBoard = FbAddDevicePath(OffBoard,OnBoard); + if (OffBoard) + { + ConnectDevicePath(OffBoard); + pBS->FreePool(OffBoard); + } +} + +#if CSM_SUPPORT +BOOLEAN FbInstallOnBoardVgaOpRom( + UINTN HdlNum, + EFI_HANDLE *pHandle, + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios, + BOOLEAN OnBoard +) +{ + UINTN i; + EFI_STATUS Status; + UINT64 PciAttributes; + UINTN Flags; + UINT64 Capabilities; + + for(i=0; i<HdlNum; i++) { + EFI_PCI_IO_PROTOCOL *PciIo; + EFI_DEVICE_PATH_PROTOCOL *Dp; + UINT8 PciClass; + Status=pBS->HandleProtocol(pHandle[i],&gEfiPciIoProtocolGuid2,&PciIo); + if (EFI_ERROR(Status)) continue; + + Status=PciIo->Pci.Read(PciIo, EfiPciIoWidthUint8, 0xB, 1, &PciClass); + if (EFI_ERROR(Status)) continue; + if (PciClass!=PCI_CL_DISPLAY) continue; + + Status=pBS->HandleProtocol(pHandle[i],&gEfiDevicePathProtocolGuid,&Dp); + if (EFI_ERROR(Status)) continue; + + Status = PciIo->Attributes( + PciIo, EfiPciIoAttributeOperationGet, 0, &PciAttributes + ); + + if ( !EFI_ERROR(Status) && (PciAttributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE) && OnBoard) + continue; + + //(EIP75718)> + Status = PciIo->Attributes (PciIo, + EfiPciIoAttributeOperationSupported, 0, + &Capabilities); // Get device capabilities + if (EFI_ERROR(Status)) continue; + + Status = PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationEnable, + //Capabilities & EFI_PCI_DEVICE_ENABLE, + Capabilities & (EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO), + NULL); // Enable device + if (EFI_ERROR(Status)) goto done; + + + Status = LegacyBios->CheckPciRom ( LegacyBios, + pHandle[i], + NULL, + NULL, + &Flags); + if (EFI_ERROR(Status) || (Flags != 2)) goto done; + + Status = LegacyBios->InstallPciRom ( + LegacyBios, + pHandle[i], + NULL, + &Flags, + NULL, + NULL, + NULL, + NULL + ); + +done: + if (!EFI_ERROR(Status)) return TRUE; + else { + + if (PciIo != NULL) { + // + // Turn off the PCI device and disable forwarding of VGA cycles to this device + // + PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationDisable, + Capabilities & EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO, + NULL); + } + } + //<(EIP75718) + } + return FALSE; +} +#endif +VOID FbInstallVgaOpRom() +{ +#if CSM_SUPPORT + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number; + BOOLEAN VgaInstalled = FALSE; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; + + //Locate LegacyBios Protocol + Status = pBS->LocateProtocol(&gEfiLegacyBiosProtocolGuid, NULL, &LegacyBios); + if (EFI_ERROR(Status)) return ; + + //Get a list of all PCI devices + Status = pBS->LocateHandleBuffer( + ByProtocol,&gEfiPciIoProtocolGuid2, NULL, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + + + VgaInstalled = FbInstallOnBoardVgaOpRom(Number,Handle,LegacyBios,FALSE); + if (VgaInstalled == FALSE) + VgaInstalled = FbInstallOnBoardVgaOpRom(Number,Handle,LegacyBios,TRUE); + + pBS->FreePool(Handle); + + //If Legacy Vga OpRom is not installed successfully, then try to connect EFI VGA driver + if (VgaInstalled == FALSE) + FbConnectVgaConOut(); +#endif +} + + +VOID FbConnectPs2ConIn() +{ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; + + //Get a list of all PCI to ISA Bridges + Status = FbGetPciHandlesByClass( + PCI_CL_BRIDGE, PCI_CL_BRIDGE_SCL_ISA, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + for(i=0; i<Number; i++) + { + EFI_DEVICE_PATH_PROTOCOL *Dp, *ChildDp; + ACPI_HID_DEVICE_PATH Ps2Kbd = { + {ACPI_DEVICE_PATH,ACPI_DP,sizeof(ACPI_HID_DEVICE_PATH)}, + EISA_PNP_ID(0x303),0 + }; + ACPI_HID_DEVICE_PATH Ps2Mouse = { + {ACPI_DEVICE_PATH,ACPI_DP,sizeof(ACPI_HID_DEVICE_PATH)}, + EISA_PNP_ID(0xF03),0 + }; + Status=pBS->HandleProtocol(Handle[i],&gEfiDevicePathProtocolGuid,&Dp); + if (EFI_ERROR(Status)) continue; + pBS->ConnectController(Handle[i],NULL,NULL,FALSE); + ChildDp=DPAddNode(Dp, &Ps2Kbd.Header); + ConnectDevicePath(ChildDp); + pBS->FreePool(ChildDp); + ChildDp=DPAddNode(Dp, &Ps2Mouse.Header); + ConnectDevicePath(ChildDp); + pBS->FreePool(ChildDp); + } + pBS->FreePool(Handle); + +} + +VOID FbConnectUsbConIn() +{ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; + //Get a list of all USB Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_SER_BUS, PCI_CL_SER_BUS_SCL_USB, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + for(i=0; i<Number; i++) + { + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + } + pBS->FreePool(Handle); +} + + +VOID FbConnecConsoleVariable( + CHAR16* ConVar +) +{ + EFI_DEVICE_PATH_PROTOCOL *ConPath=NULL; + UINTN Size = 0; + + if (EFI_ERROR( + GetEfiVariable(ConVar, &EfiVariableGuid, NULL, &Size, &ConPath) + )) return; + + //Connect all active console devices + ConnectDevicePath(ConPath); + pBS->FreePool(ConPath); +} + +VOID FbConnectConOutVariable() +{ + FbConnecConsoleVariable(L"ConOut"); +} + +VOID FbConnectConInVariable() +{ + FbConnecConsoleVariable(L"ConIn"); +} + +VOID FbInstallConsoleStartedProtocol( + CHAR16* ConDevVar, + EFI_GUID* ProtocolGuid +) +{ + UINTN Size = 0; + VOID *Interface; + + //Signal to Console Splitter that all console devices have been started + //if at least one console device exists (ConDev variable exists) + if (pRS->GetVariable( + ConDevVar, &EfiVariableGuid, NULL, &Size, NULL + ) == EFI_NOT_FOUND + ) return; + //if the protocol is already installed, return + if (!EFI_ERROR(pBS->LocateProtocol(ProtocolGuid, NULL, &Interface))) + return; + pBS->InstallProtocolInterface( + &TheImageHandle, ProtocolGuid, EFI_NATIVE_INTERFACE, NULL + ); +} + + +VOID FbInstallConOutStartedProtocol() +{ + FbInstallConsoleStartedProtocol(L"ConOutDev", &FbConOutStartedProtocolGuid); +} + + + +VOID FbInstallConInStartedProtocol() +{ + FbInstallConsoleStartedProtocol(L"ConInDev", &FbConInStartedProtocolGuid); +} + +VOID InstallDummySimpleTextProtocol() +{ + EFI_STATUS Status; + + if (pST->ConOut== NULL) + { + TRACE((-1,"FB:Install Dummy ConOut\n")); + + Status = pBS->InstallProtocolInterface(&gDummyConOutHdl, + &gSimpleTextOutProtocolGuid, + EFI_NATIVE_INTERFACE, + &DummySimpleOutProtocol); + if (!EFI_ERROR(Status)) + pST->ConOut= &DummySimpleOutProtocol; + } + + + if (pST->ConIn == NULL) + { + TRACE((-1,"FB:Install Dummy ConIn\n")); + + Status = pBS->InstallProtocolInterface(&gDummyConInHdl, + &gSimpleTextInProtocolGuid, + EFI_NATIVE_INTERFACE, + &DummySimpleInProtocol); + if (!EFI_ERROR(Status)) + pST->ConIn = &DummySimpleInProtocol; + } +} + +VOID UnInstallDummySimpleTextProtocol() +{ + if (gDummyConOutHdl!=NULL) + { + pBS->UninstallProtocolInterface(gDummyConOutHdl, + &gSimpleTextOutProtocolGuid, + &DummySimpleOutProtocol); + pST->ConOut = 0; + + } + + if (gDummyConInHdl!=NULL) + { + pBS->UninstallProtocolInterface(gDummyConInHdl, + &gSimpleTextInProtocolGuid, + &DummySimpleInProtocol); + pST->ConIn = 0; + } +} + //(EIP85135+)> +BOOLEAN IsRootBridgeHandle(EFI_HANDLE Handle) +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; + EFI_GUID PciRootBridgeIoProtocolGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID; + + Status = pBS->HandleProtocol ( + Handle, + &gEfiDevicePathProtocolGuid, + &DevicePath + ); + if(EFI_ERROR(Status)) return FALSE; + + Status = pBS->HandleProtocol ( + Handle, + &PciRootBridgeIoProtocolGuid, + &PciRootBridgeIo + ); + if(EFI_ERROR(Status)) return FALSE; + + return TRUE; + +} + + +VOID ConnectEveryPciHandles() +{ + EFI_STATUS Status; + UINTN Number; + EFI_HANDLE *Handle; + UINTN i,j; + SKIP_PCI_LIST *SkipPciList = gFastBootPolicy->SkipPciList; + + Status = pBS->LocateHandleBuffer( + ByProtocol,&gEfiPciIoProtocolGuid2, NULL, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + + for(i=0; i<Number; i++) + { + EFI_PCI_IO_PROTOCOL *PciIo; + UINT8 PciClass[4]; + Status=pBS->HandleProtocol(Handle[i],&gEfiPciIoProtocolGuid2,&PciIo); + if (EFI_ERROR(Status)) continue; + Status=PciIo->Pci.Read(PciIo, EfiPciIoWidthUint32, PCI_REV_ID_OFFSET, 1, &PciClass); + + //check skip table + for (j=0;j<(gFastBootPolicy->SkipPciListSize/(sizeof(SKIP_PCI_LIST)));j++) { + + if (SkipPciList[j].SubClass == 0xFF && PciClass[3] == SkipPciList[j].Class) + break; + + if (PciClass[3] == SkipPciList[j].Class && PciClass[2] == SkipPciList[j].SubClass) + break; + } + if (j<(gFastBootPolicy->SkipPciListSize/(sizeof(SKIP_PCI_LIST)))) + continue; + + //check fastboot policy + if (gFastBootPolicy->UsbSupport == 0 && PciClass[3] == PCI_CL_SER_BUS && PciClass[2] == PCI_CL_SER_BUS_SCL_USB) + continue; + + if(PciClass[3] == PCI_CL_NETWORK && gFastBootPolicy->NetWorkStackSupport == 0) { + pBS->ConnectController(Handle[i],NULL,NULL,FALSE); + continue; + } + + + //all pass, then we connect this controller + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + + } + + pBS->FreePool(Handle); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FbConnectEverything +// +// Description: +// This function connects all PCI handles excpet PCI devices in +// FAST_BOOT_PCI_SKIP_LIST +// +// Input: +// None +// +// Output: +// None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FbConnectEverything() +{ + UINTN i; + + for(i=0; i<NumberOfHandles; i++) { + if(IsRootBridgeHandle(RootHandles[i])) + ConnectEveryPciHandles(); + else + pBS->ConnectController(RootHandles[i],NULL,NULL,TRUE); + } + + pBS->FreePool(RootHandles); + +// Signal it anyway for Consplitter to take care the ConIn/ConOut +// after everything is connected + FbInstallConsoleStartedProtocol(NULL, &FbConOutStartedProtocolGuid); + FbInstallConsoleStartedProtocol(NULL, &FbConInStartedProtocolGuid); +} + +VOID BeforeBDSFlow() +{ + pBS->LocateHandleBuffer(AllHandles, NULL, NULL, &NumberOfHandles, &RootHandles); +} + + //<(EIP85135+) +#if CORE_COMBINED_VERSION <= 0x40280 //Core 4.6.4.0 +VOID FbAllDriverConnect() +{ +#if CALL_DISPATCHER_AGAIN_IN_FASTBOOT + TRACE((-1,"FB: Call dispatcher again\n")); + CallDispatcherAgain(); +#endif + +#if SINGAL_ALL_DRIVERS_CONNECTED_EVENT + SignalProtocolEvent(&FbBdsAllDriversConnectedProtocolGuid); +#endif + +} +#endif + + //(EIP85135+)> +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: SetUsbSkipTable +// +// Description: +// Skip all usb port in fastboot path by setting skip table in usb protocol. +// +// Input: +// None +// +// Output: +// None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID SetUsbSkipTable() +{ + EFI_STATUS Status = EFI_SUCCESS; + EFI_GUID gEfiUsbProtocolGuid = EFI_USB_PROTOCOL_GUID; + EFI_USB_PROTOCOL *UsbProtocol = NULL; + USB_GLOBAL_DATA *UsbData = NULL; + + Status = pBS->LocateProtocol( &gEfiUsbProtocolGuid, \ + NULL, \ + &UsbProtocol ); + if (EFI_ERROR(Status)) return; + +//backup skip table pointer + UsbData = (USB_GLOBAL_DATA*)UsbProtocol->USBDataPtr; + + BackupSkipTable = UsbData->gUsbSkipListTable; + +//Set new skip table + UsbProtocol->UsbCopySkipTable( \ + (USB_SKIP_LIST*)gFastBootPolicy->UsbSkipTable, \ + (UINT8)gFastBootPolicy->UsbSkipTableSize); + +} +#endif + //<(EIP85135+) + //(EIP63924)> +VOID FastConnectConsoles() +{ + TRACE((-1,"FB:Connect Console...\n")); + + // Connect Console Out + FbReportConnectConOutProgressCode(); + + PERF_START(0, L"ConnectVgaConOut", L"FB", 0); + if (gFastBootPolicy->VGASupport || gFastBootPolicy->UEfiBoot == TRUE){ + TRACE((-1,"FB:Connect Vga\n")); + FbConnectVgaConOut(); + } else { + TRACE((-1,"FB:Install Vga OpRom Only\n")); + FbInstallVgaOpRom(); + } + + PERF_END(0,L"ConnectVgaConOut",L"FB",0); + PERF_START(0,L"InstallConOutStartedProtocol",L"FB",0); + FbInstallConOutStartedProtocol(); + PERF_END(0,L"InstallConOutStartedProtocol",L"FB",0); + + // Connect Console In + FbReportConnectConInProgressCode(); + + PERF_START(0, L"ConnectUsbConIn", L"FB" , 0); + //(EIP85135)> + if (gFastBootPolicy->UsbSupport >= 1){ + +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) + if (gFastBootPolicy->UsbSupport == 2){ + + //Disable Usb storage driver support + pBS->LocateProtocol(&gUsbPolicyGuid, NULL, &gUsbPolicyProtocol); + if (gUsbPolicyProtocol != NULL) { + BackupUsbMassDriverSupport = gUsbPolicyProtocol->UsbDevPlcy->UsbMassDriverSupport; + gUsbPolicyProtocol->UsbDevPlcy->UsbMassDriverSupport = FALSE; + } + + + TRACE((-1,"FB:Set Usb Skip Table\n")); + FBUsbSkipTableIsSet = TRUE; + SetUsbSkipTable(); + } +#endif + TRACE((-1,"FB:Connect Usb\n")); + FbConnectUsbConIn(); + } + PERF_END(0, L"ConnectUsbConIn", L"FB", 0); + //<(EIP85135) + PERF_START(0, L"ConnectPs2ConIn", L"FB", 0); + if (gFastBootPolicy->Ps2Support){ + TRACE((-1,"FB:Connect Ps2\n")); + FbConnectPs2ConIn(); + } + PERF_END(0, L"ConnectPs2ConIn", L"FB", 0); + + PERF_START(0, L"InstallConInStartedProtocol",L"FB", 0); + FbInstallConInStartedProtocol(); + PERF_END(0, L"InstallConInStartedProtocol", L"FB", 0); + // Install Dumy protocol, if ConIn/ConOut is Null + TRACE((-1,"FB:Connect Console...End\n")); +} + //<(EIP63924) +// +// <============= Connect Console realted Procedures +// +#if FASTBOOT_NEED_RESTART +VOID ResetForFastboot ( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + pRS->ResetSystem(EfiResetCold,0,0,NULL); +} + +FastBootEnableRestart( + UINTN Flag, + UINTN Count ) +{ + EFI_STATUS Status; + EFI_EVENT Event; + VOID *Registration; + + TRACE((-1,"FB:Normal boot need to restart.\n")); + RegisterProtocolCallback( + &FBBeforeBootProtocolGuid, + ResetForFastboot, + NULL, &Event, &Registration + ); + RegisterProtocolCallback( + &FBBeforeLegacyBootProtocolGuid, + ResetForFastboot, + NULL, &Event, &Registration + ); + + Status = pRS->SetVariable(FAST_BOOT_RESTART, + &FastbootRestartGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Flag), + &Flag); + Status = pRS->SetVariable(FAST_BOOT_RESTART_COUNT, + &FastbootRestartCountGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Count), + &Count); +} +#endif +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBoot +// +// Description: FastBoot entry point +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBoot(VOID) +{ + //(EIP63924+)> + EFI_STATUS Status; + EFI_GUID FastBootTseGuid = FAST_BOOT_TSE_PROTOCOL_GUID; + + Status = pBS->LocateProtocol(&FastBootTseGuid, NULL, &gFastBootTseProtocol); + if (EFI_ERROR(Status)) return; + //<(EIP63924+) + gFastBootPolicy->InFastBootPath = TRUE; + FastBootWorker(); + +//if we're here - fast boot failed + ReturnToNormalBoot(); + gFastBootPolicy->InFastBootPath = FALSE; + TRACE((-1,"FB: FastBoot Failure, return to BDS\n")); +} + +VOID RemoveFilePathNode( + IN EFI_DEVICE_PATH_PROTOCOL *Dp) +{ + EFI_DEVICE_PATH_PROTOCOL *FileDpNode = NULL; + UINTN FileDpNodeSize; + EFI_DEVICE_PATH_PROTOCOL *TempDp = Dp; + UINTN DpSize = DPLength(Dp); + UINTN RemainingDpLength=0; + UINT8 ReaminingDpBuffer[100]; + + for( ; !(isEndNode(TempDp)); TempDp = NEXT_NODE(TempDp)) { + if(TempDp->Type == MEDIA_DEVICE_PATH && + TempDp->SubType == MEDIA_FILEPATH_DP) { + FileDpNode = TempDp; + break; + } + } + + if (FileDpNode == NULL) return; + + RemainingDpLength = DPLength(FileDpNode); + FileDpNodeSize = NODE_LENGTH(FileDpNode); + + pBS->SetMem(ReaminingDpBuffer,100,0); + + pBS->CopyMem(ReaminingDpBuffer,FileDpNode,RemainingDpLength); + + pBS->SetMem(FileDpNode,RemainingDpLength,0); + + pBS->CopyMem(FileDpNode, + (VOID*)((UINTN)ReaminingDpBuffer+FileDpNodeSize), + RemainingDpLength - FileDpNodeSize); +} + +#ifdef EFI_DXE_PERFORMANCE +VOID UpdatePolicyForTestMode() +{ + BOOLEAN UsbMassStorage = FALSE; + BOOLEAN HddFilePath = FALSE; + EFI_DEVICE_PATH_PROTOCOL *Dp = gFastBootPolicy->FastBootOption; + EFI_DEVICE_PATH_PROTOCOL *NewDp=NULL; + EFI_DEVICE_PATH_PROTOCOL *TempDp=NULL; + UINTN NewDpSize; + UINT32 LoadOptionsSize = 0; + VOID *LoadOptions; + EFI_STATUS Status; + + if(gFastBootPolicy->TestMode == FALSE || gFastBootPolicy->UEfiBoot == FALSE) return; + + if(!IsSupportedDevice(gFastBootPolicy->FastBootOption, &UsbMassStorage,&HddFilePath)) + return; + + LoadOptions = (UINT8*)Dp + DPLength(Dp); + LoadOptionsSize = *(UINT32*)LoadOptions; + + NewDpSize = DPLength(Dp)+ LoadOptionsSize+ sizeof(UINT32)+ \ + NODE_LENGTH(&TestFilePathNode.Header); + + Status = pBS->AllocatePool(EfiBootServicesData,NewDpSize,&NewDp); + if(EFI_ERROR(Status)) return; + + pBS->SetMem(NewDp,NewDpSize,0); + pBS->CopyMem(NewDp,Dp,DPLength(Dp)); + + //Replace file path from "efi\boot\" to "efi\dp\" + RemoveFilePathNode(NewDp); + TempDp = DPAddNode(NewDp, &TestFilePathNode.Header); + + pBS->CopyMem(NewDp,TempDp,DPLength(TempDp)); + + //Copy optional data + pBS->CopyMem( (VOID*)((UINTN)NewDp+DPLength(NewDp)), + LoadOptions, + LoadOptionsSize+sizeof(UINT32)); + + + gFastBootPolicy->FastBootOption = NewDp; + pBS->FreePool(TempDp); + + gFastBootPolicy->CheckBootOptionNumber = FALSE; + +} +#endif + +VOID ShowFastBootPolicy() +{ + EFI_DEVICE_PATH_PROTOCOL *Dp = gFastBootPolicy->FastBootOption; + UINTN FastBootOptionSize=0; + VOID *LoadOptions; + UINT32 LoadOptionsSize = 0; + UINT8 *ptr8=NULL; + SKIP_PCI_LIST *PciSkipList=NULL; +#if SUPPORT_RAID_DRIVER + SATA_DEVICE_DATA *SataDevice=NULL; +#endif + UINTN i,j; + USB_SKIP_LIST *usbskip = NULL; //(EIP96276.7)+ + + TRACE((-1,"FB: ==================================================\n")); + TRACE((-1,"FB: FastBootPolicy->FastBootEnable = %x\n",gFastBootPolicy->FastBootEnable)); + TRACE((-1,"FB: FastBootPolicy->TestMode = %x\n",gFastBootPolicy->TestMode)); + + TRACE((-1,"FB: FastBootPolicy->UEfiBoot = %x\n",gFastBootPolicy->UEfiBoot)); + TRACE((-1,"FB: FastBootPolicy->BootOptionNumber = %x\n",gFastBootPolicy->BootOptionNumber)); + TRACE((-1,"FB: FastBootPolicy->DevStrCheckSum = %x\n",gFastBootPolicy->DevStrCheckSum)); + + FastBootOptionSize = DPLength(Dp); + if (gFastBootPolicy->UEfiBoot) { + LoadOptions = (UINT8*)Dp + DPLength(Dp); + LoadOptionsSize = *(UINT32*)LoadOptions; + FastBootOptionSize += LoadOptionsSize+sizeof(UINT32); + } + + TRACE((-1,"FB: FastBootPolicy->FastBootOption\n")); + ptr8=(UINT8*)Dp; + for (i=0;i<FastBootOptionSize;) + { + for(j=0;j<0x10 && i<FastBootOptionSize;j++) + { + TRACE((-1,"%02X ",ptr8[i])); + i++; + } + TRACE((-1," \n")); + } + + TRACE((-1,"FB: FastBootPolicy->LastBootFailure = %x\n",gFastBootPolicy->LastBootFailure)); + TRACE((-1,"FB: FastBootPolicy->LastBootVarPresence = %x\n",gFastBootPolicy->LastBootVarPresence)); + TRACE((-1,"FB: FastBootPolicy->BootCount = %x\n",gFastBootPolicy->BootCount)); + +#if SUPPORT_RAID_DRIVER + SataDevice = gFastBootPolicy->SataDevice; + for(i=0;i<MAX_SATA_DEVICE_COUNT && SataDevice[i].BDF!=0;i++) + { + + TRACE((-1,"FB: FastBootPolicy->SataDevice[%d],n",i)); + + TRACE((-1,"BDF:%x, CalssCode:%x, DveType:%x, PortNum:%x\n",\ + SataDevice[i].BDF,\ + SataDevice[i].ClassCode,\ + SataDevice[i].DevType,\ + SataDevice[i].PortNum)); + + TRACE((-1,"Serial Number: ")); + + for(j=0;j<20;j++) + { + TRACE((-1,"%02X ",SataDevice[i].SerialNum[j])); + } + TRACE((-1," \n")); + } +#endif + + TRACE((-1,"FB: FastBootPolicy->CheckBootOptionNumber = %x\n",gFastBootPolicy->CheckBootOptionNumber)); + TRACE((-1,"FB: FastBootPolicy->CheckDevStrCheckSum = %x\n",gFastBootPolicy->CheckDevStrCheckSum)); + TRACE((-1,"FB: FastBootPolicy->SataSupport = %x\n",gFastBootPolicy->SataSupport)); + TRACE((-1,"FB: FastBootPolicy->VGASupport = %x\n",gFastBootPolicy->VGASupport)); + TRACE((-1,"FB: FastBootPolicy->UsbSupport = %x\n",gFastBootPolicy->UsbSupport)); + + //(EIP96276.7)> + usbskip = gFastBootPolicy->UsbSkipTable; + for (i = 0; i < gFastBootPolicy->UsbSkipTableSize; i++) + { + TRACE((-1,"FB: FastBootPolicy->UsbSkipTable[%d] = {%02X,%02X,%04X,%02X,%08X,%02X}\n",i,usbskip->bSkipType,usbskip->bFlag,usbskip->wBDF,usbskip->bRootPort,usbskip->dRoutePath,usbskip->bBaseClass)); + usbskip++; + } + //<(EIP96276.7) + + TRACE((-1,"FB: FastBootPolicy->Ps2Support = %x\n",gFastBootPolicy->Ps2Support)); + TRACE((-1,"FB: FastBootPolicy->NetWorkStackSupport = %x\n",gFastBootPolicy->NetWorkStackSupport)); + + for (i=0,PciSkipList = gFastBootPolicy->SkipPciList;i<gFastBootPolicy->SkipPciListSize/sizeof(SKIP_PCI_LIST);i++) + TRACE((-1,"FB: FastBootPolicy->SkipPciList[%d] = Class:%x,SubClass:%x\n",i,PciSkipList[i].Class,PciSkipList[i].SubClass)); + + TRACE((-1,"FB: FastBootPolicy->CheckPassword = %x\n",gFastBootPolicy->CheckPassword)); + + TRACE((-1,"FB: FastBootPolicy->SkipTSEHandshake = %x\n",gFastBootPolicy->SkipTSEHandshake)); + + TRACE((-1,"FB: ==================================================\n")); + +} + //(EIP96276.4)>> +BOOLEAN IsValidFastBootOption( + IN UINTN BootOrderIndex, + IN EFI_LOAD_OPTION *BootOption) +{ + EFI_DEVICE_PATH_PROTOCOL *Dp; + CHAR16 *Description; + CHAR16 *gWindowsBootManagerStr = L"Windows Boot Manager"; + BOOLEAN LegacyType = FALSE; + BOOLEAN UsbDevice = FALSE; + BOOLEAN HardDrive = FALSE; + BOOLEAN CDROM = FALSE; + BOOLEAN NetWork = FALSE; + BOOLEAN WindowsBootManager = FALSE; + +//check attribute + + if (!(BootOption->Attributes & LOAD_OPTION_ACTIVE)) return FALSE; + +//check windows boot manager + + Description = (CHAR16 *)(BootOption + 1); + if(!MemCmp(gWindowsBootManagerStr,Description,Strlen((char*)gWindowsBootManagerStr))) + WindowsBootManager = TRUE; + +//check device type + + Dp = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8*)Description + (Wcslen(Description) + 1) * sizeof(CHAR16)); + + for( ; !(isEndNode(Dp)); Dp = NEXT_NODE(Dp)) { + if(Dp->Type == BBS_DEVICE_PATH) LegacyType = TRUE; + + if(Dp->Type == MESSAGING_DEVICE_PATH && Dp->SubType == MSG_USB_DP) + UsbDevice = TRUE; + + if(Dp->Type == MESSAGING_DEVICE_PATH && Dp->SubType == MSG_MAC_ADDR_DP) + NetWork = TRUE; + + if(Dp->Type == MEDIA_DEVICE_PATH && Dp->SubType == MEDIA_HARDDRIVE_DP) + HardDrive = TRUE; + + if(Dp->Type == MEDIA_DEVICE_PATH && Dp->SubType == MEDIA_CDROM_DP) + CDROM = TRUE; + } + + TRACE((-1,"FB: BootOrder Index %x\n",BootOrderIndex)); + TRACE((-1,"FB: Windows Boot Manager: %x\n",WindowsBootManager)); + TRACE((-1,"FB: Legacy %x,Usb %x, HardDrive %x, CDROM %x, NetWork %x\n", \ + LegacyType,UsbDevice,HardDrive,CDROM,NetWork)); + +// there is some samples for selecting a boot option as fast boot device. +/* +//Case 1. Fast boot with windows boot manager and it's the highest priority in boot order. + if(BootOrderIndex == 0 && WindowsBootManager == 1) return TRUE; + +//Case 2. don't support Legacy device + if(LegacyType == TRUE) return FALSE; + +//Case3. don't support usb type + if(UsbDevice == TRUE) return FALSE; +*/ + + return TRUE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsOneOfDP +// +// Description: Determines whether a device path, pAll, contains another +// device path, pOne. +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *pAll - The device path to be scanned. +// IN EFI_DEVICE_PATH_PROTOCOL *pOne - The device path to locate within pAll. +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +BOOLEAN +IsOneOfDP( + IN EFI_DEVICE_PATH_PROTOCOL *pAll, + IN EFI_DEVICE_PATH_PROTOCOL *pOne +) +{ + EFI_DEVICE_PATH_PROTOCOL *pPath; + + pPath = pOne; + + do{ + if (isEndNode(pAll)) return FALSE; + + if (DPLength(pAll) < DPLength(pOne)) return FALSE; + + if(!(pAll->Type == pPath->Type && pAll->SubType == pPath->SubType)) + { + pAll = NEXT_NODE(pAll); + continue; + } + + if (!MemCmp(pAll,pOne,DPLength(pOne))) + return TRUE; + else + pAll = NEXT_NODE(pAll); + + }while(TRUE); + +} + //<<(EIP96276.4) +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FindDevicePath +// +// Description: Search DevicePath and find out indicated device path node. +// +// Input: +// IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath - Searched device path +// IN UINT8 Type - Indicated device path type +// IN UINT8 SubType - Indicated device path sub type +// +// Output: EFI_DEVICE_PATH_PROTOCOL - return indicated device path +// pointer otherwise NULL. +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_DEVICE_PATH_PROTOCOL* +FindDevicePath ( + IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN UINT8 Type, + IN UINT8 SubType +) +{ + if (DevicePath == NULL) { + return NULL; + } + + while (!isEndNode (DevicePath)) { + if (DevicePath->Type == Type && DevicePath->SubType== SubType) + return DevicePath; + + DevicePath = NEXT_NODE (DevicePath); + } + + return NULL; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastConnectSata +// +// Description: Connect Sata controller in fast boot path. +// +// Input: +// None +// +// Output: +// EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS +FastConnectSata() +{ + + TRACE((-1,"FB:Connect Sata\n")); + + switch(gFastBootPolicy->SataSupport) + { + case 0: // only connect previous boot HDD? + return ConnectLastHddDevice(); + case 1: // connect all sata device + ConnectAllSataDevices(); + break; +#if SUPPORT_RAID_DRIVER + case 2: // only connect HDDs, ODD & Port Multiplier will be skipped. + return ConnectHddDevices(); +#endif + } + + return EFI_SUCCESS; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootWorker +// +// Description: FastBoot main function +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootWorker(VOID) +{ + EFI_EVENT FastBootReadyToBootEvent; + CHAR16 BootOptionName[9]; + EFI_LOAD_OPTION *BootOption = NULL; + UINTN Size; + EFI_STATUS Status; + UINT16 *BootOrder = NULL; + UINT32 BootFlow; + UINT8 i; //(EIP62683+) + BOOLEAN VaildBootOption = FALSE; + UINTN BootOptionSize; //(EIP96276.4+) +#if FASTBOOT_NEED_RESTART + UINTN Flag = 1; + UINTN Count = 0; +#endif + + TRACE((-1, "FB: FastBoot started\n")); + Size = sizeof(BootFlow); + Status = pRS->GetVariable(L"BootFlow", &guidBootFlow, NULL, &Size, (VOID *)&BootFlow); + if(!EFI_ERROR(Status) && (BootFlow != BOOT_FLOW_CONDITION_NORMAL)) { + // Some other driver wants different bootflow - abandon fast boot. +#if FASTBOOT_NEED_RESTART + TRACE((-1,"FB : Normal boot need to notify.\n")); + //Initial Reboot Flag + Status = pRS->SetVariable(FAST_BOOT_RESTART, + &FastbootRestartGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Flag), + &Flag); + Status = pRS->SetVariable(FAST_BOOT_RESTART_COUNT, + &FastbootRestartCountGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Count), + &Count); + + Status = CreateReadyToBootEvent(TPL_CALLBACK, + FastBootReadyToBootNotify, + NULL, + &FastBootReadyToBootEvent); +#endif + return; + } + PERF_START(0, L"FastBoot", L"FB", 0); + +#if CAPSULE_SUPPORT + if(CapsulePresent()) + return; +#endif + + if(OemConfigurationChanged()) + return; + + Status = CreateReadyToBootEvent(TPL_CALLBACK, + FastBootReadyToBootNotify, + NULL, + &FastBootReadyToBootEvent); + if (EFI_ERROR(Status)) + return; + + if (!gFastBootPolicy->LastBootVarPresence) return; + +#ifdef EFI_DXE_PERFORMANCE + UpdatePolicyForTestMode(); +#endif + + ShowFastBootPolicy(); + + if (gFastBootPolicy->CheckBootOptionNumber) { + + Size = 0; + Status = GetEfiVariable(L"BootOrder", &EfiVariableGuid, NULL, &Size, &BootOrder); + + for (i=0;i<Size/sizeof(UINT16);i++,BootOption = NULL) { //(EIP96276.4) + + Swprintf(BootOptionName, gBootName, BootOrder[i]); + Status = GetEfiVariable(BootOptionName, &EfiVariableGuid, NULL, &BootOptionSize, &BootOption);//(EIP96276.4) + if(EFI_ERROR(Status)) + return; + + VaildBootOption = IsValidFBBootOptionPtr(i,BootOption); + if (VaildBootOption) break; + + pBS->FreePool(BootOption); + + if (VaildBootOption == FALSE && i == (Size/sizeof(UINT16) -1 )) { + TRACE((-1, "FB: There is no valid boot option\n")); + pBS->FreePool(BootOrder); + return; + + } + } + + TRACE((-1, "FB: LastBootOption=%x, BootOrder[%d]=%x\n",gFastBootPolicy->BootOptionNumber,i,BootOrder[i])); + + if(gFastBootPolicy->BootOptionNumber != BootOrder[i]) + { + // + // BootOption Number check fail, then check device path. + // If device path is also wrong, abort the fast boot. + // + EFI_DEVICE_PATH_PROTOCOL *Dp; + CHAR16 *Description; + Description = (CHAR16 *)(BootOption + 1); + Dp = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8*)Description + (Wcslen(Description) + 1) * sizeof(CHAR16)); + + if(!IsOneOfDP(gFastBootPolicy->FastBootOption,Dp)) { + pBS->FreePool(BootOrder); + pBS->FreePool(BootOption); + return; + } + + TRACE((-1,"FB: Update new boot option number\n")); + gFastBootPolicy->BootOptionNumber = BootOrder[i]; + } + + pBS->FreePool(BootOrder); + pBS->FreePool(BootOption); + } + + + PERF_START(0,L"FastBootConnectConsole",L"FB" ,0); + FastConnectConsoles(); + PERF_END(0,L"FastBootConnectConsole",L"FB",0); + +//<EIP118901+> 2013/06/21 >>> + BdsLoadStrings(); +//<EIP118901+> 2013/06/21 <<< + + PERF_START(0,L"BeforeConnectFbDevElink",L"FB",0); + //(EIP62683+)> + // before all driver connect elink + for (i=0;BeforeConnectFastBootDeviceHook[i]; i++) + BeforeConnectFastBootDeviceHook[i](); //(EIP85135) + + //<(EIP62683+) + PERF_END(0,L"BeforeConnectFbDevElink",L"FB",0); + Status = FastConnectSata(); + if (EFI_ERROR(Status)) return; + + PERF_START(0,L"ConnectFbDev",L"FB",0); + if(gFastBootPolicy->UEfiBoot == TRUE) + Status = ConnectFastEfiBootDevice(); + else + Status = ConnectFastLegacyBootDevice(); + PERF_END(0,L"FB",L"ConnectFbDev",0); + + if(EFI_ERROR(Status)) return; + + + //(EIP62683+)> + PERF_START(0,L"AfterConnectFbDevElink",L"FB",0); + // after all driver connect elink + for (i=0;AfterAllDriverConnectList[i]; i++) + AfterAllDriverConnectList[i](); + PERF_END(0,L"AfterConnectFbDevElink",L"FB",0); + //<(EIP62683+) + + +#if CORE_COMBINED_VERSION <= 0x40280 //Core 4.6.4.0 + FbAllDriverConnect(); +#endif + + if((gFastBootPolicy->SkipTSEHandshake == 0) && (TSE_MAJOR >= 0x02) && (TSE_MINOR >= 0x10)) { + PERF_START(0,L"TSE",L"FB",0); + Status = TseHandShake(); + if(Status == EFI_ABORTED) //fast boot failed, proceed to full boot + return; + } + + //(EIP63924+)> +//Stop CheckForKey callback timer in TSE + gFastBootTseProtocol->FastBootStopCheckForKeyTimer(); + //<(EIP63924+) +//if we are here, somehow we failed launch fast boot through TSE - do it on our own + + if(gFastBootPolicy->UEfiBoot == TRUE) + FastEfiBoot(); + else + FastLegacyBoot(); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsBootToShell +// +// Description: Function to determine if the boot path is to UEFI Shell +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - pointer to device path of bootable device +// +// Output: TRUE - if it's UEFI Shell boot path, FALSE otherwise +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsBootToShell( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + if(Dp->Type == MEDIA_DEVICE_PATH && + Dp->SubType == MEDIA_VENDOR_DP && + !guidcmp(&(((VENDOR_DEVICE_PATH *)Dp)->Guid), &AmiMediaDevicePathGuid)) + return TRUE; + + return FALSE; +} + //(EIP63924+)> +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckPostManagerKey +// +// Description: Check TSE Post key is pressed or not. +// +// Input: None +// +// Output: TRUE - Post key is pressed +// FALSE - Post key is not pressed +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN CheckPostManagerKey() +{ + EFI_STATUS CheckForKeyStatus; + BOOLEAN EnterSetup; + UINT32 BootFlow; + + CheckForKeyStatus = gFastBootTseProtocol->FastBootCheckForKey(&EnterSetup,&BootFlow); + if(CheckForKeyStatus == EFI_SUCCESS) return TRUE; + return FALSE; +} + //<(EIP63924+) + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckConnectedHdd +// +// Description: Check connected Hdds are as same as previous boot's. +// +// Input: +// IN UINT16 BDF - BDF of previous boot's Hdd +// IN UINT16 ClassCode - Class of previous boot's Hdd +// IN UINT8 PortNum - Port Number of previous boot's Hdd +// +// Output: +// EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +#if SUPPORT_RAID_DRIVER +EFI_STATUS +CheckConnectedHdd( + IN UINT16 BDF, + IN UINT16 ClassCode, + IN UINT8 PortNum +) +{ + EFI_STATUS Status; + EFI_GUID DiskInfoGuid = EFI_DISK_INFO_PROTOCOL_GUID; + EFI_GUID DiskInfoIdeGuid = EFI_DISK_INFO_IDE_INTERFACE_GUID; + EFI_GUID DiskInfoAhciGuid = EFI_DISK_INFO_AHCI_INTERFACE_GUID; + EFI_DISK_INFO_PROTOCOL *DiskInfoProtocol; + EFI_HANDLE *Handle; + UINTN Count; + UINTN PciSeg,PciBus,PciDev,PciFun; + UINT16 DetectedHddBDF; + UINT16 DetectedHddClassCode; + UINT8 DetectedHddPortNum; + UINT8 *DetectedHddSerialNum = NULL; + BOOLEAN StrucFound = FALSE; + UINT8 i; + SATA_DEVICE_DATA *SataDevice = (SATA_DEVICE_DATA*)gFastBootPolicy->SataDevice; + +// +// Find out sata device structure the from last boot stat devcie list +// + for (i=0;i<MAX_SATA_DEVICE_COUNT && SataDevice->BDF!=0;SataDevice++) { + if (BDF == SataDevice->BDF &&\ + ClassCode == SataDevice->ClassCode &&\ + PortNum == SataDevice->PortNum) + { + StrucFound = TRUE; + break; + } + } + if (StrucFound == FALSE) return EFI_NOT_FOUND; + +// +// Find out serial number of detected Hdd. +// + + Status=pBS->LocateHandleBuffer(ByProtocol,&DiskInfoGuid,NULL,&Count,&Handle); + if (EFI_ERROR(Status)) return Status; + + for(i=0;i<Count;i++) + { + Status=pBS->HandleProtocol(Handle[i],&DiskInfoGuid,(VOID**)&DiskInfoProtocol); + if(EFI_ERROR(Status)) continue; + + if(!guidcmp(&DiskInfoProtocol->Interface,&DiskInfoIdeGuid)) { + // + // Ide diskInfo + // + IDE_BUS_PROTOCOL *IdeInterface = ((IDE_DISK_INFO*)DiskInfoProtocol)->IdeBusInterface; + EFI_PCI_IO_PROTOCOL *PciIo = IdeInterface->PciIO; + + Status = PciIo->GetLocation(PciIo, &PciSeg, &PciBus, &PciDev, &PciFun); + ASSERT_EFI_ERROR(Status); + + DetectedHddBDF = (UINT16)((PciBus << 8) | (PciDev << 3) | PciFun ); + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x0A,\ + 1,\ + &DetectedHddClassCode); + ASSERT_EFI_ERROR(Status); + + DetectedHddPortNum = IdeInterface->IdeDevice.Channel | IdeInterface->IdeDevice.Device<<1; + + if (DetectedHddBDF != BDF ||\ + DetectedHddClassCode != ClassCode ||\ + DetectedHddPortNum != PortNum) + continue; + + DetectedHddSerialNum = IdeInterface->IdeDevice.IdentifyData.Serial_Number_10; + break; + + }else if (!guidcmp(&DiskInfoProtocol->Interface,&DiskInfoAhciGuid)) { + // + //Devie is detected in Ahci mode + // + SATA_DEVICE_INTERFACE *SataInterface = ((SATA_DISK_INFO*)DiskInfoProtocol)->SataDevInterface; + EFI_PCI_IO_PROTOCOL *PciIo = SataInterface->AhciBusInterface->PciIO; + + Status = PciIo->GetLocation(PciIo, &PciSeg, &PciBus, &PciDev, &PciFun); + ASSERT_EFI_ERROR(Status); + + DetectedHddBDF = (UINT16)((PciBus << 8) | (PciDev << 3) | PciFun ); + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x0A,\ + 1,\ + &DetectedHddClassCode); + ASSERT_EFI_ERROR(Status); + + DetectedHddPortNum = SataInterface->PortNumber; + + if (DetectedHddBDF != BDF ||\ + DetectedHddClassCode != ClassCode ||\ + DetectedHddPortNum != PortNum) + continue; + + DetectedHddSerialNum = SataInterface->IdentifyData.Serial_Number_10; + break; + + } + } + + pBS->FreePool(Handle); + + if (DetectedHddSerialNum == NULL) return EFI_NOT_FOUND; + +// +// Compare Serial number is as same as last boot. +// + + if(!MemCmp(DetectedHddSerialNum,SataDevice->SerialNum,20)) + return EFI_SUCCESS; + + + TRACE((-1,"FB: ConnectedHdd is match with previous boot\n")); + + TRACE((-1,"Detected BDS %x, ClassCode %x, PortNum %x\n",DetectedHddBDF,DetectedHddClassCode,DetectedHddPortNum)); + + TRACE((-1,"Detected Serial Number: ")); + + for(i=0;i<20;i++) + { + TRACE((-1,"%02x ",DetectedHddSerialNum[i])); + } + TRACE((-1," \n")); + + + TRACE((-1,"Last BDS %x, ClassCode %x, PortNum %x\n",SataDevice->BDF,SataDevice->ClassCode,SataDevice->PortNum)); + + TRACE((-1,"Last Serial Number: ")); + + for(i=0;i<20;i++) + { + TRACE((-1,"%02x ",SataDevice->SerialNum[i])); + } + TRACE((-1," \n")); + + return EFI_DEVICE_ERROR; +} +#endif +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsSataDevicePath +// +// Description: Check device path is for sata devcie or not +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - Device path need to be checked. +// +// Output: +// BOOLEAN TRUE,the devcie path is for sata devcie, otherwise False. +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +BOOLEAN IsSataDevicePath( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + EFI_DEVICE_PATH_PROTOCOL *TempDp = NULL; + + TempDp = FindDevicePath(Dp,MESSAGING_DEVICE_PATH,MSG_SATA_DP); + if (TempDp != NULL) return TRUE; + + TempDp = FindDevicePath(Dp,MESSAGING_DEVICE_PATH,MSG_ATAPI_DP); + if (TempDp != NULL) return TRUE; + + return FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsLegacyRaidDevicePath +// +// Description: Check device path is legacy raid device path or not. +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - Device path need to be checked. +// +// Output: +// BOOLEAN TRUE,the devcie path is for legacy raid devcie, otherwise False. +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +BOOLEAN IsLegacyRaidDevicePath( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + EFI_DEVICE_PATH_PROTOCOL *TempDp = NULL; + PCI_DEVICE_PATH *PciDp = NULL; +#if SUPPORT_RAID_DRIVER + SATA_DEVICE_DATA *SataDevice = (SATA_DEVICE_DATA*)gFastBootPolicy->SataDevice; + UINT8 i; +#endif + UINT16 BDF; + + if (gFastBootPolicy->UEfiBoot == TRUE) return FALSE; + + TempDp = FindDevicePath(Dp,HARDWARE_DEVICE_PATH,HW_VENDOR_DP); + if(TempDp == NULL) return FALSE; + + TempDp = FindDevicePath(Dp,HARDWARE_DEVICE_PATH,HW_PCI_DP); + if(TempDp == NULL) return FALSE; + + PciDp = (PCI_DEVICE_PATH*)TempDp; + BDF = (UINT16)((0 << 8) | (PciDp->Device << 3) | PciDp->Function ); +#if SUPPORT_RAID_DRIVER + for (i=0;i<MAX_SATA_DEVICE_COUNT && SataDevice[i].BDF!=0;i++) { + if (BDF == SataDevice[i].BDF) + return TRUE; + } +#endif + return FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectDevicePath_Recursive +// +// Description: Connect controller by device path recursively. +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *pPath - Device path want to be connected. +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID ConnectDevicePath_Recursive ( + IN EFI_DEVICE_PATH_PROTOCOL *pPath) +{ + EFI_HANDLE Handle; + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + while (TRUE) + { + EFI_DEVICE_PATH_PROTOCOL *pLastPath = NULL; + EFI_DEVICE_PATH_PROTOCOL *pFirstNode = pPath; + + if (isEndNode(pPath)) + { + if (pPath->SubType == END_ENTIRE_SUBTYPE) break; + pPath++; + continue; + } + + while (TRUE) { + EFI_DEVICE_PATH_PROTOCOL *Dp; + UINT8 SubType; + + pPath = pFirstNode; + + // LocateDevicePath can not work with multi-instance device paths. + // Prepare single instance device path and call LocateDevicePath. + + Dp = DPGetEndNode(pPath); + SubType = Dp->SubType; + Dp->SubType = END_ENTIRE_SUBTYPE; + Status = pBS->LocateDevicePath(&gEfiDevicePathProtocolGuid, \ + &pPath, &Handle); + Dp->SubType = SubType; + if (EFI_ERROR(Status)) break; + + if (isEndNode(pPath)) + { + // Last time let's do it recursively. + + pBS->ConnectController(Handle, NULL, NULL, TRUE); + break; + } + if (pPath == pLastPath) break; + pLastPath = pPath; + + if (StopBlkIo == TRUE) { + gHandle = Handle; + Status = pBS->OpenProtocol( Handle, + &gEfiDevicePathProtocolGuid, + (VOID **)&DevicePath, + ThisImageHandle, + Handle, + EFI_OPEN_PROTOCOL_BY_DRIVER); + } else { + Status = pBS->CloseProtocol ( Handle, + &gEfiDevicePathProtocolGuid, + ThisImageHandle, + Handle); + } + + if (EFI_ERROR(pBS->ConnectController(Handle, NULL, pPath, TRUE))) + break; + } + + while (!isEndNode(pPath)) + pPath = NEXT_NODE(pPath); + } +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectAllAmdRaidController +// +// Description: Connect All Amd Raid Controller +// +// Input: +// None +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID ConnectAllAmdRaidController(){ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; + + TRACE((-1,"FB: ConnectAllAmdRaidController\n")); + + + //Get a list of all USB Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_MASS_STOR, PCI_CL_MASS_STOR_SCL_RAID, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + for(i=0; i<Number; i++) + { + EFI_PCI_IO_PROTOCOL *PciIo; + UINT16 VID; + Status=pBS->HandleProtocol(Handle[i],&gEfiPciIoProtocolGuid2,&PciIo); + if (EFI_ERROR(Status)) continue; + Status=PciIo->Pci.Read(PciIo, EfiPciIoWidthUint16, 0x00, 1, &VID); + if(VID == 0x1022) { + TRACE((-1,"FB: Connect AMD Raid Controller\n")); + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + } + + } + pBS->FreePool(Handle); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectLastHddDevice +// +// Description: Connect previous boot Hdd +// +// Input: +// None +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS ConnectLastHddDevice() +{ + EFI_DEVICE_PATH_PROTOCOL *Dp = gFastBootPolicy->FastBootOption; + EFI_DEVICE_PATH_PROTOCOL *TempDp = Dp; + EFI_GUID PciIoProtocolGuid = EFI_PCI_IO_PROTOCOL_GUID; + EFI_PCI_IO_PROTOCOL *PciIo; + EFI_STATUS Status; + EFI_HANDLE PciHandle; + UINT16 RaidDevCnt=0; +#if SUPPORT_RAID_DRIVER + SATA_DEVICE_PATH *SataDp; + UINT16 RaidPortNumber; + UINT16 i,j; +#endif + UINT16 ClassCode; + UINT16 VID; + + if (IsLegacyRaidDevicePath(Dp)) + { + // there is no port information in Legacy Raid device, so decide to + // connect all HDDs. + TRACE((-1, "FB: ConnectLastHddDevice - Find Legacy raid!\n")); + TRACE((-1, "FB: Attempt to connect all Sata Device\n")); + ConnectAllSataDevices(); + return EFI_SUCCESS; + } + + TRACE((-1, "FB: ConnectLastHddDevice\n")); + + TempDp = Dp; + + Status = pBS->LocateDevicePath(&PciIoProtocolGuid, &TempDp, &PciHandle); + if (EFI_ERROR(Status)) return Status; + + Status = pBS->HandleProtocol(PciHandle,&PciIoProtocolGuid,&PciIo); + if (EFI_ERROR(Status)) return Status; + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x0A,\ + 1,\ + &ClassCode); + ASSERT_EFI_ERROR(Status); + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x00,\ + 1,\ + &VID); + ASSERT_EFI_ERROR(Status); + + if (ClassCode != 0x0104 && ClassCode != 0x0106 && ClassCode != 0x0101) + return EFI_SUCCESS; //is not sata device, do Not try to connect it. + +#if SUPPORT_RAID_DRIVER + if(VID == 0x8086 && ClassCode == 0x0104) + { //Intel Raid + TempDp = Dp; + TempDp = FindDevicePath(TempDp,MESSAGING_DEVICE_PATH,MSG_SATA_DP); + SataDp = (SATA_DEVICE_PATH*)TempDp; + StopBlkIo = TRUE; + //check how many raid dev by checking bitmap + for (i=0;i<16;i++) { + if(SataDp->PortNumber & 1<<i) RaidDevCnt++; + } + RaidPortNumber = SataDp->PortNumber; + + Status = pBS->AllocatePool(EfiBootServicesData,DPLength(Dp),&TempDp); + ASSERT_EFI_ERROR(Status); + + MemCpy(TempDp,Dp,DPLength(Dp)); + + //connect each port + SataDp = (SATA_DEVICE_PATH*)FindDevicePath(TempDp,MESSAGING_DEVICE_PATH,MSG_SATA_DP); + for(j=0;j<16 && RaidDevCnt>0;j++) { + if(RaidPortNumber & 1<<j) + { + SataDp->PortNumber = j; + SataDp->MultiplierPortNumber = 0xFF; + RaidDevCnt--; + if (RaidDevCnt == 0) { + StopBlkIo = FALSE; + } + ConnectDevicePath_Recursive(TempDp); + } + } + + pBS->FreePool(TempDp); + + + } else { + ConnectDevicePath_Recursive(Dp); + } +#else + if(ClassCode == 0x0104) // RAID Mode + ConnectAllSataDevices(); + else + ConnectDevicePath_Recursive(Dp); +#endif + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectHddDevices +// +// Description: Connect all previous boot Hdds. +// +// Input: +// None +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if SUPPORT_RAID_DRIVER +EFI_STATUS ConnectHddDevices() +{ + UINT8 SataPort_DevPath[]= { + // ACPI Device Path + 0x02,0x01,0x0c,0x00,0xd0,0x41,0x03,0x0a,0x00,0x00,0x00,0x00, + //PCI Device Path + 0x01,0x01,0x06,0x00,0x02,0x1f, + //SATA Device Path + 0x03,0x12,0x0a,0x00,0x00,0x00,0xff,0xff,0x00,0x00, + //Terminal + 0x7f,0xff,0x04,0x00 + }; + + UINT8 IdePort_DevPath[]= { + // ACPI Device Path + 0x02,0x01,0x0c,0x00,0xd0,0x41,0x03,0x0a,0x00,0x00,0x00,0x00, + //PCI Device Path + 0x01,0x01,0x06,0x00,0x02,0x1f, + //SATA Device Path + 0x03,0x01,0x08,0x00,0x00,0x00,0x00,0x00, + //Terminal + 0x7f,0xff,0x04,0x00 + }; + + EFI_STATUS Status; + UINT8 i; + EFI_DEVICE_PATH_PROTOCOL *TempDp; + UINT8 Device,Function; + SATA_DEVICE_DATA *SataDevice = (SATA_DEVICE_DATA*)gFastBootPolicy->SataDevice; + EFI_DEVICE_PATH_PROTOCOL *Dp = gFastBootPolicy->FastBootOption; + + if (IsLegacyRaidDevicePath(Dp) && SataDevice[0].ClassCode == 0x0104) + { + TRACE((-1, "FB: Attempt to connect all Sata Device\n")); + ConnectAllSataDevices(); + return EFI_SUCCESS; + } + TRACE((-1, "FB: ConnectHddDevices\n")); + + for(i=0;i<MAX_SATA_DEVICE_COUNT && SataDevice[i].BDF!=0;i++) + { + if (SataDevice[i].DevType == ATAPI || SataDevice[i].DevType == PMPORT) + continue; + + if(SataDevice[i].ClassCode == 0x0106 || SataDevice[i].ClassCode == 0x0104) + { // AHCI or RAID + if(SataDevice[i].ClassCode == 0x0104) { + + StopBlkIo = TRUE; + } + Function = SataDevice[i].BDF & 0x03; + Device = (SataDevice[i].BDF >> 3) & 0x1F; + TempDp = FindDevicePath((EFI_DEVICE_PATH_PROTOCOL*)SataPort_DevPath,HARDWARE_DEVICE_PATH,HW_PCI_DP); + if (TempDp == NULL) { + StopBlkIo = FALSE; + continue; + } + ((PCI_DEVICE_PATH*)TempDp)->Device = Device; + ((PCI_DEVICE_PATH*)TempDp)->Function = Function; + + TempDp = FindDevicePath((EFI_DEVICE_PATH_PROTOCOL*)SataPort_DevPath,MESSAGING_DEVICE_PATH,MSG_SATA_DP); + ((SATA_DEVICE_PATH*)TempDp)->PortNumber = (UINT16)SataDevice[i].PortNum; + + ConnectDevicePath_Recursive((EFI_DEVICE_PATH_PROTOCOL*)SataPort_DevPath); + if (SataDevice[i + 1].BDF == 0) { + StopBlkIo = FALSE; + pBS->CloseProtocol ( gHandle, + &gEfiDevicePathProtocolGuid, + ThisImageHandle, + gHandle); + pBS->ConnectController(gHandle, NULL, NULL, TRUE); + } + Status = CheckConnectedHdd(SataDevice[i].BDF,SataDevice[i].ClassCode,SataDevice[i].PortNum); + if(EFI_ERROR(Status)) { + if (StopBlkIo == TRUE) { + StopBlkIo = FALSE; + pBS->CloseProtocol ( gHandle, + &gEfiDevicePathProtocolGuid, + ThisImageHandle, + gHandle); + } + return Status; + } + } + else if (SataDevice[i].ClassCode == 0x0101) + { //IDE + + Function = SataDevice[i].BDF & 0x03; + Device = (SataDevice[i].BDF >> 3) & 0x1F; + TempDp = FindDevicePath((EFI_DEVICE_PATH_PROTOCOL*)IdePort_DevPath,HARDWARE_DEVICE_PATH,HW_PCI_DP); + if (TempDp == NULL) continue; + ((PCI_DEVICE_PATH*)TempDp)->Device = Device; + ((PCI_DEVICE_PATH*)TempDp)->Function = Function; + + TempDp = FindDevicePath((EFI_DEVICE_PATH_PROTOCOL*)IdePort_DevPath,MESSAGING_DEVICE_PATH,MSG_ATAPI_DP); + ((ATAPI_DEVICE_PATH*)TempDp)->PrimarySecondary = SataDevice[i].PortNum & BIT0; + ((ATAPI_DEVICE_PATH*)TempDp)->SlaveMaster = SataDevice[i].PortNum & BIT1; + + ConnectDevicePath_Recursive((EFI_DEVICE_PATH_PROTOCOL*)IdePort_DevPath); + + Status = CheckConnectedHdd(SataDevice[i].BDF,SataDevice[i].ClassCode,SataDevice[i].PortNum); + if(EFI_ERROR(Status)) return Status; + } + } + + // Up to here, all recorded sata devcies are connected. + // + // But AHCIBUS would NOT be run in AMD Raid mode, so we don't know whether all Hdd is connect on Raid controller or not. + // Find out all AMD Raid controller and connect it. + + ConnectAllAmdRaidController(); + + return EFI_SUCCESS; +} +#endif + + //(EIP62845+)> +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectAllSataDevices +// +// Description: Connect All Stat Devcies +// +// Input: None +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS ConnectAllSataDevices() //(EIP85135) +{ + EFI_STATUS Status; + EFI_HANDLE *Handle; + UINTN Number,i; +// if (gFastBootPolicy->ConnectAllSata == FALSE) return; //(EIP96276.3)+ + + TRACE((-1, "FB: ConnectAllSataDevices\n")); + + //Connect all SATA IDE Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_MASS_STOR, PCI_CL_MASS_STOR_SCL_IDE, &Number, &Handle + ); + + if(!EFI_ERROR(Status)){ + for(i=0; i<Number; i++){ + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + } + pBS->FreePool(Handle); + } + + //Connect all SATA AHCI Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_MASS_STOR, 0x06, &Number, &Handle + ); + + if(!EFI_ERROR(Status)){ + for(i=0; i<Number; i++){ + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + } + pBS->FreePool(Handle); + } + + //(EIP95568+)> + //Connect all SATA RAID Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_MASS_STOR, PCI_CL_MASS_STOR_SCL_RAID, &Number, &Handle + ); + + if(!EFI_ERROR(Status)){ + for(i=0; i<Number; i++){ + pBS->ConnectController(Handle[i],NULL,NULL,TRUE); + } + pBS->FreePool(Handle); + } + //<(EIP95568+) + return EFI_SUCCESS; //(EIP85135) + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetSataPortPresentHOB +// +// Description: Get Sata port present HOB +// +// Input: +// IN OUT SATA_PRESENT_HOB **SataPresentHob +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if SUPPORT_RAID_DRIVER +EFI_STATUS GetSataPortPresentHOB ( + IN SATA_PRESENT_HOB **SataPresentHob + ) +{ + EFI_STATUS Status; + VOID *pHobList = NULL; + EFI_GUID guidHob = HOB_LIST_GUID; + EFI_GUID SataPresentHobGuid = AMI_SATA_PRESENT_HOB_GUID; +// SATA_PRESENT_HOB *pSataPresentHob; + + + pHobList = GetEfiConfigurationTable(pST, &guidHob); + if (!pHobList) return EFI_NOT_READY; + + *SataPresentHob = (SATA_PRESENT_HOB*)pHobList; + + while (!EFI_ERROR(Status = FindNextHobByType(EFI_HOB_TYPE_GUID_EXTENSION, SataPresentHob))) + { + if (guidcmp(&(*SataPresentHob)->EfiHobGuidType.Name, &SataPresentHobGuid) == 0) + break; + } + + + if (EFI_ERROR(Status)) return EFI_NOT_FOUND; + + return EFI_SUCCESS; +} +#endif + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CollectSataDeviceInfo +// +// Description: Collect the Sata device information created by Ahci and Ide +// bus driver +// +// Input: +// IN FAST_BOOT *Var - FastBoot variable +// +// Output: +// None +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if SUPPORT_RAID_DRIVER +VOID CollectSataDeviceInfo( + IN FAST_BOOT *Var +) +{ + EFI_GUID DiskInfoGuid = EFI_DISK_INFO_PROTOCOL_GUID; + EFI_GUID DiskInfoIdeGuid = EFI_DISK_INFO_IDE_INTERFACE_GUID; + EFI_GUID DiskInfoAhciGuid = EFI_DISK_INFO_AHCI_INTERFACE_GUID; + EFI_DISK_INFO_PROTOCOL *DiskInfoProtocol; + UINTN Count,i,j; + EFI_HANDLE *Handle; + EFI_STATUS Status; + static BOOLEAN Executed = FALSE; + UINTN Seg, Bus, Dev, Fun; + UINT8 SataDevCount = 0; + SATA_PRESENT_HOB *pSataPresentHob = NULL; + + if (Executed == TRUE) return; +// +// Collect the port present information reported by chipset +// + + Status = GetSataPortPresentHOB(&pSataPresentHob); + if (EFI_ERROR(Status)) { + TRACE((-1,"FB: Sata port present HOB is not found, need CSP porting for it\n")); + return; + } + + MemCpy(&Var->ControllerCount,&pSataPresentHob->ControllerCount,sizeof(SATA_PRESENT_HOB)-sizeof(EFI_HOB_GUID_TYPE)); + +// +// Collect the Sata device information created by Ahci and Ide bus driver +// + Status=pBS->LocateHandleBuffer(ByProtocol,&DiskInfoGuid,NULL,&Count,&Handle); + if (EFI_ERROR(Status)) return; + + for(i=0;i<Count;i++) + { + Status=pBS->HandleProtocol(Handle[i],&DiskInfoGuid,(VOID**)&DiskInfoProtocol); + if(EFI_ERROR(Status)) continue; + + if(!guidcmp(&DiskInfoProtocol->Interface,&DiskInfoIdeGuid)) { + // + //Devie is detected in Ide mode + // + IDE_BUS_PROTOCOL *IdeInterface = ((IDE_DISK_INFO*)DiskInfoProtocol)->IdeBusInterface; + EFI_PCI_IO_PROTOCOL *PciIo = IdeInterface->PciIO; + + Status = PciIo->GetLocation(PciIo, &Seg, &Bus, &Dev, &Fun); + ASSERT_EFI_ERROR(Status); + + Var->SataDevice[SataDevCount].BDF = (UINT16)((Bus << 8) | (Dev << 3) | Fun ); + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x0A,\ + 1,\ + &Var->SataDevice[SataDevCount].ClassCode); + ASSERT_EFI_ERROR(Status); + + + Var->SataDevice[SataDevCount].DevType = IdeInterface->IdeDevice.DeviceType; + Var->SataDevice[SataDevCount].PortNum = IdeInterface->IdeDevice.Channel | IdeInterface->IdeDevice.Device<<1; + + MemCpy( &Var->SataDevice[SataDevCount].SerialNum, + &IdeInterface->IdeDevice.IdentifyData.Serial_Number_10,20); + + SataDevCount++; + + ASSERT(SataDevCount<MAX_SATA_DEVICE_COUNT); + + }else if (!guidcmp(&DiskInfoProtocol->Interface,&DiskInfoAhciGuid)) { + // + //Devie is detected in Ahci mode + // + SATA_DEVICE_INTERFACE *SataInterface = ((SATA_DISK_INFO*)DiskInfoProtocol)->SataDevInterface; + EFI_PCI_IO_PROTOCOL *PciIo = SataInterface->AhciBusInterface->PciIO; + + Status = PciIo->GetLocation(PciIo, &Seg, &Bus, &Dev, &Fun); + ASSERT_EFI_ERROR(Status); + + Var->SataDevice[SataDevCount].BDF = (UINT16)((Bus << 8) | (Dev << 3) | Fun ); + + Status = PciIo->Pci.Read (PciIo,\ + EfiPciIoWidthUint16,\ + 0x0A,\ + 1,\ + &Var->SataDevice[SataDevCount].ClassCode); + ASSERT_EFI_ERROR(Status); + + Var->SataDevice[SataDevCount].DevType = SataInterface->DeviceType; + Var->SataDevice[SataDevCount].PortNum = SataInterface->PortNumber; + + MemCpy( &Var->SataDevice[SataDevCount].SerialNum, + &SataInterface->IdentifyData.Serial_Number_10,20); + + SataDevCount++; + + ASSERT(SataDevCount<MAX_SATA_DEVICE_COUNT); + + } else { + continue; + } + + } + +// +// Print out message for Sata Port&Device information. +// + + for(i=0;i<MAX_SATA_DEVICE_COUNT && Var->SataDevice[i].BDF!=0;i++) + { + TRACE((-1,"FB: SataDevice[%d] -- BDF:%x, CalssCode:%x, DveType:%x, PortNum:%x\n",\ + i,Var->SataDevice[i].BDF,Var->SataDevice[i].ClassCode,\ + Var->SataDevice[i].DevType,Var->SataDevice[i].PortNum)); + + TRACE((-1,"Serial Number: ")); + + for(j=0;j<20;j++) + { + TRACE((-1,"%02x ",Var->SataDevice[i].SerialNum[j])); + } + TRACE((-1," \n")); + } + + pBS->FreePool(Handle); + + return; +} +#endif + //<(EIP62845+) +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootReadyToBootNotify +// +// Description: FastBoot ReadyToBoot callback +// +// Input: +// IN EFI_EVENT Event - Callback event +// IN VOID *Context - pointer to calling context +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootReadyToBootNotify( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + EFI_STATUS Status; + UINTN i,Size; + FAST_BOOT Var; + UINT16 *BootOrder = NULL; + CHAR16 BootOptionName[9]; + EFI_LOAD_OPTION *BootOption = NULL; + UINTN BootOptionSize; //(EIP96276.4+) + CHAR16 *Description; + EFI_DEVICE_PATH_PROTOCOL *Dp; + UINT32 BbsPopup; + BOOLEAN VaildBootOption = FALSE; +#if FASTBOOT_NEED_RESTART + UINTN ReBootFlag; + UINTN ReBootFlagSize = sizeof(ReBootFlag); + UINTN ReBootCount; + UINTN ReBootCountSize = sizeof(ReBootCount); + UINTN ResetFlag = 1; + UINTN ClearCount = 0; +#endif + +//check if we are on bbs-popup boot path + Size = sizeof(BbsPopup); + Status = pRS->GetVariable(L"BbsPopupCalled", &FastBootVariableGuid, NULL, &Size, (VOID *)&BbsPopup); + if(!EFI_ERROR(Status) && (BbsPopup == 0x55aa55aa)) { //we are on bbs-popup boot path + ResetFastBootVariable(); //clear variable if it was created on previous boots + return; + } + + Size = sizeof(Var); + pBS->SetMem(&Var,Size,0); + + Status = pRS->GetVariable(L"LastBoot", &FastBootVariableGuid, NULL, &Size, (VOID *)&Var); + if(EFI_ERROR(Status)) { + +#if FASTBOOT_NEED_RESTART + Status = pRS->GetVariable(FAST_BOOT_RESTART, + &FastbootRestartGuid, + NULL, + &ReBootFlagSize, + (VOID *)&ReBootFlag + ); + + Status = pRS->GetVariable(FAST_BOOT_RESTART_COUNT, + &FastbootRestartCountGuid, + NULL, + &ReBootCountSize, + (VOID *)&ReBootCount + ); + if(!EFI_ERROR(Status)) + { + TRACE((-1,"FB: ReBootFlag:%d\n",ReBootFlag)); + TRACE((-1,"FB: ReBootCount:%d\n",ReBootCount)); + + if(ReBootFlag == 1 && ReBootCount <1 ) + FastBootEnableRestart(ReBootFlag,ReBootCount+1); + } + else + FastBootEnableRestart(ResetFlag,ClearCount+1); +#endif + + //variable not found - create a new one + +// +// Collect Boot Option information for next boot +// + Status = GetEfiVariable(L"BootOrder", &EfiVariableGuid, NULL, &Size, &BootOrder); + if(EFI_ERROR(Status)) return; + + for (i=0;i<Size/sizeof(UINT16);i++,BootOption=NULL) { //(EIP96276.4) + + Swprintf(BootOptionName, gBootName, BootOrder[i]); + + Status = GetEfiVariable(BootOptionName, &EfiVariableGuid, NULL, &BootOptionSize, &BootOption); //(EIP96276.4) + if(EFI_ERROR(Status)) return; + + + VaildBootOption = IsValidFBBootOptionPtr(i,BootOption); + if (VaildBootOption) break; + + pBS->FreePool(BootOption); + + if (VaildBootOption == FALSE && i == (Size/sizeof(UINT16) -1 )) { + TRACE((-1, "FB: There is no valid boot option\n")); + pBS->FreePool(BootOrder); + return; + + } + + } + + Var.BootOptionNumber = BootOrder[i]; + Var.BootCount = 0; + + //retrieve device path + Description = (CHAR16 *)(BootOption + 1); + Dp = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8*)Description + (Wcslen(Description) + 1) * sizeof(CHAR16)); + + if(Dp->Type == BBS_DEVICE_PATH) { + Var.BootType = FAST_BOOT_TYPE_LEGACY; + Status = CreateLegacyFastBootOption(&Var); + TRACE((-1,"FB: Create FastBoot Legacy Boot Option %r\n",Status)); + } else { + Var.BootType = FAST_BOOT_TYPE_EFI; + Status = CreateEfiFastBootOption(BootOption, BootOptionSize, BootOrder[i]); //(EIP96276.4) + TRACE((-1,"FB: Create FastBoot EFI Boot Option %r\n",Status)); + } + + pBS->FreePool(BootOrder); + pBS->FreePool(BootOption); + + if(EFI_ERROR(Status)) return; + +// +// Collect SATA Port&Device information +// +#if SUPPORT_RAID_DRIVER + CollectSataDeviceInfo(&Var); +#endif + + } else { + Var.BootCount++; + Var.BootOptionNumber = gFastBootPolicy->BootOptionNumber; + } + + TRACE((-1,"FB: Create LastBoot Variable\n")); + pRS->SetVariable(L"LastBoot", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(Var), + (VOID *)&Var); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectFastLegacyBoot +// +// Description: Connect Legacy FastBoot Device +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS ConnectFastLegacyBootDevice() +{ +#if CSM_SUPPORT + EFI_STATUS Status; + UINTN Size = 0; + UINT8 *BootOption = NULL; + EFI_DEVICE_PATH_PROTOCOL *Dp; + BOOLEAN UsbMassStorage = FALSE; + BOOLEAN HddFilePath = FALSE; + EFI_BLOCK_IO_PROTOCOL *BlockIo; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; + UINT16 HddCount; + UINT16 BbsCount; + HDD_INFO *HddInfo; + BBS_TABLE *BbsTable; + EFI_HANDLE Handle; + UINT8 i; //(EIP63924+) + TRACE((-1, "FB: Connect Fast LegacyBoot Device\n")); + + Dp = gFastBootPolicy->FastBootOption; + if(!IsSupportedDevice(Dp, &UsbMassStorage, &HddFilePath)) //CD-ROM legacy boot not supported + return EFI_NOT_FOUND; + + if ( UsbMassStorage && gFastBootPolicy->UsbSupport == 0) + return EFI_NOT_FOUND; //If skip usb enable, don't boot into usb mass storage + + if(!IsSataDevicePath(Dp) && !IsLegacyRaidDevicePath(Dp)) + { + TRACE((-1, "FB: Dp connecting\n")); + ConnectDevicePath(Dp); + } + + Status = pBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Dp, &Handle); + if(EFI_ERROR(Status)) + return Status; + TRACE((-1, "FB: Dp connected Handle %x\n",Handle)); + + LegacyBootDeviceHandle = Handle; + + Status = pBS->HandleProtocol(Handle, &gEfiBlockIoProtocolGuid, &BlockIo); + if(EFI_ERROR(Status)) + return Status; + TRACE((-1, "FB: BlockIo found\n")); + + Status = pBS->LocateProtocol(&gEfiLegacyBiosProtocolGuid, NULL, &LegacyBios); + if (EFI_ERROR(Status)) + return Status; + TRACE((-1, "FB: Legacybios discovered\n")); + + //(EIP63924)> + // check FastBootModeChange + for (i=0;FastBootModeChange[i]; i++) + if(FastBootModeChange[i]())return EFI_NOT_FOUND; + //<(EIP63924) + + Status = LegacyBios->GetBbsInfo(LegacyBios, &HddCount, &HddInfo, &BbsCount, &BbsTable); //install int 13 + if (EFI_ERROR(Status)) return EFI_NOT_FOUND; + +#endif + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastLegacyBoot +// +// Description: Legacy FastBoot path +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastLegacyBoot(VOID) +{ +#if CSM_SUPPORT + UINTN Size = 0; + EFI_STATUS Status; + UINT8 *BootOption = NULL; + UINT8 Index; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; + UINT16 HddCount; + UINT16 BbsCount; + HDD_INFO *HddInfo; + BBS_TABLE *BbsTable; + EFI_EVENT FastBootLegacyBootEvent; + UINT8 *pDeviceString; + UINT8 i; + UINT16 StringCheckSum; + + TRACE((-1, "FB: Fast legacy boot started\n")); + + //(EIP87390+)> + pBS->RaiseTPL( TPL_HIGH_LEVEL ); // guarantees that RestoreTPL won't ASSERT + pBS->RestoreTPL( TPL_APPLICATION ); + //<(EIP87390+) + Status = pBS->LocateProtocol(&gEfiLegacyBiosProtocolGuid, NULL, &LegacyBios); + if (EFI_ERROR(Status)) + return Status; + TRACE((-1, "FB: Legacybios discovered\n")); + + LegacyBios->GetBbsInfo(LegacyBios, &HddCount, &HddInfo, &BbsCount, &BbsTable); //install int 13 + + //(EIP87390+)> + //Set USB device BootPriority as BBS_DO_NOT_BOOT_FROM, Install USB INT13 service for TCG Bitlocker Driver + for (Index=0;Index<BbsCount;Index++){ + + //(EIP103422+)> + // if BBS table priority have been arranged already + // increase one priority to all prioritized BBS table entry + if (BbsTable[Index].BootPriority < BBS_DO_NOT_BOOT_FROM) { + BbsTable[Index].BootPriority = BbsTable[Index].BootPriority + 1; + continue; + } + //<(EIP103422+) + + // If BBS table priority have not been arranged yet, set device + // priority as BBS_DO_NOT_BOOT_FROM. + // It means don't boot from this devcie but BIOS still need to install + // INT13 service for it. + + if (BbsTable[Index].BootPriority != BBS_IGNORE_ENTRY) + BbsTable[Index].BootPriority = BBS_DO_NOT_BOOT_FROM; + + } + //<(EIP87390+) + + for (Index=0;Index<BbsCount;Index++){ + + if (BbsTable[Index].IBV1 == (UINT32)LegacyBootDeviceHandle) break; + + if (Index == (BbsCount-1)) return Status; //can't find fast device in bbstable + } + + if(gFastBootPolicy->CheckDevStrCheckSum) { + + pDeviceString = (UINT8*)((UINTN)((UINTN)BbsTable[Index].DescStringSegment<<4) + BbsTable[Index].DescStringOffset); + StringCheckSum =0; + for (i=0;i<50;i++) { + if (pDeviceString[i] == 0) break; + StringCheckSum+=pDeviceString[i]; + } + + if (StringCheckSum != gFastBootPolicy->DevStrCheckSum) return EFI_DEVICE_ERROR; + + } + + BbsTable[Index].BootPriority = 0; + + Status = CreateLegacyBootEvent(TPL_CALLBACK, + FastBootClearBootFailFlag, + NULL, + &FastBootLegacyBootEvent); + if (EFI_ERROR(Status)) + return Status; + + TRACE((-1,"FB: LEGACY BOOT Singal Ready to Boot\n")); + + ReadyToBoot(0xffff); + + //(EIP68329)> + if((SKIP_TSE_HANDSHAKE == 0) && (TSE_MAJOR >= 0x02) && (TSE_MINOR >= 0x10)) { + } else { + gFastBootTseProtocol->FastBootPasswordFreezeDevices(); + } + //<(EIP68329) + +//Set Runtime as TRUE before pass control to OS. + Runtime = TRUE; + + LegacyBios->LegacyBoot(LegacyBios, 0, 0, 0); + + return Status; +#else + return EFI_SUCCESS; +#endif +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckLoaderEx +// +// Description: This function use file system protocol to +// checks if OS loader present on given device +// +// Input: +// IN EFI_HANDLE Handle - Block io handle, used to get file system protocol +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - pointer to device path of bootable device +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CheckLoaderEx( + IN EFI_HANDLE Handle, + IN EFI_DEVICE_PATH_PROTOCOL *Dp) +{ + EFI_STATUS Status; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* SimpleFileSystem = NULL; + EFI_FILE_PROTOCOL *FileProtocol = NULL; + EFI_FILE_PROTOCOL* NewFileProtocol = NULL; + FILEPATH_DEVICE_PATH *BootOptionFilePath=NULL; + + for( ; !(isEndNode(Dp)); Dp = NEXT_NODE(Dp)) { + if(Dp->Type == MEDIA_DEVICE_PATH && Dp->SubType == MEDIA_FILEPATH_DP) { + BootOptionFilePath = (FILEPATH_DEVICE_PATH*) (Dp); + break; + } + } + if (BootOptionFilePath == NULL) { + return EFI_DEVICE_ERROR; + } + + Status = pBS->HandleProtocol ( + Handle, + &gEfiSimpleFileSystemProtocolGuid, + &SimpleFileSystem + ); + if(EFI_ERROR(Status)) { + return Status; + } + + Status = SimpleFileSystem->OpenVolume ( + SimpleFileSystem, + &FileProtocol + ); + if(EFI_ERROR(Status)) { + return Status; + } + + Status = FileProtocol->Open ( + FileProtocol, + &NewFileProtocol, + BootOptionFilePath->PathName, + EFI_FILE_MODE_READ, + NULL + ); + if(EFI_ERROR(Status)) { + return Status; + } + + NewFileProtocol->Close(NewFileProtocol); + return Status; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ConnectFastEfiBootDevice +// +// Description: Connect UEFI FastBoot Device +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS ConnectFastEfiBootDevice() +{ + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *Dp = gFastBootPolicy->FastBootOption; + UINT8 *BootOption = NULL; + UINTN Size = 0; + EFI_HANDLE Handle; + UINT8 i; //(EIP63924+) + TRACE((-1, "FB: Connect Fast EFIBoot Device\n")); + + if(IsBootToShell(Dp)) + InstallFwLoadFile(); + else { + if(!IsSataDevicePath(Dp)) + { + TRACE((-1, "FB: Dp connecting\n")); + ConnectDevicePath(Dp); + } + + Status = pBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Dp, &Handle); + if(EFI_ERROR(Status)) return Status; + TRACE((-1, "FB: Dp connected Handle %x\n",Handle)); + Status = CheckLoaderEx(Handle, gFastBootPolicy->FastBootOption); + if(EFI_ERROR(Status)) { + TRACE((-1, "FB: Check loader %r\n",Status)); + return Status; + } + + } + //(EIP63924)> + for (i=0;FastBootModeChange[i]; i++) + if(FastBootModeChange[i]())return EFI_NOT_FOUND; + //<(EIP63924) + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _ShellClearScreen +// +// Description: Clears the screen for shell boot +// +// Input: EFI_EVENT , VOID * +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _ShellClearScreen (EFI_EVENT Event, VOID *Context) +{ + pST->ConOut->ClearScreen (pST->ConOut); + pBS->CloseEvent (Event); + pST->ConOut->EnableCursor (pST->ConOut, TRUE); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _RegisterShellGuid +// +// Description: Registers the shell guid +// +// Input: VOID +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _RegisterShellGuid (VOID) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + VOID *Registration = NULL; + EFI_GUID EfiShellInterfaceGuid = EFI_SHELL_PROTOCOL_GUID; + EFI_EVENT ShellLaunchEvent; + Status = pBS->CreateEvent ( + EFI_EVENT_NOTIFY_SIGNAL, + TPL_CALLBACK, + _ShellClearScreen, + NULL, + &ShellLaunchEvent); + if (!EFI_ERROR (Status)) + { + Status = pBS->RegisterProtocolNotify( + &EfiShellInterfaceGuid, + ShellLaunchEvent, + &Registration + ); + } +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastEfiBoot +// +// Description: UEFI FastBoot path +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastEfiBoot(VOID) +{ + EFI_STATUS Status; + UINT8 *BootOption = NULL; + UINTN Size = 0; + UINT16 OptionNumber = 0xFFFF; + EFI_DEVICE_PATH_PROTOCOL *Dp = NULL; + UINTN DpSize; + UINT32 LoadOptionsSize; + VOID *LoadOptions; + EFI_LOADED_IMAGE_PROTOCOL *Image; + + TRACE((-1, "FB: Fast EFI boot started\n")); + + DpSize = DPLength(gFastBootPolicy->FastBootOption); + LoadOptionsSize = *(UINT32 *)((UINT8 *)gFastBootPolicy->FastBootOption + DpSize); + LoadOptions = (VOID *)((UINT8 *)gFastBootPolicy->FastBootOption + DpSize + sizeof(UINT32)); + + // this *MUST* be run a EFI_TPL_APPLICATION + pBS->RaiseTPL( TPL_HIGH_LEVEL ); // guarantees that RestoreTPL won't ASSERT (EIP87390)+ + pBS->RestoreTPL( TPL_APPLICATION ); + + TRACE((-1,"FB: EFI BOOT Signal Ready to Boot\n")); + +// +// ReadyToBoot have signaled already in TSE path. +// + if (gFastBootPolicy->SkipTSEHandshake) + ReadyToBoot(gFastBootPolicy->BootOptionNumber); + + + Status = pBS->LoadImage(TRUE, ThisImageHandle, gFastBootPolicy->FastBootOption, NULL, 0, &EFIBootImageHanlde); + + TRACE((-1,"FB: load image %r\n",Status)); + + if (EFI_ERROR(Status)) return Status; + if(LoadOptionsSize != 0) { + Status = pBS->HandleProtocol(EFIBootImageHanlde, &gEfiLoadedImageProtocolGuid, &Image); + if (EFI_ERROR(Status)) + return Status; + + Image->LoadOptionsSize = LoadOptionsSize; + Image->LoadOptions = LoadOptions; + } + //(EIP68329)> + if((gFastBootPolicy->SkipTSEHandshake == 0) && (TSE_MAJOR >= 0x02) && (TSE_MINOR >= 0x10)) { + } else { + gFastBootTseProtocol->FastBootPasswordFreezeDevices(); + } + PERF_END(0,L"FastBoot",L"FB",0); + PERF_END(0,L"TSE",L"FB",0); + //<(EIP68329) +#ifdef EFI_DXE_PERFORMANCE + SavePerformanceData(NULL, NULL); +#endif + + FastBootClearBootFailFlag(NULL, NULL); + + //(EIP60794+)> + if (pST->ConOut != NULL) { + pST->ConOut->EnableCursor(pST->ConOut,FALSE); + } + + _RegisterShellGuid(); + //<(EIP60794+) + + TRACE((-1,"FB: EFI BOOT start image\n")); + +//enabld usb mass driver, so that OS have chance to connect usb mass storage. + if (gUsbPolicyProtocol != NULL) + gUsbPolicyProtocol->UsbDevPlcy->UsbMassDriverSupport = TRUE; + +//Set Runtime as TRUE before pass control to OS. + Runtime = TRUE; + + IoWrite8(0x80,0xFB); //output 80port to show system boot with fast boot path. + Status = pBS->StartImage(EFIBootImageHanlde, NULL, NULL); + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CreateLegacyFastBootOption +// +// Description: This function creates Legacy fast boot option and save it to NVRAM +// +// Input: None +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateLegacyFastBootOption( + FAST_BOOT *Var +) +{ +#if CSM_SUPPORT + EFI_STATUS Status; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; + UINT16 HddCount; + UINT16 BbsCount; + HDD_INFO *HddInfo; + BBS_TABLE *BbsTable; + EFI_HANDLE Handle; + EFI_DEVICE_PATH_PROTOCOL *Dp; + UINT8 BootOption[200]; + UINTN DpSize; + UINT8 i; + UINT8 Index = 0; //(EIP73019+) + UINT16 Priority = 0xfffc; + UINT8 *pDeviceString; + UINT16 StringCheckSum=0; + + Status = pBS->LocateProtocol(&gEfiLegacyBiosProtocolGuid, NULL, &LegacyBios); + if(EFI_ERROR(Status)) + return Status; + + LegacyBios->GetBbsInfo(LegacyBios, &HddCount, &HddInfo, &BbsCount, &BbsTable); + +//find record with highest priority + for(i = 0; i < BbsCount; i++) { + if(BbsTable[i].BootPriority < Priority) { + Priority = BbsTable[i].BootPriority; + Index = i; + } + } + + if(BbsTable[Index].DeviceType != BBS_HARDDISK) + return EFI_UNSUPPORTED; + + Handle = (EFI_HANDLE) *(UINTN*)(&(BbsTable[Index].IBV1)); + Status = pBS->HandleProtocol(Handle, &gEfiDevicePathProtocolGuid, &Dp); + if(EFI_ERROR(Status)) + return Status; + + //save device string check sum + pDeviceString = (UINT8*)((UINTN)((UINTN)BbsTable[Index].DescStringSegment<<4) + BbsTable[Index].DescStringOffset); + + for (i=0;i<50;i++) { + if (pDeviceString[i] == 0) break; + StringCheckSum+=pDeviceString[i]; + } + + Var->DevStrCheckSum = StringCheckSum; + + DpSize = DPLength(Dp); + MemCpy(BootOption, Dp, DpSize); + + Status = pRS->SetVariable(L"FastBootOption", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + DpSize, + BootOption); + + return Status; +#else + return EFI_SUCCESS; +#endif +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsSupportedDevice +// +// Description: This function detects if FastBoot is supported for given device +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - pointer to device path of bootable device +// OUT BOOLEAN *UsbMassStorage - TRUE if device is USB device, FALSE otherwise +// +// Output: TRUE if FastBoot is supported for given device, FALSE otherwise +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsSupportedDevice( + IN EFI_DEVICE_PATH_PROTOCOL *Dp, + OUT BOOLEAN *UsbMassStorage, + OUT BOOLEAN *HddFilePath + +) +{ + BOOLEAN USBDev = FALSE; + + + for( ; !(isEndNode(Dp)); Dp = NEXT_NODE(Dp)) { + if(Dp->Type == BBS_DEVICE_PATH) + return FALSE; + + if(Dp->Type == MESSAGING_DEVICE_PATH) { + if(Dp->SubType == MSG_USB_DP) + USBDev = TRUE; + + if(Dp->SubType == MSG_MAC_ADDR_DP) + return FALSE; + + continue; + } + + if(Dp->Type == MEDIA_DEVICE_PATH) { + + if(Dp->SubType == MEDIA_HARDDRIVE_DP) { + + if(USBDev == TRUE) + *UsbMassStorage = TRUE; + + Dp = NEXT_NODE(Dp); + //check whether there is a file path behind hard drive path. + if(Dp->SubType == MEDIA_FILEPATH_DP) + *HddFilePath = TRUE; + + return TRUE; + } + + if(Dp->SubType == MEDIA_CDROM_DP) + return FALSE; + } + } + + return TRUE; +} +/* +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckLoader +// +// Description: This function checks if OS loader present on given device +// +// Input: +// IN EFI_DEVICE_PATH_PROTOCOL *Dp - pointer to device path of bootable device +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CheckLoader( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + Status = pBS->LoadImage(FALSE, ThisImageHandle, Dp, NULL, 0, &Handle); + if (EFI_ERROR(Status)) + return Status; + + Status = pBS->UnloadImage(Handle); + return Status; +} +*/ +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CreateEfiFastBootOption +// +// Description: This function creates UEFI fast boot option and save it to NVRAM +// +// Input: +// IN EFI_LOAD_OPTION *BootOption - pointer to regular boot option to boot to +// IN UINTN OptionSize - size of option additional parameters +// IN UINT16 OptionNumber - number of boot option in BootOrder variable +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateEfiFastBootOption( + IN EFI_LOAD_OPTION *BootOption, + IN UINTN OptionSize, + IN UINT16 OptionNumber +) +{ + EFI_STATUS Status; + UINTN Size; + UINTN DpSize; + EFI_DEVICE_PATH_PROTOCOL *Dp; + EFI_DEVICE_PATH_PROTOCOL *PartitionDp; + CHAR16 *Description; + UINT32 LoadOptionsSize; + VOID *LoadOptions; + UINT8 *FastBootOption; + VOID *SavePtr; + BOOLEAN UpdatedDp = FALSE; + BOOLEAN UsbMassStorage = FALSE; + BOOLEAN HddFilePath = FALSE; + EFI_HANDLE Handle; + +//retrieve device path + Description = (CHAR16 *)(BootOption + 1); + Dp = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8*)Description + (Wcslen(Description) + 1) * sizeof(CHAR16)); + + if(!IsSupportedDevice(Dp, &UsbMassStorage,&HddFilePath)) + return EFI_UNSUPPORTED; + + //only hard drive or USB can come here + + LoadOptions = (UINT8*)Dp + BootOption->FilePathListLength; + LoadOptionsSize = (UINT32)((UINT8*)BootOption + OptionSize - (UINT8 *)LoadOptions); + + if(Dp->Type == MEDIA_DEVICE_PATH && Dp->SubType == MEDIA_HARDDRIVE_DP) { //Windowns boot manager? + PartitionDp = DiscoverPartition(Dp); + if(PartitionDp == NULL) + return EFI_UNSUPPORTED; + + Dp = DPAdd(PartitionDp, NEXT_NODE(Dp)); + UpdatedDp = TRUE; + } else if (Dp->Type == MEDIA_DEVICE_PATH && Dp->SubType == MEDIA_VENDOR_DP) { // bulit in shell? + + } else if (HddFilePath == FALSE) { //add file path for SATA Hdd or USB Hdd without file path + Dp = DPAddNode(Dp, &FilePathNode.Header); + Status = pBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &Dp, &Handle); + if(EFI_ERROR(Status)) { + pBS->FreePool(Dp); + return Status; + } + Status = CheckLoaderEx(Handle, Dp); + if(EFI_ERROR(Status)) { +// pBS->FreePool(Dp); + return EFI_UNSUPPORTED; + } +// UpdatedDp = TRUE; + + } + + DpSize = DPLength(Dp); + +//prepare data + Size = DpSize + sizeof(UINT32) + LoadOptionsSize; + Status = pBS->AllocatePool(EfiBootServicesData, Size, &FastBootOption); + SavePtr = FastBootOption; + MemCpy(FastBootOption, Dp, DpSize); + FastBootOption += DpSize; + *(UINT32 *)FastBootOption = LoadOptionsSize; + FastBootOption += sizeof(UINT32); + MemCpy(FastBootOption, LoadOptions, LoadOptionsSize); + + Status = pRS->SetVariable(L"FastBootOption", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + Size, + SavePtr); + + pBS->FreePool(SavePtr); + if(UpdatedDp) + pBS->FreePool(Dp); + return Status; +} + +VOID ReturnToNormalBoot(VOID) +{ + UINT8 i; + for (i=0;ReturnNormalModeHook[i]; i++) + ReturnNormalModeHook[i](); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ResetFastBootVariable +// +// Description: This function resets FastBoot variable if FastBoot path failed +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID ResetFastBootVariable(VOID) +{ + UINTN Size = sizeof(FAST_BOOT); + FAST_BOOT Var; + + Runtime = FALSE; + +//clear LastBootFailed variable if present + FastBootClearBootFailFlag(NULL, NULL); + + if (!gFastBootPolicy->LastBootVarPresence) return; + + pRS->SetVariable(L"LastBoot", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE, + 0, + &Var); + +// Disable legacy16 fastboot support + DisableLegacy16Fastboot(); + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: DisconnectUsbController +// +// Description: This function resets skip table for Usb driver and disconnect +// all usb controllers +// +// Input: None +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DisconnectUsbController(VOID) +{ + + EFI_STATUS Status = EFI_SUCCESS; + EFI_HANDLE *Handle; + UINTN Number,i; + + if (gFastBootPolicy->UsbSupport != 2) return; + + //Restore Usb storage driver support + if (gUsbPolicyProtocol != NULL) + gUsbPolicyProtocol->UsbDevPlcy->UsbMassDriverSupport = BackupUsbMassDriverSupport; + + if (FBUsbSkipTableIsSet == FALSE) return; + +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) +{ + EFI_GUID gEfiUsbProtocolGuid = EFI_USB_PROTOCOL_GUID; + EFI_USB_PROTOCOL *UsbProtocol = NULL; + USB_GLOBAL_DATA *UsbData = NULL; + + Status = pBS->LocateProtocol( &gEfiUsbProtocolGuid, \ + NULL, \ + &UsbProtocol ); + if (EFI_ERROR(Status)) return; + + //restore backup skip table pointer + UsbData = (USB_GLOBAL_DATA*)UsbProtocol->USBDataPtr; + UsbData->gUsbSkipListTable = BackupSkipTable; +} +#endif + + //Get a list of all USB Controllers + Status = FbGetPciHandlesByClass( + PCI_CL_SER_BUS, PCI_CL_SER_BUS_SCL_USB, &Number, &Handle + ); + if (EFI_ERROR(Status)) return; + + for(i=0; i<Number; i++) + { + pBS->DisconnectController(Handle[i],NULL,NULL); + } + pBS->FreePool(Handle); + + +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OemConfigurationChanged +// +// Description: This function checks if configuration was changed since last boot +// +// Input: None +// +// Output: TRUE if configuration was changed, FALSE otherwise +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN OemConfigurationChanged(VOID) +{ + EFI_STATUS Status; + UINT32 BootFlow; + UINTN Size = sizeof(UINT32); + + Status = pRS->GetVariable(L"BootFlow", &guidBootFlow, NULL, &Size, &BootFlow); + + return (!EFI_ERROR(Status) && BootFlow == BOOT_FLOW_CONDITION_FIRST_BOOT) ? TRUE : FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootClearBootFailFlag +// +// Description: FastBoot clear boot fail flag callback +// +// Input: +// IN EFI_EVENT Event - Callback event +// IN VOID *Context - pointer to calling context +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootClearBootFailFlag( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + EFI_STATUS Status; + UINT32 LastBootFailed; + UINTN Size = sizeof(UINT32); + + Status = pRS->GetVariable(L"LastBootFailed", &FastBootVariableGuid, NULL, &Size, &LastBootFailed); + if(!EFI_ERROR(Status)) { + Status = pRS->SetVariable(L"LastBootFailed", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE, + 0, + &LastBootFailed); + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsFastBoot +// +// Description: This function FastBoot is enabled or disabled by checking +// elink "IsFastBootList" +// +// Input: None +// +// Output: TRUE if fast boot is enabled, FALSE otherwise +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsFastBoot(VOID) +{ + static EFI_GUID SetupVariableGuid = SETUP_GUID; + EFI_STATUS Status; + UINTN Size; + BOOLEAN Result = TRUE; + UINTN i; + EFI_GUID FastBootPolicyGuid = FAST_BOOT_POLICY_PROTOCOL_GUID; + + // init globe variable +#ifdef CMOS_MANAGER_SUPPORT + #if CMOS_MANAGER_SUPPORT + LOCATE_CMOS_ACCESS_PROTOCOL(Status, CmosInterface); + ASSERT_EFI_ERROR (Status); + #endif +#endif + + Status = pBS->LocateProtocol(&FastBootPolicyGuid,NULL,&gFastBootPolicy); + if (EFI_ERROR(Status) || gFastBootPolicy->FastBootEnable == FALSE) + return FALSE; + + Size = sizeof(FbSetupData); + Status = pRS->GetVariable(L"Setup", &SetupVariableGuid, NULL, &Size, &FbSetupData); + if (EFI_ERROR(Status)) return FALSE; + + + // check IsFastBootList + for (i=0;IsFastBootList[i] && Result; i++) + Result = IsFastBootList[i](&FbSetupData); + + + if (!Result) + ReturnToNormalBoot(); //return to normal boot + else + EnableLegacy16Fastboot(); + + return Result; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsFastBootDeafult +// +// Description: This function returns the status of Fast boot setup option +// +// Input: +// IN SETUP_DATA *FbSetupData - ptr of SetupData +// +// Output: TRUE if fast boot is enabled, FALSE otherwise +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN IsFastBootDefault ( + IN SETUP_DATA *FbSetupData +) +{ + static EFI_GUID SetupVariableGuid = SETUP_GUID; + + UINT16 BootNext; + UINTN Size; + EFI_STATUS Status; + EFI_BOOT_MODE BootMode; + BOOLEAN FastBoot; + + if (!gFastBootPolicy->FastBootEnable) return FALSE; + + BootMode = GetBootMode(); + + if (BootMode == BOOT_WITH_MINIMAL_CONFIGURATION) + return TRUE; + + if (!gFastBootPolicy->FirstFastBootInS4 && BootMode == BOOT_ON_S4_RESUME) { + if (gFastBootPolicy->LastBootVarPresence) + return (gFastBootPolicy->BootCount > 0) ? TRUE : FALSE; + } + +//Check for "BootNext" variable + Size = sizeof(BootNext); + Status = pRS->GetVariable(L"BootNext", &EfiVariableGuid, NULL, &Size, &BootNext); + if(!EFI_ERROR(Status)) { + FastBoot = FALSE; + } else { + FastBoot = gFastBootPolicy->FastBootEnable; + } + + return FastBoot; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: ChangeSetupBootFlow +// +// Description: Changea Setup Boot Flow +// +// Input: UINT32 BootFlow +// +// Output: EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS ChangeSetupBootFlow(UINT32 BootFlow) +{ + EFI_STATUS Status; + EFI_GUID guidBootFlow = BOOT_FLOW_VARIABLE_GUID; + + Status = pRS->SetVariable(L"BootFlow", + &guidBootFlow, + EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(BootFlow), + &BootFlow); + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsAmtBoot +// +// Description: Do NOT perform FastBoot if AMT boot is request. +// +// Input: +// IN SETUP_DATA *FbSetupData - ptr of SetupData +// +// Output: TRUE if fast boot is enabled, FALSE otherwise +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if iME_SUPPORT +#include "ReferenceCode\ME\Protocol\AlertStandardFormat\AlertStandardFormat.h" +#include "Board\EM\MeWrapper\AmtWrapper\Protocol\AmtWrapper\AmtWrapper.h" +BOOLEAN IsAmtBoot(IN SETUP_DATA *FbSetupData) +{ + EFI_GUID gEfiAmtWrapperProtocolGuidTse = EFI_AMT_WRAPPER_PROTOCOL_GUID; + EFI_GUID gEfiAlertStandardFormatProtocolGuid = EFI_ALERT_STANDARD_FORMAT_PROTOCOL_GUID; + AMT_WRAPPER_PROTOCOL *pAmtWrapper = NULL; + EFI_STATUS Status; + EFI_ALERT_STANDARD_FORMAT_PROTOCOL *AsfCheck; + EFI_ASF_BOOT_OPTIONS *mInternalAsfBootOptions; + + if (pAmtWrapper == NULL) { + Status = pBS->LocateProtocol(&gEfiAmtWrapperProtocolGuidTse, NULL, &pAmtWrapper); + } + + //case IDER + if (pAmtWrapper != NULL) { + if (pAmtWrapper->ActiveManagementEnableIdeR()||pAmtWrapper->ActiveManagementEnableSol()){ + ChangeSetupBootFlow(BOOT_FLOW_CONDITION_NORMAL); + return FALSE; //Is AMT boot, return FALSE for fast boot disabled. + } + } + + //case ASF + //Get the ASF options + //if set then we have to do and Asfboot + Status = pBS->LocateProtocol ( + &gEfiAlertStandardFormatProtocolGuid, + NULL, + &AsfCheck + ); + + if (EFI_ERROR (Status)) { + //Is not AMT boot, return TRUE for fast boot enabled. + return TRUE; + } + + Status = AsfCheck->GetBootOptions (AsfCheck, &mInternalAsfBootOptions); + + if (mInternalAsfBootOptions->SubCommand != ASF_BOOT_OPTIONS_PRESENT) + return TRUE; //Is not AMT boot, return TRUE for fast boot enabled. + else { + ChangeSetupBootFlow(BOOT_FLOW_CONDITION_NORMAL); + return FALSE; //Is AMT boot, return FALSE for fast boot disabled. + } + +} +#else // for order ME version + +#define AMI_AMT_BOOT_OPTION_GUID \ +{0x9ba25957, 0x21bf, 0x41d0, 0x81, 0xe7, 0xe7, 0xb6, 0xd8, 0x88, 0x2a, 0x49} + +BOOLEAN IsAmtBoot(IN SETUP_DATA *FbSetupData) +{ + EFI_GUID gAmtBootOptionGuid = AMI_AMT_BOOT_OPTION_GUID; + EFI_STATUS Status; + UINT16 AmtBootOption = NULL; + UINTN VariableSize = 0; + + // Get Device Type Variable of AMT Boot Option. + VariableSize = sizeof(UINT16); + + Status = pRS->GetVariable ( L"AmtBootOption", + &gAmtBootOptionGuid, + NULL, + &VariableSize, + &AmtBootOption ); + + if (EFI_ERROR(Status)) +//Is not AMT boot, return TRUE for fastboot enabled. + return TRUE; + else { +//Is AMT boot, return FALSE for fastboot disabled. + ChangeSetupBootFlow(BOOT_FLOW_CONDITION_NORMAL); + return FALSE; + } +} +#endif + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: TseHandShake +// +// Description: This function executes FastBoot path via AMI TSE boot manager +// +// Input: FAST_BOOT LastBoot - last successful fast boot information +// +// Output: EFI_ERROR - if fast boot via AMI TSE cannot be executed +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS TseHandShake() +{ + EFI_STATUS Status; + AMI_POST_MANAGER_PROTOCOL *AmiPostMgr; + UINT32 BootFlow; + EFI_HANDLE Handle = NULL; + + Status = pBS->LocateProtocol(&AmiPostMgrProtocolGuid, NULL, &AmiPostMgr); + if(EFI_ERROR(Status)) + return Status; + + if( gFastBootPolicy->UEfiBoot == TRUE) + FastBootProtocol.Launch = FastEfiBoot; + else + FastBootProtocol.Launch = FastLegacyBoot; + + Status = pBS->InstallMultipleProtocolInterfaces( + &Handle, + &AmiFastBootProtocolGuid, + &FastBootProtocol, + NULL); + + if(EFI_ERROR(Status)) + return Status; + + BootFlow = BOOT_FLOW_CONDITION_FAST_BOOT; + Status = pRS->SetVariable(L"BootFlow", + &guidBootFlow, + EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(BootFlow), + &BootFlow); + + if(EFI_ERROR(Status)) + return Status; + + TRACE((-1,"FB: TseHandShake\n")); + + Status = AmiPostMgr->Handshake(); + +//if we're here fast boot failed, change Boot flow back to BOOT_FLOW_CONDITION_NORMAL + + BootFlow = BOOT_FLOW_CONDITION_NORMAL; + Status = pRS->SetVariable(L"BootFlow", + &guidBootFlow, + EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(BootFlow), + &BootFlow); + return EFI_ABORTED; +} + +// +// Dummy console protocol +// +EFI_STATUS DummyInReset( + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, + IN BOOLEAN EV +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyReadKeyStroke( + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, + OUT EFI_INPUT_KEY *Key +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyReset( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN BOOLEAN EV +) +{ + return EFI_SUCCESS; +} + + +EFI_STATUS DummyOutputString( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN CHAR16 *String +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyTestString( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN CHAR16 *String) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyQueryMode( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN UINTN ModeNum, + OUT UINTN *Col, + OUT UINTN *Row +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummySetMode( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN UINTN ModeNum +) +{ + return EFI_SUCCESS; +} + + +EFI_STATUS DummySetAttribute( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN UINTN Attribute +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyClearScreen( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummySetCursorPosition( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN UINTN Column, + IN UINTN Row +) +{ + return EFI_SUCCESS; +} + +EFI_STATUS DummyEnableCursor( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, + IN BOOLEAN Visible ) +{ + return EFI_SUCCESS; +} + +BOOLEAN IsRuntime( + VOID +) +{ + return Runtime; +} + +VOID FbConnectInputDevices( + VOID +) +{ + FbConnectConInVariable(); +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/FastBoot.cif b/Core/EM/FastBoot/FastBoot.cif new file mode 100644 index 0000000..b69358b --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.cif @@ -0,0 +1,22 @@ +<component> + name = "Post Time Tuning" + category = eModule + LocalRoot = "Core\EM\FastBoot\" + RefName = "FastBoot" +[files] +"FastBoot.sdl" +"FastBoot.mak" +"FastBootRuntime.c" +"FastBootTseHook.c" +"FastBoot.c" +"PTT.chm" +"FastBoot.sd" +"FastBoot.uni" +"FastBootDxe.c" +[parts] +"FastBootPei" +"FastBootProtocol" +"FastBootIncludes" +"FastBootSMI" +"FastBootOption" +<endComponent> diff --git a/Core/EM/FastBoot/FastBoot.mak b/Core/EM/FastBoot/FastBoot.mak new file mode 100644 index 0000000..a20ed69 --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.mak @@ -0,0 +1,144 @@ +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* + +#************************************************************************* +# $Header: /Alaska/SOURCE/Modules/PTT/FastBoot.mak 7 4/10/12 8:48a Bibbyyeh $ +# +# $Revision: 7 $ +# +# $Date: 4/10/12 8:48a $ +#************************************************************************* +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/PTT/FastBoot.mak $ +# +# 7 4/10/12 8:48a Bibbyyeh +# [TAG] EIP87452 +# [Category] Improvement +# [Description] 1. Create an elink "ReturnNormalMode", OEM/ODM can link +# their procedure to handle the fastboot failure case. 2. Disconnect USB +# controller when return to normal mode. +# [Files] FastBoot.c FastBoot.h FastBoot.mak FastBoot.sdl +# +# 6 8/04/11 8:11a Bibbyyeh +# [TAG] EIP62845 +# [Category] New Feature +# [Description] Connect all Sata devices in fastboot path. +# [Files] FastBoot.c FastBoot.mak FastBoot.sdl +# +# 5 7/07/11 10:04a Bibbyyeh +# [TAG] EIP63924 +# [Category] Improvement +# [Description] +# 1. Add elink for FastBoot mode change, default checking rule is check +# post hotkey. +# 2. Timer call back for check hotkey is not necessary. Create a protocol +# for calling checkforkey in TSE. +# 3. Since EIP68383 improve the performance of ps2 keyboard, we don't +# need to exchange the initial order of ConIn/ConOut for getting more +# time to detect hotkey. +# [Files] FastBoot.sdl FastBoot.mak FastBoot.c FastBootTseHook.c +# FastBoot.h FastBootProtocol.h +# +# 4 6/22/11 11:44p Bibbyyeh +# [TAG] EIP62683 +# [Category] New Feature +# [Description] Add an Elink after AllDriverConnect in fastboot path +# [Files] FastBoot.c FastBoot.sdl FastBoot.mak +# +# 3 3/02/11 2:22a Bibbyyeh +# [TAG] EIP51391 +# [Category] Bug Fix +# [Severity] Normal +# [Symptom] In windows, use DmiEdit to change SMBIOS data, and update. +# SMBIOS will update failure in next boot. +# [RootCause] The reason cause this issue is, ROM will copy to ram in +# end of PEI phase. When SMBIOS Dxe driver update modified data to flash, +# the firmware volume block protocol is pointer to RAM, not flash. So it +# will cause update failure. +# [Solution] Before SMBIOS Dxe driver, restore the Base Address of +# Firmware Volume Block Protocol from RAM to ROM. +# [Files] FastBoot.sdl FastBoot.mak FastBoot.cif +# +# 2 2/22/11 4:04a Bibbyyeh +# [TAG] EIP54286 +# [Category] Improvement +# [Description] Add elink for IsFastBoot Function to overwirte it, it +# can help OEM/ODM to implement their "FAST BOOT" feature easily. +# [Files] FastBoot.sdl FastBoot.mak FastBoot.c +# +# 1 10/12/10 9:04a Bibbyyeh +# Initial check in +# +# +#************************************************************************* +#<AMI_FHDR_START> +# +# Name: FastBoot.mak +# +# Description: +# Make file to build Fastboot library part +# +#<AMI_FHDR_END> +#************************************************************************* + +CORE_DXEBin : $(BUILD_DIR)\FastBoot.obj $(BUILD_DIR)\FastBootDxe.obj + +RUNTIMEBin : $(BUILD_DIR)\FastBootRuntime.obj + +AMITSEBin : $(BUILD_DIR)\FastBootTseHook.obj + +#(EIP62683)(EIP63924)(EIP62845)> +{$(FastBoot_DIR)}.c{$(BUILD_DIR)}.obj:: + $(CC) $(CFLAGS) /I $(FastBoot_DIR) \ + /D\"IS_FAST_BOOT_LIST=$(IsFastBootList)\" \ + /D\"AFTER_ALL_DRIVER_CONNECT_HOOK=$(FastBootAfterAllDriverConnctHook)\" \ + /D\"FAST_BOOT_CHECK_MODE_CHANGE_HOOK=$(FastBootCheckModeChangeList)\" \ + /D\"BEFORE_CONNECT_FAST_BOOT_DEVICE_HOOK=$(BeforeConnectFastBootDeviceHook)\" \ + /D\"RETURN_NORMAL_MODE_HOOK=$(ReturnNormalMode)\" \ + /Fo$(BUILD_DIR)\ $< +#<(EIP62683)(EIP63924)(EIP62845) +$(BUILD_DIR)\FastBoot.obj : $(FastBoot_DIR)\FastBoot.c + +$(BUILD_DIR)\FastBootRuntime.obj : $(FastBoot_DIR)\FastBootRuntime.c + +$(BUILD_DIR)\FastBootTseHook.obj : $(FastBoot_DIR)\FastBootTseHook.c + +$(BUILD_DIR)\FastBootDxe.obj : $(FastBoot_DIR)\FastBootDxe.c +$(BUILD_DIR)\FastBoot.mak : $(FastBoot_DIR)\FastBoot.cif $(BUILD_RULES) + $(CIF2MAK) $(FastBoot_DIR)\FastBoot.cif $(CIF2MAK_DEFAULTS) + +#--------------------------------------------------------------------------- +# Create FastBoot Setup Component +#--------------------------------------------------------------------------- +SetupSdbs : FastBootSDB + +FastBootSDB : $(BUILD_DIR)\FastBoot.mak + $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\ + /f $(BUILD_DIR)\FastBoot.mak all\ + TYPE=SDB NAME=FastBoot STRING_CONSUMERS=$(FastBoot_DIR)\FastBoot.sd + +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* diff --git a/Core/EM/FastBoot/FastBoot.sd b/Core/EM/FastBoot/FastBoot.sd new file mode 100644 index 0000000..74609cc --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.sd @@ -0,0 +1,372 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBoot.sd 16 7/11/13 10:13p Simonchen $ +// +// $Revision: 16 $ +// +// $Date: 7/11/13 10:13p $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBoot.sd $ +// +// 16 7/11/13 10:13p Simonchen +// [TAG] EIP126196 +// [Category] Bug Fix +// [Severity] Minor +// [Symptom] If set two HDD password and use Raid mode, fastboot will +// [RootCause] Because when AHCI driver unlock first HDD, Raid driver +// will try to read all HDD, but second HDD is still lock, so access will +// fail. +// [Solution] Make sure all HDD unlock then Raid can access HDD. +// And add "Support Raid Driver" token to control fastboot support Raid +// feature or not. +// [Files] FastBoot.c +// FastBoot.sd +// FastBoot.sdl +// FastBootRuntime.c +// FastBoot.h +// +// 15 4/18/13 5:39a Simonchen +// [TAG] EIP113454 +// [Category] New Feature +// [Description] This eip is created for implement or experiment for +// Intel raid mode on fastboot. +// [Files] FastBoot.sdl +// FastBootRuntime.c +// FastBoot.c +// FastBoot.sd +// FastBoot.uni +// +// 14 1/28/13 10:10p Bibbyyeh +// [TAG] EIP113574 +// [Category] Spec Update +// [Severity] Normal +// [Description] Update the PTT eModule to utilize Setup Customization +// [Files] FastBoot.sd FastBoot.uni +// +// 13 8/10/12 3:23a Bibbyyeh +// [TAG] EIP96276 +// [Category] New Feature +// [Description] Function request for PTT_12 +// EIP96276.2 Fixed USB skip table issue. +// EIP96276.3 Add token ¡¥CONNECT_ALL_SATA_DEVICE_IN_FASTBOOT¡¦ to +// gFastBootPolicy. +// EIP96276.4 Add IsValidFBBootOptionPtr support by driver type. Exp : usb +// type skip or other type +// EIP96276.5 Add token ¡¥Test mode¡¨ to gFastBootPolicy Setup menu. +// EIP96276.6 Disable Tse Hotkey support in fastboot path. +// EIP96276.7 Modify TRACE message. +// [Files] FastBoot.c FastBoot.sd FastBoot.sdl FastBoot.uni +// FastBootRuntime.c FastBootProtocol.c +// +// 12 6/15/12 6:28a Bibbyyeh +// Add token "DEFAULT_VGA_SUPPORT_SETTING" , +// "DEFAULT_USB_SUPPORT_SETTING", "DEFAULT_PS2_SUPPORT_SETTING", and +// "DEFAULT_NETWORK_STACK_SUPPORT_SETTING" for Fast Boot default setup +// option. +// +// 11 6/12/12 10:14p Bibbyyeh +// Add a item "Auto" for fastboot "VGA Support". Only install Legacy OpRom +// only when previous boot is Legacy OS. +// +// 10 6/01/12 6:58a Bibbyyeh +// [TAG] EIP90455 +// [Category] New Feature +// [Description] PTT improvement - fastboot policy protocol for dynamic +// control fast boot behavior. +// [Files] FastBoot.c FastBoot.sdl FastBoot.sd FastBoot.uni +// FastBootRuntime.c FastBootTseHook.c FastBootProtocol.h FastBoot.h +// +// 9 5/29/12 4:44a Bibbyyeh +// Fix build fail issue if CSM and CsmOpOut moudle are removed. +// +// 8 4/09/12 8:05a Bibbyyeh +// Modify the default of SETUP_DATA.FastBoot as token DEFAULT_FAST_BOOT. +// +// 7 10/18/11 7:47a Bibbyyeh +// [TAG] EIP68563 +// [Category] Improvement +// [Description] Manufacturing Mode not set for the FastBoot setup +// options. +// [Files] FastBoot.sd +// +// 6 8/29/11 4:14a Bibbyyeh +// [TAG] EIP67571 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] All FastBoot setup options are enabled in manufacturing +// mode. +// [RootCause] MANUFACTURING is set in FastBoot Setup option. +// [Solution] Remove MANUFACTURING flag. +// [Files] FastBoot.sd +// +// 5 3/17/11 8:40a Bibbyyeh +// [TAG] EIP56151 +// [Category] Improvement +// [Description] PTT eModule has several compiled errors if CSM eModule +// is removed, that must be solved. +// [Files] FastBoot.c FastBoot.sd +// +// 4 3/17/11 7:18a Bibbyyeh +// [TAG] EIP56151 +// [Category] Improvement +// [Description] PTT eModule has several compiled errors if CSM eModule +// is removed, that must be solved. +// [Files] FastBoot.c FastBoot.sd +// +// 3 3/11/11 10:01p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +// 2 11/17/10 9:44a Bibbyyeh +// [TAG] EIP47397 +// [Category] Improvement +// [Description] 1. Move all console related functions into PTT module +// to avoid uncompatible with different core version. +// 2. Install dumy SimpleTextCoin protocol when pBS->ConIn & pBS-ConOut is +// Null. +// 3. Raise timer call back as TPL_HIGH_LEVEL level, it will give BIOS +// more chance to mode change successfully. +// 4. Remove FASTBOOT_CONSOLE_SETTING token.Add setup option for fastboot +// setting, "Skip VGA", "Skip USB", Skip "PS2". +// [Files] FastBoot.c +// FastBoot.h +// FastBoot.sd +// FastBoot.sdl +// FastBoot.uni +// +// 1 10/12/10 9:04a Bibbyyeh +// Initial check in +// +//********************************************************************** + +//********************************************************************** +//<AMI_FHDR_START> +// +// Name: FastBoot.sd +// +// Description: FastBoot Setup data definitions, currently go under Boot page +// +//<AMI_FHDR_END> +//********************************************************************** + +#ifdef SETUP_DATA_DEFINITION + UINT8 FastBoot; + UINT8 FbSata; + UINT8 FbVga; + UINT8 FbUsb; + UINT8 FbPs2; + UINT8 FbNetWrokStack; + UINT8 FbTestMode; //(EIP96276.5+) +#endif + +#if defined(VFRCOMPILE) && !defined(CONTROLS_ARE_DEFINED) +#define CONTROL_DEFINITION +#endif + +#ifdef CONTROL_DEFINITION +// +// Put control definitions here. +// + +#define FB_ONEOF_FASTBOOT\ + oneof varid = SETUP_DATA.FastBoot,\ + prompt = STRING_TOKEN(STR_FAST_BOOT),\ + help = STRING_TOKEN(STR_FAST_BOOT_HELP),\ + default = DEFAULT_FAST_BOOT,\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;\ + endoneof; + +#if SUPPORT_RAID_DRIVER +#define FB_ONEOF_FBSATA\ + oneof varid = SETUP_DATA.FbSata,\ + prompt = STRING_TOKEN(STR_FB_SATA),\ + help = STRING_TOKEN(STR_FB_SATA_HELP),\ + default = DEFAULT_SATA_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_SATA_LAST_BOOT_ONLY), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_SATA_ALL), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_SATA_HDD_ONLY), value = 2, flags = RESET_REQUIRED;\ + endoneof; +#else +#define FB_ONEOF_FBSATA\ + oneof varid = SETUP_DATA.FbSata,\ + prompt = STRING_TOKEN(STR_FB_SATA),\ + help = STRING_TOKEN(STR_FB_SATA_HELP),\ + default = DEFAULT_SATA_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_SATA_LAST_BOOT_ONLY), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_SATA_ALL), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + endoneof; +#endif + +#define FB_ONEOF_FBVGA\ + oneof varid = SETUP_DATA.FbVga,\ + prompt = STRING_TOKEN(STR_FB_VGA),\ + help = STRING_TOKEN(STR_FB_VGA_HELP),\ + default = DEFAULT_VGA_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_AUTO), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_VGA_DRIVER), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + endoneof; + + +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) + +#define FB_ONEOF_FBUSB\ + oneof varid = SETUP_DATA.FbUsb,\ + prompt = STRING_TOKEN(STR_FB_USB),\ + help = STRING_TOKEN(STR_FB_USB_HELP),\ + default = DEFAULT_USB_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_FULL_INIT), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_PATIAL_INIT), value = 2, flags = RESET_REQUIRED;\ + endoneof; + +#else + +#define FB_ONEOF_FBUSB\ + oneof varid = SETUP_DATA.FbUsb,\ + prompt = STRING_TOKEN(STR_FB_USB),\ + help = STRING_TOKEN(STR_FB_USB_HELP),\ + default = DEFAULT_USB_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_FULL_INIT), value = 1, flags = MANUFACTURING | RESET_REQUIRED; + endoneof; +#endif + +#define FB_ONEOF_FBPS2\ + oneof varid = SETUP_DATA.FbPs2,\ + prompt = STRING_TOKEN(STR_FB_PS2),\ + help = STRING_TOKEN(STR_FB_PS2_HELP),\ + default = DEFAULT_PS2_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + endoneof; + +#define FB_ONEOF_FBNETWORKSTACK\ + oneof varid = SETUP_DATA.FbNetWrokStack,\ + prompt = STRING_TOKEN(STR_FB_NETWORK_STACK),\ + help = STRING_TOKEN(STR_FB_NETWORK_STACK_HELP),\ + default = DEFAULT_NETWORK_STACK_SUPPORT_SETTING,\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | RESET_REQUIRED;\ + endoneof; + +#define FB_ONEOF_FBTESTMODE\ + oneof varid = SETUP_DATA.FbTestMode,\ + prompt = STRING_TOKEN(STR_FB_TEST),\ + help = STRING_TOKEN(STR_FB_TEST_HELP),\ + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;\ + endoneof;\ + +#endif //#ifdef CONTROL_DEFINITION + +#ifdef CONTROLS_WITH_DEFAULTS +// +// List macros of all the controls attached to the actual data. +// + FB_ONEOF_FASTBOOT + FB_ONEOF_FBSATA + FB_ONEOF_FBVGA + FB_ONEOF_FBUSB + FB_ONEOF_FBPS2 + FB_ONEOF_FBNETWORKSTACK + FB_ONEOF_FBTESTMODE + +#endif //#ifdef CONTROLS_WITH_DEFAULTS + +//Select Top level menu itmem (forset) for you pages +#ifdef BOOT_FORM_SET + #ifndef SUPPRESS_GRAYOUT_ENDIF //old Core + #define SUPPRESS_GRAYOUT_ENDIF endif; + #endif + +#ifdef FORM_SET_ITEM + + FB_ONEOF_FASTBOOT + + + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBSATA + SUPPRESS_GRAYOUT_ENDIF + +#if CSM_SUPPORT + suppressif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBVGA + endif; +#else + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 1; + FB_ONEOF_FBVGA + SUPPRESS_GRAYOUT_ENDIF +#endif //#if CSM_SUPPORT + + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBUSB + SUPPRESS_GRAYOUT_ENDIF + + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBPS2 + SUPPRESS_GRAYOUT_ENDIF + + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBNETWORKSTACK + SUPPRESS_GRAYOUT_ENDIF + +//(EIP96276.5+)>> +#if FAST_BOOT_TEST_MODE + suppressif ideqval SETUP_DATA.FastBoot == 0; + grayoutif ideqval SETUP_DATA.FastBoot == 0; + FB_ONEOF_FBTESTMODE + SUPPRESS_GRAYOUT_ENDIF +#endif //#if FAST_BOOT_TEST_MODE +//<<(EIP96276.5+) + +#endif //#ifdef FORM_SET_ITEM + +#endif //#ifdef BOOT_FORM_SET +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + diff --git a/Core/EM/FastBoot/FastBoot.sdl b/Core/EM/FastBoot/FastBoot.sdl new file mode 100644 index 0000000..63af312 --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.sdl @@ -0,0 +1,400 @@ +TOKEN + Name = "POST_TIME_TUNING_SUPPORT" + Value = "1" + Help = "Main switch to enable Post Time Tuning module in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + TargetH = Yes + Master = Yes +End + +TOKEN + Name = "FAST_BOOT_SUPPORT" + Value = "1" + Help = "Switch to enable FastBoot support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + TargetH = Yes + Lock = Yes +End + +TOKEN + Name = "PTT_VER" + Value = "15" + Help = "PTT module version" + TokenType = Integer + TargetH = Yes + Lock = Yes +End + +TOKEN + Name = "MAX_SATA_DEVICE_COUNT" + Value = "8" + Help = "Max count of Sata device are stored in LastBoot variable" + TokenType = Integer + TargetH = Yes + Lock = Yes +End + +TOKEN + Name = "FAST_BOOT_TEST_MODE" + Value = "0" + Help = "Please enable toekn 'DXE_PERFORMANCE' and 'PEI_PERFORMANCE' before enable this token." + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "SKIP_TSE_HANDSHAKE" + Value = "0" + Help = "On: Skip TSE execution on fast boot path, \Logo will not be shown.\Use FASTBOOT_MODE_CHANGE_HOTKEY to change mode.\At least keep one console in and one console out, if user need to support password security during fastboot.\\OFF: Keep TSE execution on fast boot path, " + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "ALLOW_FIRST_FASTBOOT_IN_S4" + Value = "1" + Help = "On: First FastBoot can be start when system power on from S4.\OFF: First FastBoot only can be start when system power on from S0." + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "USB_SKIP_TABLE" + Value = "{{0, 0, 0, 0, 0, 0}}" + Help = "This Table is only used when SetupOption 'Partial Initial' is selected.\This structure must end with zero structure." + TokenType = Expression + TargetH = Yes +End + +TOKEN + Name = "FAST_BOOT_PCI_SKIP_LIST" + Value = "{{0x01,0xFF},{0x03,0xFF},{0x06,0xFF}}" + Help = "(EIP85135)When enabled XHCI support difficult into setup menu in fastboot mode'\{ClassCode,SubClassCode}\{0x01,0xFF} Storage\{0x02,0xFF} NetWrok\{0x03,0xFF} VGA\{0x06,0xFF} Bridge" + TokenType = Expression + TargetH = Yes +End + +TOKEN + Name = "FAST_BOOT_TSE_HOTKEY_SUPPORT" + Value = "1" + Help = "(EIP96276.6)Change FastBoot mode and enter setup by TSE hotkey" + TokenType = Boolean +End + +TOKEN + Name = "LAST_BOOT_FAIL_MECHANISM" + Value = "1" + Help = "(EIP98617)Enter setup automatically if previous fast boot fail." + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "MAX_LAST_BOOT_FAIL_COUNT" + Value = "2" + Help = "Once fast boot fail count is reach this number, system will perform a full boot." + TokenType = Integer + TargetH = Yes + Token = "LAST_BOOT_FAIL_MECHANISM" "=" "0" +End + +TOKEN + Name = "OVERRIDE_FastBootLaunch" + Value = "1" + Help = "Fastboot Modules Overrides the FastBootLaunch() function of TSE" + TokenType = Boolean + TargetH = Yes + Token = "SKIP_TSE_HANDSHAKE" "=" "0" +End + +TOKEN + Name = "DEFAULT_FAST_BOOT" + Value = "0" + Help = "Default value of the Fast Boot option" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "DEFAULT_SATA_SUPPORT_SETTING" + Value = "1" + Help = "Default value of SATA Support option" + TokenType = Integer + TargetH = Yes +End + +TOKEN + Name = "DEFAULT_SATA_SUPPORT_SETTING" + Value = "2" + Help = "Default value of SATA Support option" + TokenType = Integer + TargetH = Yes + Token = "SUPPORT_RAID_DRIVER" "=" "1" +End + +TOKEN + Name = "DEFAULT_VGA_SUPPORT_SETTING" + Value = "1" + Help = "Default value of VGA Support option" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "DEFAULT_USB_SUPPORT_SETTING" + Value = "2" + Help = "Default value of USB Support option" + TokenType = Integer + TargetH = Yes +End + +TOKEN + Name = "DEFAULT_PS2_SUPPORT_SETTING" + Value = "1" + Help = "Default value of the PS2 Devices Support option" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "DEFAULT_NETWORK_STACK_SUPPORT_SETTING" + Value = "0" + Help = "Default value of NetWork Stack Driver Support option" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "COPY_ROM_TO_RAM_IN_PEI" + Value = "0" + Help = "Copy FV_BB and FV_MAIN to memory in PEI Phase, please disable it if PeiRamBoot is available in your project." + TokenType = Boolean +End + +TOKEN + Name = "CONNECT_EVERYTHING_IN_FASTBOOT" + Value = "1" + Help = "Connect all Pci Handles on fastboot path except the Pci class in the FAST_BOOT_PCI_SKIP_LIST" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "SINGAL_ALL_DRIVERS_CONNECTED_EVENT" + Value = "1" + Help = "Signal BDS_ALL_DRIVERS_CONNECTED_PROTOCOL_GUID on fastboot path" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" + Value = "1" + Help = "Call DXE dispatcher again on fastboot path" + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "AMILEGACY16_FASTBOOT_SOLUTION" + Value = "0" + Help = "CMOS 0x38 will used to store fastboot flag.\For legacy fast boot some changes in CSM module are required " + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "IS_VALID_FASTBOOT_BOOT_OPTION_FUNC" + Value = "IsValidFastBootOption" + Help = "Function to validate fastboot boot option" + TokenType = Expression + TargetH = Yes +End + +TOKEN + Name = "SUPPORT_RAID_DRIVER" + Value = "0" + Help = "Check if support for raid driver." + TokenType = Boolean + TargetH = Yes +End + +TOKEN + Name = "FASTBOOT_NEED_RESTART" + Value = "0" + Help = "Check if need to restart." + TokenType = Boolean + TargetH = Yes +End + +PATH + Name = "FastBoot_DIR" + Help = "Path to FastBoot Module in Project" +End + +MODULE + Help = "Includes FastBoot.mak to Project" + File = "FastBoot.mak" +End + +MODULE + Help = "Includes FastBootPei.mak to Project" + File = "FastBootPei.mak" +End + +ELINK + Name = "$(FastBoot_DIR)\FastBoot.sd" + Parent = "SETUP_DEFINITIONS" + Priority = 0 + InvokeOrder = AfterParent +End + +ELINK + Name = "$(BUILD_DIR)\FastBootPei.ffs" + Parent = "$(BUILD_DIR)\CPUPEI.ffs" + Priority = 0 + Token = "COPY_ROM_TO_RAM_IN_PEI" "=" "1" + InvokeOrder = BeforeParent +End + +ELINK + Name = "FastBootEntry," + Parent = "RuntimeInitialize" + InvokeOrder = AfterParent +End + +ELINK + Name = "FastBootConInAvailHook," + Parent = "ProcessConInAvailability," + InvokeOrder = ReplaceParent +End + +ELINK + Name = "FastBootBbsBootHook," + Parent = "BbsBoot," + InvokeOrder = ReplaceParent +End + +ELINK + Name = "FastBootMinisetupDriverEntryHook," + Parent = "MinisetupDriverEntryHookHook," + Help = "(EIP63924)Add an Elink for install fast boot tse protocol" + InvokeOrder = AfterParent +End + +ELINK + Name = "$(BUILD_DIR)\FastBoot.sdb" + Parent = "SETUP_SDBS" + InvokeOrder = AfterParent +End + +ELINK + Name = "IsFastBootDefault," + Parent = "IsFastBootList" + InvokeOrder = AfterParent +End + +ELINK + Name = "IsAmtBoot," + Parent = "IsFastBootList" + InvokeOrder = AfterParent + Token = "iAMT_SUPPORT" "=" "1" +End + +ELINK + Name = "CheckPostManagerKey," + Parent = "FastBootCheckModeChangeList" + Token = "FAST_BOOT_TSE_HOTKEY_SUPPORT" "=" "1" + InvokeOrder = AfterParent +End + + + +ELINK + Name = "FbConnectEverything," + Parent = "BeforeConnectFastBootDeviceHook" + Help = "(EIP85135)When enabled XHCI support difficult into setup menu in fastboot mode" + Token = "CONNECT_EVERYTHING_IN_FASTBOOT" "=" "1" + InvokeOrder = AfterParent +End + +ELINK + Name = "CallTheDispatcher," + Parent = "FastBootAfterAllDriverConnctHook" + Token = "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" "=" "1" + Token = "CORE_COMBINED_VERSION" ">" "0x40280" + InvokeOrder = BeforeParent +End + +ELINK + Name = "SignalAllDriversConnectedEvent," + Parent = "FastBootAfterAllDriverConnctHook" + Token = "SINGAL_ALL_DRIVERS_CONNECTED_EVENT" "=" "1" + Token = "CORE_COMBINED_VERSION" ">" "0x40280" + InvokeOrder = BeforeParent +End + +ELINK + Name = "FastBootDxeEntry," + Parent = "DxeCoreInitialize" + Priority = -255 + Token = "COPY_ROM_TO_RAM_IN_PEI" "=" "1" + InvokeOrder = AfterParent +End + +ELINK + Name = "IsFastBootList" + InvokeOrder = ReplaceParent +End + +ELINK + Name = "FastBootAfterAllDriverConnctHook" + Help = "(EIP62683)Add an Elink after all driver connect in PTT module" + InvokeOrder = ReplaceParent +End + +ELINK + Name = "FastBootCheckModeChangeList" + Help = "(EIP63924)Add an Elink for check mode change in PTT module" + InvokeOrder = ReplaceParent +End + +ELINK + Name = "BeforeConnectFastBootDeviceHook" + Help = "(EIP62845)Connect all sata devices in fastboot" + InvokeOrder = ReplaceParent +End + +ELINK + Name = "ResetFastBootVariable," + Parent = "ReturnNormalMode" + InvokeOrder = AfterParent +End + +ELINK + Name = "DisconnectUsbController," + Parent = "ReturnNormalMode" + InvokeOrder = AfterParent +End + +ELINK + Name = "ReturnNormalMode" + InvokeOrder = ReplaceParent +End + +ELINK + Name = "BeforeBDSFlow," + Parent = "BDS_CONTROL_FLOW" + InvokeOrder = BeforeParent +End + +ELINK + Name = "InitialRebootCount," + Parent = "ProcessEnterSetupHook," + InvokeOrder = AfterParent + Token = "FASTBOOT_NEED_RESTART" "=" "1" +End diff --git a/Core/EM/FastBoot/FastBoot.uni b/Core/EM/FastBoot/FastBoot.uni Binary files differnew file mode 100644 index 0000000..1fdd75b --- /dev/null +++ b/Core/EM/FastBoot/FastBoot.uni diff --git a/Core/EM/FastBoot/FastBootDxe.c b/Core/EM/FastBoot/FastBootDxe.c new file mode 100644 index 0000000..7c158b2 --- /dev/null +++ b/Core/EM/FastBoot/FastBootDxe.c @@ -0,0 +1,184 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootDxe.c 2 4/07/11 8:20a Bibbyyeh $ +// +// $Revision: 2 $ +// +// $Date: 4/07/11 8:20a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootDxe.c $ +// +// 2 4/07/11 8:20a Bibbyyeh +// [TAG] EIP57430 +// [Category] New Feature +// [Description] PTT module is not compatible with core 4.6.5.0. Modify +// it to make build pass. +// [Files] FastBootDxe.c +// +// 1 3/02/11 2:23a Bibbyyeh +// [TAG] EIP51391 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] In windows, use DmiEdit to change SMBIOS data, and update. +// SMBIOS will update failure in next boot. +// [RootCause] The reason cause this issue is, ROM will copy to ram in +// end of PEI phase. When SMBIOS Dxe driver update modified data to flash, +// the firmware volume block protocol is pointer to RAM, not flash. So it +// will cause update failure. +// [Solution] Before SMBIOS Dxe driver, restore the Base Address of +// Firmware Volume Block Protocol from RAM to ROM. +// [Files] FastBoot.sdl FastBoot.mak FastBoot.cif FastBootDxe.c +// +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBootDxe.c +// +// Description: +// Implementation of fast boot Dxe functionality +// +//<AMI_FHDR_END> +//************************************************************************* +//---------------------------------------------------------------------------- +// Includes +// Statements that include other files +#include <AmiDxeLib.h> +#include <AmiCspLib.h> +#include <Protocol\FirmwareVolumeBlock.h> +#include <FFS.h> +//---------------------------------------------------------------------------- +// Function Externs + +//---------------------------------------------------------------------------- +// Local prototypes +typedef struct { + UINTN Base; + UINTN Length; +} LBA_CACHE; + +typedef struct { + MEMMAP_DEVICE_PATH MemMapDevPath; + EFI_DEVICE_PATH_PROTOCOL EndDevPath; +} FV_DEVICE_PATH; + + +typedef struct { + UINTN Signature; + EFI_HANDLE Handle; + FV_DEVICE_PATH DevicePath; + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; + UINTN NumBlocks; + LBA_CACHE *LbaCache; + UINT32 FvbAttributes; + EFI_PHYSICAL_ADDRESS BaseAddress; +} EFI_FW_VOL_BLOCK_DEVICE; + +#define FVB_DEVICE_SIGNATURE EFI_SIGNATURE_32('_','F','V','B') + +#ifndef _CR +#define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))) +#endif +#ifndef CR +#define CR(Record, TYPE, Field, Signature) _CR (Record, TYPE, Field) +#endif + +#define FVB_DEVICE_FROM_THIS(a) \ + CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE) + + +//---------------------------------------------------------------------------- +// Local Variables +//---------------------------------------------------------------------------- +// Function Definitions +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: FastBootDxeEntry +// +// Description: DXE Entry Point for FastBoot Driver. +// +// Input: EFI_HANDLE - ImageHandle +// EFI_SYSTEM_TABLE* - SystemTable +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS +FastBootDxeEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + + EFI_GUID EfiFirmwareVolumeBlockProtocolGuid = FW_VOLUME_BLOCK_PROTOCOL_GUID; + EFI_STATUS Status; + UINTN NumHandles; + UINT8 i; + + EFI_HANDLE *HandleBuffer; + EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvBlock; + + + InitAmiLib(ImageHandle, SystemTable); + + TRACE((-1,"FB:Restore the Base Address of Firmware Volume Block Protocol from RAM to ROM\n")); +// Restore the Base Address of Firmware Volume Block Protocol from RAM +// to ROM. + Status = pBS->LocateHandleBuffer ( ByProtocol, \ + &EfiFirmwareVolumeBlockProtocolGuid, \ + NULL, \ + &NumHandles, \ + &HandleBuffer ); + if (EFI_ERROR(Status)) return Status; + + for (i = 0; i < NumHandles; ++i) { + Status = pBS->HandleProtocol ( HandleBuffer[i], \ + &EfiFirmwareVolumeBlockProtocolGuid, \ + &FvBlock ); + if (EFI_ERROR(Status)) continue; + FvbDevice = FVB_DEVICE_FROM_THIS (FvBlock); +#if PI_SPECIFICATION_VERSION < 0x00010000 + if (!(FvbDevice->FvbAttributes & EFI_FVB_MEMORY_MAPPED)) continue; +#else + if (!(FvbDevice->FvbAttributes & EFI_FVB2_MEMORY_MAPPED)) continue; +#endif + if (FvbDevice->NumBlocks == FV_BB_BLOCKS) + FvbDevice->BaseAddress = FV_BB_BASE; + else if (FvbDevice->NumBlocks == FV_MAIN_BLOCKS) + FvbDevice->BaseAddress = FV_MAIN_BASE; + + } + + return EFI_SUCCESS; +} +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2009, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//*************************************************************************
\ No newline at end of file diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.c b/Core/EM/FastBoot/FastBootOption/FastBootOption.c new file mode 100644 index 0000000..d05d0b9 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.c @@ -0,0 +1,433 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.c 2 7/14/13 10:52p Simonchen $ +// +// $Revision: 2 $ +// +// $Date: 7/14/13 10:52p $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.c $ +// +// 2 7/14/13 10:52p Simonchen +// [TAG] EIP129092 +// [Category] Improvement +// [Description] Add CloseEvent in OnExitBootServices in +// FastBootOption.c +// [Files] FastBootOption.c +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//<AMI_FHDR_START> +//--------------------------------------------------------------------------- +// +// Name: FastBootOption.c +// +// Description: FastBootOption Support +// +//--------------------------------------------------------------------------- +//<AMI_FHDR_END> + +#include "FastBootOption.h" +#include <Setup.h> +#include <Protocol\FastBootProtocol.h> + +#define EFI_TPL_NOTIFY TPL_NOTIFY + +#define BOOT_FLOW_CONDITION_FAST_BOOT 7 +#define BOOT_FLOW_CONDITION_NORMAL 0 + +EFI_EVENT gExitBootServicesEvent; +EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + +TempDeviceMap BootOptionTemp[]={ +// { TempUefiHddDevice, "UEFI:Hard Drive" }, + { TempUefiOddDevice, "UEFI:CD/DVD Drive" }, + { TempUefiRemDevice, "UEFI:Removable Device" }, + { TempUefiNetDevice, "UEFI:Network Device" } +}; + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: GetUEFIBootName +// +// Description: Get Variable Boot#### and return data pointer. +// +// Input: +// IN UINT16 BootIndex +// +// Output: +// EFI_LOAD_OPTION +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_LOAD_OPTION* GetUEFIBootName(IN UINT16 BootIndex) +{ +// EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + EFI_STATUS Status; + UINTN OptionSize; + CHAR16 BootVarName[15]; + EFI_LOAD_OPTION *BootOption = NULL; //buffer for BootXXX variables + + Swprintf( BootVarName, gBootName, BootIndex); //(EIP35562) + + OptionSize = 0; + Status = pRS->GetVariable( BootVarName, &EfiVariableGuid, NULL, &OptionSize, NULL); + if(Status != EFI_NOT_FOUND) + { + BootOption=Malloc( OptionSize ); + Status = pRS->GetVariable( BootVarName, &EfiVariableGuid, NULL, &OptionSize, BootOption); + return BootOption; + } + else + return NULL; + +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: AddBootOption +// +// Description: calculate devicepath length +// +// +// Input: IN UINT16 Number +// IN EFI_DEVICE_PATH_PROTOCOL *Dp +// IN UINT32 Attributes +// IN VOID *pOptions +// IN UINTN OptionsSize +// IN CHAR16 *DefaultName +// Output: +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS AddBootOption( + IN UINT16 Number, + IN EFI_DEVICE_PATH_PROTOCOL *Dp, + IN UINT32 Attributes, + IN VOID *pOptions, IN UINTN OptionsSize, IN CHAR16 *DefaultName +) +{ + + EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + EFI_LOAD_OPTION *Option; + UINTN Size=0, Length; + CHAR16 BootVarName[15]; //Boot0000 + CHAR16 NameStr[1024]; + EFI_STATUS Status; + + Length = DPLength(Dp); + + if ( !pOptions ) + OptionsSize=0; + else + { + Swprintf( NameStr, L"%S", pOptions ); + Size = (Wcslen(NameStr)+1)*sizeof(CHAR16); + } + //Size = (EfiStrLen(NameStr)+1)*sizeof(CHAR16); + Option = Malloc(sizeof(*Option)+Size+Length); + if (!Option) return EFI_OUT_OF_RESOURCES; + + Option->Attributes = Attributes; + Option->FilePathListLength = (UINT16)Length; + + if(OptionsSize) + pBS->CopyMem(Option+1, NameStr, Size); + + pBS->CopyMem((UINT8*)(Option+1)+Size, Dp, Length); + + Swprintf(BootVarName, gBootName, Number); + TRACE((-1,"[FastBootOption] Add %S (%S)\n", BootVarName, NameStr)); + Status = pRS->SetVariable( + BootVarName, &EfiVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(*Option)+Size+Length, Option + ); + + pBS->FreePool(Option); + return Status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Procedure: CreateBootOption +// +// Description: Create variable Boot#### +// +// +// Input: IN UINT16 OptionNumber +// IN UINT16 Index +// IN UINT16 DevType +// +// Output: +// +// Modified: +// +// Referrals: +// +// Notes: +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +void CreateBootOption(IN UINT16 OptionNumber, IN UINT16 DevType, CHAR8 *Description) +{ + +static struct { + BBS_BBS_DEVICE_PATH bbs; + EFI_DEVICE_PATH_PROTOCOL end; +} LegacyDp = + { + {{BBS_DEVICE_PATH,BBS_BBS_DP,sizeof(BBS_BBS_DEVICE_PATH)},0xff,0,0}, + {END_DEVICE_PATH,END_ENTIRE_SUBTYPE,sizeof(EFI_DEVICE_PATH_PROTOCOL)} + }; + + + LegacyDp.bbs.DeviceType = DevType; + + AddBootOption( + OptionNumber, &LegacyDp.bbs.Header, + LOAD_OPTION_ACTIVE, + Description, sizeof(Description) + 1, NULL); + +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CreateTempBootOption +// +// Description: This function is the entry point for FastBootOption Driver. +// +// Input: +// +// +// Output: +// +// +// Notes: +// +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CreateTempBootOption() +{ + EFI_STATUS Status = EFI_SUCCESS; + UINT16 *BootOrder = NULL, NewBootOrder[50]; + UINTN BootOrderSize = 0; + UINT16 MapIndex, i, BootIndex = 1; + BOOLEAN TempDeviceFound = FALSE; + + Status = GetEfiVariable( L"BootOrder", &EfiVariableGuid, NULL, &BootOrderSize, &BootOrder); + + if( !EFI_ERROR(Status) ) + { + for( i=0; i<BootOrderSize/sizeof(UINT16); i++) + { + EFI_LOAD_OPTION *BootOption=NULL; + BBS_BBS_DEVICE_PATH *BBSdp; + BootOption=GetUEFIBootName( BootOrder[i] ); + + if( BootOption ) + { + BBSdp = (BBS_BBS_DEVICE_PATH*) ((UINT8*)(BootOption+1) + +(Wcslen((CHAR16*)(BootOption+1))+1)*sizeof(CHAR16)); + + if( BBSdp->Header.Type == BBS_DEVICE_PATH ) + { + switch( BBSdp->DeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + TempDeviceFound=TRUE; + break; + } + } + + pBS->FreePool(BootOption); + } + + if( TempDeviceFound ) + break; + } + + pBS->CopyMem(NewBootOrder, BootOrder, BootOrderSize); + pBS->FreePool(BootOrder); + + //TRACE((-1,"CreateTempBootOption::TempDeviceFound(%d)\n", TempDeviceFound)); + //already create temp device? + if( TempDeviceFound ) + return EFI_SUCCESS; + } + + for( MapIndex=0; MapIndex<sizeof(BootOptionTemp)/sizeof(TempDeviceMap); MapIndex++) + { + for( i=0; i<BootOrderSize/sizeof(UINT16); i++) + { + if( NewBootOrder[i] == BootIndex ) + { + BootIndex++; + i=-1; + continue; + } + } + + NewBootOrder[i]=BootIndex; + BootOrderSize+=sizeof(UINT16); + + CreateBootOption( BootIndex, BootOptionTemp[MapIndex].DeviceTypeId, BootOptionTemp[MapIndex].TempName ); + } + + //Update Variable "BootOrder". + if( BootOrderSize ) + { + pRS->SetVariable( + L"BootOrder", + &EfiVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + BootOrderSize, + &NewBootOrder[0]); + } + + return Status; +} + + + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// +// Name: OnExitBootServices +// +// Description: EXIT_BOOT_SERVICES notification callback function. +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> + +VOID +OnExitBootServices( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + EFI_STATUS Status; + EFI_GUID FastBootPolicyGuid = FAST_BOOT_POLICY_PROTOCOL_GUID; + FAST_BOOT_POLICY *gFastBootPolicy; + EFI_GUID guidBootFlow = BOOT_FLOW_VARIABLE_GUID; + UINT32 BootFlow; + UINTN Size; + + TRACE((-1,"FastBootOption OnExitBootServices event .............\n")); + Status = pBS->LocateProtocol(&FastBootPolicyGuid,NULL,&gFastBootPolicy); + + TRACE((-1,"FastBootOption gFastBootPolicy->FastBootEnable = %d\n", gFastBootPolicy->FastBootEnable)); + if (EFI_ERROR(Status) || gFastBootPolicy->FastBootEnable == FALSE) { + pBS->CloseEvent (Event); + return; + } + Status = pRS->GetVariable(L"BootFlow", &guidBootFlow, NULL, &Size, &BootFlow); + TRACE((-1,"FastBootOption BootFlow = %d\n", BootFlow)); + + if(!EFI_ERROR(Status) && (BootFlow == BOOT_FLOW_CONDITION_FAST_BOOT)) + CreateTempBootOption(); + + pBS->CloseEvent (Event); +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootOptionEntryPoint +// +// Description: This function is the entry point for FastBootOption Driver. +// +// Input: +// EFI_HANDLE ImageHandle Image handle. +// EFI_SYSTEM_TABLE *SystemTable Pointer to the EFI system table. +// +// Output: +// EFI_SUCCESS Security interface installed. +// EFI_ERROR Security interface not installed or unable to locate +// some protocol. +// +// Notes: +// Entry Points are used to locate or install protocol interfaces and +// notification events. +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS FastBootOptionEntryPoint( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) +{ + EFI_HANDLE Handle = NULL; + EFI_STATUS Status = EFI_SUCCESS; + + InitAmiLib( ImageHandle, SystemTable ); + + TRACE((-1,"FastBootOptionEntryPoint.............\n")); + + pBS->CreateEvent ( + EVT_SIGNAL_EXIT_BOOT_SERVICES, + EFI_TPL_NOTIFY, + OnExitBootServices, + NULL, + &gExitBootServicesEvent + ); + + return Status; +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.cif b/Core/EM/FastBoot/FastBootOption/FastBootOption.cif new file mode 100644 index 0000000..1d5c216 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.cif @@ -0,0 +1,13 @@ +<component> + name = "FastBootOption" + category = ModulePart + LocalRoot = "Core\EM\FastBoot\FastBootOption\" + RefName = "FastBootOption" +[files] +"FastBootOption.sdl" +"FastBootOption.mak" +"FastBootOption.h" +"FastBootOption.c" +"FastBootOptionBds.c" +"FastBootOption.dxs" +<endComponent> diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs b/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs new file mode 100644 index 0000000..49592e6 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.dxs @@ -0,0 +1,66 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2007, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.dxs 1 10/30/12 4:22a Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.dxs $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//********************************************************************** + +//<AMI_FHDR_START> +//--------------------------------------------------------------------------- +// +// Name: FastBootOption.DXS +// +// Description: Dependency expression for FastBootOption driver. +// +//--------------------------------------------------------------------------- +//<AMI_FHDR_END> + +#include <Protocol/PciRootBridgeIo.h> + + +DEPENDENCY_START + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID +DEPENDENCY_END + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2007, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.h b/Core/EM/FastBoot/FastBootOption/FastBootOption.h new file mode 100644 index 0000000..b86eff7 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.h @@ -0,0 +1,96 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.h 1 10/30/12 4:22a Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.h $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//<AMI_FHDR_START> +//---------------------------------------------------------------------------- +// +// Name: <FastBootOption.h> +// +// Description: This file contains the Includes, Definitions, typedefs, +// Variable and External Declarations, Structure and +// function prototypes needed for the IdeSecurity driver +// +//---------------------------------------------------------------------------- +//<AMI_FHDR_END> + +#ifndef _FastBootOption_ +#define _FastBootOption_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <Efi.h> +#include <Token.h> +#include <Dxe.h> +#include <AmiDxeLib.h> +#include <Protocol\Devicepath.h> + +#if CORE_COMBINED_VERSION > 0x40280 //4.6.4.1 or Last +#define gBootName L"Boot%04X" +#else +#define gBootName L"Boot%04x" +#endif + +#define TempUefiHddDevice 0x80 +#define TempUefiOddDevice 0x81 +#define TempUefiRemDevice 0x82 +#define TempUefiNetDevice 0x83 + +typedef struct { + UINT16 DeviceTypeId; + CHAR8 *TempName; +} TempDeviceMap; + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif + +#endif + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.mak b/Core/EM/FastBoot/FastBootOption/FastBootOption.mak new file mode 100644 index 0000000..b7edc0c --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.mak @@ -0,0 +1,80 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2007, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.mak 1 10/30/12 4:21a Bibbyyeh $ +# +# $Revision: 1 $ +# +# $Date: 10/30/12 4:21a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOption.mak $ +# +# 1 10/30/12 4:21a Bibbyyeh +# [TAG] EIP105177 +# [Category] New Feature +# [Description] Report pseudo boot option for Windows 'Boot To Device' +# support +# [Files] FastBootOption.cif FastBootOption.sdl +# FastBootOption.mak FastBootOption.h FastBootOption.c +# FastBootOptionBds.c FastBootOption.dxs +# +#********************************************************************** +#<AMI_FHDR_START> +# +# Name: FastBootOption.mak +# +# Description: Make file to build FastBootOption Driver Sources. +# +#<AMI_FHDR_END> +#********************************************************************** +all : FastBootOption + +FastBootOption : $(BUILD_DIR)\FastBootOption.mak FastBootOptionBin + +$(BUILD_DIR)\FastBootOption.mak : $(FastBootOption_DIR)\$(@B).cif $(FastBootOption_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(FastBootOption_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +FastBootOptionBin: $(AMIDXELIB) + $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\ + /f $(BUILD_DIR)\FastBootOption.mak all\ + GUID=A58C5D1D-C22B-4845-90BC-8C94FCE96457\ + ENTRY_POINT=FastBootOptionEntryPoint \ + TYPE=BS_DRIVER \ + COMPRESS=1\ + "OBJECTS=$(BUILD_DIR)\$(FastBootOption_DIR)\FastBootOption.obj" + +CORE_DXE_LIBBin : $(BUILD_DIR)\FastBootOptionBds.obj + +#----------------------------------------------------------------------- +# AMICSP library files compilation +#----------------------------------------------------------------------- +{$(FastBootOption_DIR)}.c{$(BUILD_DIR)}.obj:: + $(CC) $(CFLAGS) /I $(FastBootOption_DIR) /I $(Foundation_DIR) /I $(CORE_DXE_DIR) /Fo$(BUILD_DIR)\ $< + +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2007, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl b/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl new file mode 100644 index 0000000..3e478b4 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOption.sdl @@ -0,0 +1,40 @@ +TOKEN + Name = "FastBootOption_SUPPORT" + Value = "1" + Help = "Main switch to enable FastBootOption support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + TargetH = Yes + Master = Yes + Token = "CORE_COMBINED_VERSION" ">=" "0x040281" +End + + +PATH + Name = "FastBootOption_DIR" +End + +MODULE + Help = "Includes FastBootOption.mak to Project" + File = "FastBootOption.mak" +End + +ELINK + Name = "$(BUILD_DIR)\FastBootOption.ffs" + Parent = "FV_MAIN" + Token = "FastBootOption_SUPPORT" "=" "1" + InvokeOrder = AfterParent +End + +ELINK + Name = "RemoveFastBootOption," + Parent = "ReadBootOptions," + InvokeOrder = AfterParent +End + +ELINK + Name = "SetBootNextBootOption," + Parent = "SaveBootOptions," + InvokeOrder = BeforeParent +End
\ No newline at end of file diff --git a/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c b/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c new file mode 100644 index 0000000..d9a8302 --- /dev/null +++ b/Core/EM/FastBoot/FastBootOption/FastBootOptionBds.c @@ -0,0 +1,274 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** +//********************************************************************** +// $Archive: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOptionBds.c $ +// +// $Author: Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 10/30/12 4:22a $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootOption/FastBootOptionBds.c $ +// +// 1 10/30/12 4:22a Bibbyyeh +// [TAG] EIP105177 +// [Category] New Feature +// [Description] Report pseudo boot option for Windows 'Boot To Device' +// support +// [Files] FastBootOption.cif FastBootOption.sdl +// FastBootOption.mak FastBootOption.h FastBootOption.c +// FastBootOptionBds.c FastBootOption.dxs +// +// +//*****************************************************************// + +//<AMI_FHDR_START> +//---------------------------------------------------------------------- +// +// Name: FastBootOptionBds.c +// +// Description: +// +//---------------------------------------------------------------------- +//<AMI_FHDR_END> + +//---------------------------------------------------------------------- +// Include Files +//---------------------------------------------------------------------- +#include <efi.h> +#include <amidxelib.h> +#include <protocol\blockio.h> +#include <protocol\devicepath.h> +#include <BootOptions.h> +#include "FastBootOption.h" +//--------------------------------------------------------------------------- +// Global Variable declarations +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// External functions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Function Definitions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Type definitions +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Constant and Variables declarations +//--------------------------------------------------------------------------- + BOOLEAN TempDeviceFound=FALSE; + UINT16 BootDeviceType=0; + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetUefiDeviceType +// +// Description: Function returns device type +// +// Input: EFI_DEVICE_PATH_PROTOCOL *Dp - +// +// Output: UINT32 - device type +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +UINT32 GetUefiDeviceType( + IN EFI_DEVICE_PATH_PROTOCOL *Dp +) +{ + EFI_DEVICE_PATH_PROTOCOL *DpPtr = Dp; + BOOLEAN IsUSB = FALSE; + + if( Dp == NULL ) + return 0xffff; + + for( ; !(isEndNode(DpPtr)); DpPtr = NEXT_NODE(DpPtr)) + { + if(DpPtr->Type == MESSAGING_DEVICE_PATH) + { + if(DpPtr->SubType == MSG_USB_DP) + IsUSB = TRUE; + + if(DpPtr->SubType == MSG_MAC_ADDR_DP) + return TempUefiNetDevice; + + continue; + } + + if(DpPtr->Type == MEDIA_DEVICE_PATH) + { + if(!IsUSB && DpPtr->SubType == MEDIA_HARDDRIVE_DP) + return TempUefiHddDevice; + else + if(!IsUSB && DpPtr->SubType == MEDIA_CDROM_DP) + return TempUefiOddDevice; + else + if(IsUSB && DpPtr->SubType == MEDIA_HARDDRIVE_DP) + { + return TempUefiRemDevice; + } + else + if(IsUSB && DpPtr->SubType == MEDIA_CDROM_DP) + return TempUefiOddDevice; + } + } + return 0xffff; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: SetBootNextBootOption +// +// Description: Compare Boot device type and re-setting variable "BootNext" +// +// Input: +// NONE +// Output: +// NONE +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +SetBootNextBootOption() +{ + EFI_STATUS Status; + DLINK *Link; + BOOT_OPTION *Option; + UINT16 BootNext; + UINTN Size; + + Size = sizeof(BootNext); + + if( TempDeviceFound ) + { + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + + if( GetUefiDeviceType(Option->FilePathList) == BootDeviceType ) + { + BootNext = Option->BootOptionNumber; + Status = pRS->SetVariable(L"BootNext", &EfiVariableGuid, BOOT_VARIABLE_ATTRIBUTES, Size, &BootNext); + TRACE((-1,"FastBootOptionBds.c:: SetVariable Status=%r BootNext=%d\n", Status, BootNext)); + } + + } + } +} + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: CheckBootNextTempBootOption +// +// Description: Check BootNext device and find uefi device, adjust BootNext +// number. +// Input: +// +// Output: +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +CheckBootNextTempBootOption() +{ + EFI_STATUS Status; + DLINK *Link; + BOOT_OPTION *Option; + UINT16 BootNext; + UINTN Size; + + Size = sizeof(BootNext); + Status = pRS->GetVariable(L"BootNext", &EfiVariableGuid, NULL, &Size, &BootNext); + + TRACE((-1,"FastBootOptionBds.c:: Status=%r BootNext=%d\n", Status, BootNext)); + + if( !EFI_ERROR( Status ) ) + { + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + BBS_BBS_DEVICE_PATH *BBSdp; + + if( BootNext == Option->BootOptionNumber ) + { + BBSdp=(BBS_BBS_DEVICE_PATH*)Option->FilePathList; + if( BBSdp->Header.Type == BBS_DEVICE_PATH ) + { + BootDeviceType = BBSdp->DeviceType; + switch( BootDeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + TempDeviceFound=TRUE; + break; + } + } + } + } + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: RemoveFastBootOption +// +// Description: Remove all TempUefiDevice Bootoption. +// +// Input: +// +// Output: +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +RemoveFastBootOption() +{ + + DLINK *Link; + BOOT_OPTION *Option; + + CheckBootNextTempBootOption(); + + FOR_EACH_BOOT_OPTION(BootOptionList,Link,Option){ + BBS_BBS_DEVICE_PATH *BBSdp; + BBSdp=(BBS_BBS_DEVICE_PATH*)Option->FilePathList; + + if( BBSdp->Header.Type == BBS_DEVICE_PATH ) + { + switch( BBSdp->DeviceType ) + { + case TempUefiHddDevice: + case TempUefiOddDevice: + case TempUefiRemDevice: + case TempUefiNetDevice: + Option->FwBootOption = TRUE; + break; + } + } + + } +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 6145-F Northbelt Pkwy, Norcross, GA 30071 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** diff --git a/Core/EM/FastBoot/FastBootPei.c b/Core/EM/FastBoot/FastBootPei.c new file mode 100644 index 0000000..5082095 --- /dev/null +++ b/Core/EM/FastBoot/FastBootPei.c @@ -0,0 +1,180 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootPei.c 2 11/09/10 8:43a Bibbyyeh $ +// +// $Revision: 2 $ +// +// $Date: 11/09/10 8:43a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootPei.c $ +// +// 2 11/09/10 8:43a Bibbyyeh +// [TAG] EIP47280 +// [Category] New Feature +// [Description] Currently, BIOS will copy FV_MAIN or FV_BB into memory +// in DXE phase. If BIOS copy rom before CPU disable flash cache in PEI +// phase. Some data are in cache already, don't need to read from physical +// ROM. It can help to save some time. +// [Files] FastBootPei.c +// +// 1 11/02/10 1:47a Bibbyyeh +// [TAG] EIP47280 +// [Category] New Feature +// [Description] Currently, BIOS will copy FV_MAIN or FV_BB into memory +// in DXE phase. +// If BIOS copy rom before CPU disable flash cache in PEI phase. +// Some data are in cache already, don't need to read from physical ROM. +// It can help to save some time. +// [Files] FastBootPei.cif +// FastBootPei.mak +// FastBootPei.c +// FastBootPei.dxs +// +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBootPei.c +// +// Description: +// Fast Boot Pei Driver +// +//<AMI_FHDR_END> +//************************************************************************* + +//============================================================================ +// Includes +//============================================================================ + +#include <AmiPeiLib.h> +#include <Pei.h> +#include <Token.h> + +//============================================================================ +// Glocal Variable Declaration +//============================================================================ +EFI_GUID gEfiPeiEndOfPeiPhasePpiGuid = EFI_PEI_END_OF_PEI_PHASE_PPI_GUID; + +EFI_STATUS NotifyAtPeiEnd ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi +); + +EFI_PEI_NOTIFY_DESCRIPTOR FastBootNotifyDescs = { + EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + &gEfiPeiEndOfPeiPhasePpiGuid, + NotifyAtPeiEnd +}; + + +//============================================================================ +// Procedure +//============================================================================ + +VOID CopyRomImageToRam(EFI_PEI_SERVICES **PeiServices) +{ + EFI_STATUS Status; + VOID *p; + EFI_HOB_FIRMWARE_VOLUME *FvHob; + EFI_PHYSICAL_ADDRESS MemoryBuffer; + EFI_PHYSICAL_ADDRESS FvHobAddress; + UINT64 FvHobLength; + + for( (*PeiServices)->GetHobList(PeiServices,&p) + ; !EFI_ERROR(FindNextHobByType(EFI_HOB_TYPE_FV,&p)) + ; + ) + { + FvHob = (EFI_HOB_FIRMWARE_VOLUME*)p; + FvHobAddress = FvHob->BaseAddress; + FvHobLength = FvHob->Length; + + if ( FvHobAddress == FV_MAIN_BASE || FvHobAddress == FV_BB_BASE) { + + // Allocate Memory + Status = (*PeiServices)->AllocatePages ( + PeiServices, + EfiBootServicesData, + EFI_SIZE_TO_PAGES ((UINT32)FvHobLength), + &MemoryBuffer + ); + ASSERT_PEI_ERROR (PeiServices, Status); + + // Copy FV HOB from ROM to RAM + (*PeiServices)->CopyMem ( + (VOID*)MemoryBuffer, + (VOID*)FvHobAddress, + (UINTN)FvHobLength + ); + + // Update FV HOB (BaseAddress) + FvHob->BaseAddress = MemoryBuffer; + } // end for + } // end if +} + + +EFI_STATUS NotifyAtPeiEnd ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi +) +{ + EFI_BOOT_MODE BootMode; + EFI_STATUS Status; + + Status = (*PeiServices)->GetBootMode(PeiServices, &BootMode); + ASSERT_PEI_ERROR(PeiServices, Status); + + + if ( (BootMode != BOOT_ON_S3_RESUME) && (BootMode != BOOT_IN_RECOVERY_MODE) ) { + CopyRomImageToRam(PeiServices); + } + return EFI_SUCCESS; +} + + +EFI_STATUS +FastBootPeiEntry ( + IN EFI_FFS_FILE_HEADER *FfsHeader, + IN EFI_PEI_SERVICES **PeiServices + ) +{ + (*PeiServices)->NotifyPpi( + PeiServices, + &FastBootNotifyDescs + ); + + + return EFI_SUCCESS; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/FastBootPei.cif b/Core/EM/FastBoot/FastBootPei.cif new file mode 100644 index 0000000..0243c5c --- /dev/null +++ b/Core/EM/FastBoot/FastBootPei.cif @@ -0,0 +1,11 @@ +<component> + name = "FastBootPei" + category = ModulePart + LocalRoot = "Core\EM\FastBoot" + RefName = "FastBootPei" +[files] +"FastBootPei.mak" +"FastBootPei.c" +"FastBootPei.dxs" +<endComponent> + diff --git a/Core/EM/FastBoot/FastBootPei.dxs b/Core/EM/FastBoot/FastBootPei.dxs new file mode 100644 index 0000000..1795a0b --- /dev/null +++ b/Core/EM/FastBoot/FastBootPei.dxs @@ -0,0 +1,56 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//**********************************************************************// +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootPei.dxs 1 11/02/10 1:47a Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 11/02/10 1:47a $ +//**********************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootPei.dxs $ +// +// 1 11/02/10 1:47a Bibbyyeh +// [TAG] EIP47280 +// [Category] New Feature +// [Description] Currently, BIOS will copy FV_MAIN or FV_BB into memory +// in DXE phase. +// If BIOS copy rom before CPU disable flash cache in PEI phase. +// Some data are in cache already, don't need to read from physical ROM. +// It can help to save some time. +// [Files] FastBootPei.cif +// FastBootPei.mak +// FastBootPei.c +// FastBootPei.dxs +// +//**********************************************************************// +DEPENDENCY_START + TRUE +DEPENDENCY_END + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/FastBootPei.mak b/Core/EM/FastBoot/FastBootPei.mak new file mode 100644 index 0000000..197ed46 --- /dev/null +++ b/Core/EM/FastBoot/FastBootPei.mak @@ -0,0 +1,95 @@ +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* + +#************************************************************************* +# $Header: /Alaska/SOURCE/Modules/PTT/FastBootPei.mak 1 11/02/10 1:47a Bibbyyeh $ +# +# $Revision: 1 $ +# +# $Date: 11/02/10 1:47a $ +#************************************************************************* +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/PTT/FastBootPei.mak $ +# +# 1 11/02/10 1:47a Bibbyyeh +# [TAG] EIP47280 +# [Category] New Feature +# [Description] Currently, BIOS will copy FV_MAIN or FV_BB into memory +# in DXE phase. +# If BIOS copy rom before CPU disable flash cache in PEI phase. +# Some data are in cache already, don't need to read from physical ROM. +# It can help to save some time. +# [Files] FastBootPei.cif +# FastBootPei.mak +# FastBootPei.c +# FastBootPei.dxs +# +# +#************************************************************************* +#<AMI_FHDR_START> +# +# Name: FastBootPei.mak +# +# Description: +# Make file to build FastBootPei FFS +# +#<AMI_FHDR_END> +#************************************************************************* +# MAK file for the eModule:Platform + +all : FastBootPei + +#--------------------------------------------------------------------------- +# Generic FastBootPei dependencies +#--------------------------------------------------------------------------- + +$(BUILD_DIR)\FastBootPei.mak : $(FastBoot_DIR)\FastBootPei.cif $(BUILD_RULES) + $(CIF2MAK) $(FastBoot_DIR)\FastBootPei.cif $(CIF2MAK_DEFAULTS) + + +#--------------------------------------------------------------------------- +# Create FastBoot PEI Component +#--------------------------------------------------------------------------- +FastBootPei : $(BUILD_DIR)\FastBootPei.mak FastBootPeiBin + + +FastBootPei_OBJECTS = $(BUILD_DIR)\$(FastBoot_DIR)\FastBootPei.obj + +FastBootPeiBin : $(AMIPEILIB) + $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\ + /f $(BUILD_DIR)\FastBootPei.mak all\ + NAME=FastBootPei\ + MAKEFILE=$(BUILD_DIR)\FastBootPei.mak \ + "CFLAGS=$(CFLAGS) /I$(FastBoot_DIR)"\ + OBJECTS="$(FastBootPei_OBJECTS)" \ + GUID=333BB2A3-4F20-4CCC-AC38-0672D7412345\ + ENTRY_POINT=FastBootPeiEntry \ + TYPE=PEIM \ + DEPEX1=$(FastBoot_DIR)\FastBootPei.DXS DEPEX1_TYPE=EFI_SECTION_PEI_DEPEX \ + COMPRESS=0 + +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#*************************************************************************
\ No newline at end of file diff --git a/Core/EM/FastBoot/FastBootRuntime.c b/Core/EM/FastBoot/FastBootRuntime.c new file mode 100644 index 0000000..f8f120d --- /dev/null +++ b/Core/EM/FastBoot/FastBootRuntime.c @@ -0,0 +1,526 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootRuntime.c 9 7/11/13 10:17p Simonchen $ +// +// $Revision: 9 $ +// +// $Date: 7/11/13 10:17p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootRuntime.c $ +// +// 9 7/11/13 10:17p Simonchen +// [TAG] EIP126196 +// [Category] Bug Fix +// [Severity] Minor +// [Symptom] If set two HDD password and use Raid mode, fastboot will +// fail. +// [RootCause] Because when AHCI driver unlock first HDD, Raid driver +// will try to read all HDD, but second HDD is still lock, so access will +// fail. +// [Solution] Make sure all HDD unlock then Raid can access HDD. +// And add "Support Raid Driver" token to control fastboot support Raid +// feature or not. +// [Files] FastBoot.c +// FastBoot.sd +// FastBoot.sdl +// FastBootRuntime.c +// FastBoot.h +// +// 8 4/18/13 5:39a Simonchen +// [TAG] EIP113454 +// [Category] New Feature +// [Description] This eip is created for implement or experiment for +// Intel raid mode on fastboot. +// [Files] FastBoot.sdl +// FastBootRuntime.c +// FastBoot.c +// FastBoot.sd +// FastBoot.uni +// +// 7 9/17/12 5:56a Bibbyyeh +// [TAG] EIP100456 +// [Category] New Feature +// [Description] If fast boot failure counter reach a +// MAX_LAST_BOOT_FAIL_COUNT, system will perform a full boot. +// [Files] FastBoot.sdl FastBootRuntime.c +// +// 6 8/20/12 2:22a Bibbyyeh +// [TAG] EIP98617 +// [Category] New Feature +// [Description] Add one token or other disable function to PTT enter +// Setup. +// [Files] FastBoot.sdl FastBootRuntime.c +// +// 5 8/10/12 3:25a Bibbyyeh +// [TAG] EIP96276 +// [Category] New Feature +// [Description] Function request for PTT_12 +// EIP96276.2 Fixed USB skip table issue. +// EIP96276.3 Add token ¡¥CONNECT_ALL_SATA_DEVICE_IN_FASTBOOT¡¦ to +// gFastBootPolicy. +// EIP96276.4 Add IsValidFBBootOptionPtr support by driver type. Exp : usb +// type skip or other type +// EIP96276.5 Add token ¡¥Test mode¡¨ to gFastBootPolicy Setup menu. +// EIP96276.6 Disable Tse Hotkey support in fastboot path. +// EIP96276.7 Modify TRACE message. +// [Files] FastBoot.c FastBoot.sd FastBoot.sdl FastBoot.uni +// FastBootRuntime.c FastBootProtocol.c +// +// 4 8/10/12 2:29a Bibbyyeh +// [TAG] EIP97515 +// [Category] Improvement +// [Description] According to the existence of user password, PTT can +// decide to skip "ProcessConInAvailability" automatically. +// [Files] FastBoot.sdl FastBootRuntime.c +// +// 3 6/01/12 6:55a Bibbyyeh +// [TAG] EIP90455 +// [Category] New Feature +// [Description] PTT improvement - fastboot policy protocol for dynamic +// control fast boot behavior. +// [Files] FastBoot.c FastBoot.sdl FastBoot.sd FastBoot.uni +// FastBootRuntime.c FastBootTseHook.c FastBootProtocol.h FastBoot.h +// +// 2 3/11/11 10:01p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +// 1 10/12/10 9:04a Bibbyyeh +// Initial check in +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBootRuntime.c +// +// Description: +// Implementation of callback when variable services is enabled +// +//<AMI_FHDR_END> +//************************************************************************* +//============================================================================ +// Includes +//============================================================================ + +#include <AmiDxeLib.h> +#include <Setup.h> +#include <Protocol/Variable.h> +#include "FastBoot.h" +#include <Protocol/FastBootProtocol.h> +#include <Protocol/AmiUsbController.h> +#include <token.h> +#include <AMIVfr.h> + +//============================================================================ +// Define +//============================================================================ + +//============================================================================ +// External Golbal Variable Declaration +//============================================================================ + +//============================================================================ +// External Function Definitions +//============================================================================ + +//============================================================================ +// Golbal Variable Declaration +//============================================================================ +static EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; +static EFI_GUID FastBootVariableGuid = FAST_BOOT_VARIABLE_GUID; +static EFI_GUID FastBootPolicyGuid = FAST_BOOT_POLICY_PROTOCOL_GUID; +FAST_BOOT_POLICY gFastBootPolicy; +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) +USB_SKIP_LIST DefaultSkipTable[] = USB_SKIP_TABLE; +#endif + +SKIP_PCI_LIST DeafultSkipPciList[]=FAST_BOOT_PCI_SKIP_LIST; +#if SUPPORT_RAID_DRIVER +SATA_DEVICE_DATA SataDeviceData[MAX_SATA_DEVICE_COUNT]; +#endif +//============================================================================ +// Function Definitions +//============================================================================ + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: GetSataPortPresentHOB +// +// Description: Get Sata port present HOB +// +// Input: +// IN OUT SATA_PRESENT_HOB **SataPresentHob +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if SUPPORT_RAID_DRIVER +EFI_STATUS GetSataPortPresentHOB ( + IN OUT SATA_PRESENT_HOB **SataPresentHob +) +{ + EFI_STATUS Status; + VOID *pHobList = NULL; + EFI_GUID guidHob = HOB_LIST_GUID; + EFI_GUID SataPresentHobGuid = AMI_SATA_PRESENT_HOB_GUID; + + pHobList = GetEfiConfigurationTable(pST, &guidHob); + if (!pHobList) return EFI_NOT_READY; + + *SataPresentHob = (SATA_PRESENT_HOB*)pHobList; + + while (!EFI_ERROR(Status = FindNextHobByType(EFI_HOB_TYPE_GUID_EXTENSION, SataPresentHob))) + { + if (guidcmp(&(*SataPresentHob)->EfiHobGuidType.Name, &SataPresentHobGuid) == 0) + break; + } + + + if (EFI_ERROR(Status)) return EFI_NOT_FOUND; + + return EFI_SUCCESS; +} +#endif +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: IsSataPortPresentChanged +// +// Description: Check whether Sata Port Present status is changed. +// +// Input: +// IN FAST_BOOT *FbVariable - Fast Boot Variable pointer +// +// Output: BOOLEAN TRUE - Sata port present status is changed. +// FALSE - Sata port present status is NOT changed. +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if SUPPORT_RAID_DRIVER +BOOLEAN IsSataPortPresentChanged(FAST_BOOT *FbVariable) +{ + SATA_PRESENT_HOB *pSataPresentHob; + EFI_STATUS Status; + UINT8 i; + Status = GetSataPortPresentHOB(&pSataPresentHob); + + if (EFI_ERROR(Status) && FbVariable->ControllerCount == 0) + { + TRACE((-1,"FB: Sata port present HOB is not found, need CSP porting for it\n")); + return FALSE; //CSP didn't report Sata port present HOB, Sata support policy would not work. + } + + // check whether Sata port present HOB is as same as previous boot totally. + if(!MemCmp(&pSataPresentHob->ControllerCount,&FbVariable->ControllerCount,sizeof(SATA_PRESENT_HOB)-sizeof(EFI_HOB_GUID_TYPE))) + return FALSE; + + TRACE((-1,"FB: Sata port present is changed\n")); + TRACE((-1,"Current: Controller count %x\n",pSataPresentHob->ControllerCount)); + for(i=0;i<4;i++) + TRACE((-1,"ClassCode %x,SataInfo %x\n",pSataPresentHob->SataInfo[i].ClassCode,pSataPresentHob->SataInfo[i].PresentPortBitMap)); + + + TRACE((-1,"Last: Controller count %x\n",FbVariable->ControllerCount)); + for(i=0;i<4;i++) + TRACE((-1,"ClassCode %x,SataInfo %x\n",FbVariable->SataInfo[i].ClassCode,FbVariable->SataInfo[i].PresentPortBitMap)); + + + return TRUE; +} +#endif + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: SetDefaultFastBootPolicy +// +// Description: Fill default Fast Boot Plicy +// +// Input: +// IN SETUP_DATA *SetupData - pointer to SetupData +// IN FAST_BOOT *FbVariable - pointer to FastBoot variable +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID SetDefaultFastBootPolicy(SETUP_DATA *SetupData,FAST_BOOT *FbVariable) +{ + EFI_STATUS Status; + UINT8 *BootOption = NULL; + UINTN Size = 0; + AMITSESETUP AmiTseData; + EFI_GUID AmiTseSetupGuid = AMITSESETUP_GUID; + UINTN VariableSize = 0; +#if SUPPORT_RAID_DRIVER + SATA_PRESENT_HOB *pSataPresentHob = NULL; +#endif + + gFastBootPolicy.TestMode = SetupData->FbTestMode; //(EIP96276.5) + + // + //Informatoin for pervious boot + // + gFastBootPolicy.UEfiBoot = FbVariable->BootType; + gFastBootPolicy.BootOptionNumber = FbVariable->BootOptionNumber; + gFastBootPolicy.CheckBootOptionNumber = TRUE; + gFastBootPolicy.DevStrCheckSum = FbVariable->DevStrCheckSum; + gFastBootPolicy.CheckDevStrCheckSum = TRUE; + gFastBootPolicy.BootCount = FbVariable->BootCount; + + Status = GetEfiVariable(L"FastBootOption", &FastBootVariableGuid, NULL, &Size, &BootOption); + gFastBootPolicy.FastBootOption = (EFI_DEVICE_PATH_PROTOCOL*)BootOption; +#if SUPPORT_RAID_DRIVER + MemCpy(SataDeviceData,FbVariable->SataDevice,sizeof(SATA_DEVICE_DATA)*MAX_SATA_DEVICE_COUNT); + gFastBootPolicy.SataDevice = SataDeviceData; +#endif + // + //Config Behavior in fastboot path + // + gFastBootPolicy.SataSupport = SetupData->FbSata; + gFastBootPolicy.VGASupport = SetupData->FbVga; + + gFastBootPolicy.UsbSupport = SetupData->FbUsb; +#if (((USB_DRIVER_MAJOR_VER*100 ) + (USB_DRIVER_MINOR_VER*10) + (USB_DRIVER_BUILD_VER)) >= 920) + gFastBootPolicy.UsbSkipTable = DefaultSkipTable; + gFastBootPolicy.UsbSkipTableSize = sizeof(DefaultSkipTable)/sizeof(USB_SKIP_LIST); //(EIP96276.2) +#endif + + gFastBootPolicy.Ps2Support = SetupData->FbPs2; + gFastBootPolicy.NetWorkStackSupport = SetupData->FbNetWrokStack; + + gFastBootPolicy.SkipPciList = DeafultSkipPciList; + gFastBootPolicy.SkipPciListSize = sizeof(DeafultSkipPciList); + gFastBootPolicy.SkipTSEHandshake = SKIP_TSE_HANDSHAKE; + gFastBootPolicy.FirstFastBootInS4 = ALLOW_FIRST_FASTBOOT_IN_S4; +// gFastBootPolicy.ConnectAllSata = CONNECT_ALL_SATA_DEVICE_IN_FASTBOOT; //(EIP113454)- + + // + //Check User and Amdin password + // + VariableSize = sizeof(AMITSESETUP); + Status = pRS->GetVariable ( L"AMITSESetup", \ + &AmiTseSetupGuid, \ + NULL, \ + &VariableSize, \ + &AmiTseData ); + + if (!EFI_ERROR(Status)) { + if (AmiTseData.UserPassword[0] != 0) { + TRACE((-1,"FB: User PW is set\n")); + //user password is set + gFastBootPolicy.CheckPassword = TRUE; + } + + if (AmiTseData.AdminPassword[0] != 0) { + TRACE((-1,"FB: Admin PW is set\n")); + //Admin password is set, don't do anything now. + } + } + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootGetVarCallback +// +// Description: FastBoot runtime callback +// +// Input: +// IN EFI_EVENT Event - Callback event +// IN VOID *Context - pointer to calling context +// +// Output: None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootGetVarCallback( + IN EFI_EVENT Event, + IN VOID *Context +) +{ + EFI_STATUS Status; + UINT32 Variable = 0; + FAST_BOOT FbVariable; + UINTN Size = sizeof(SETUP_DATA); + static EFI_GUID SetupVariableGuid = SETUP_GUID; + SETUP_DATA SetupData; + EFI_HANDLE Handle = NULL; + + static UINT32 BootFlow = BOOT_FLOW_CONDITION_FIRST_BOOT; + static EFI_GUID guidBootFlow = BOOT_FLOW_VARIABLE_GUID; + + //Initial fast boot policy + + pBS->SetMem(&gFastBootPolicy,sizeof(FAST_BOOT_POLICY),0); + + Status=pBS->InstallProtocolInterface( + &Handle, + &FastBootPolicyGuid, + EFI_NATIVE_INTERFACE, + &gFastBootPolicy + ); + ASSERT(!EFI_ERROR(Status)); + + Status = pRS->GetVariable(L"Setup", &SetupVariableGuid, NULL, &Size, &SetupData); + if (EFI_ERROR(Status) || SetupData.FastBoot == 0) + gFastBootPolicy.FastBootEnable = FALSE; + else if (SetupData.FastBoot == 1) + gFastBootPolicy.FastBootEnable = TRUE; + + Size = sizeof(FbVariable); + Status = pRS->GetVariable(L"LastBoot", &FastBootVariableGuid, NULL, &Size, (VOID *)&FbVariable); + if(EFI_ERROR(Status)) + gFastBootPolicy.LastBootVarPresence = FALSE; + else + gFastBootPolicy.LastBootVarPresence = TRUE; + + SetDefaultFastBootPolicy(&SetupData,&FbVariable); + +#if SUPPORT_RAID_DRIVER + if(gFastBootPolicy.LastBootVarPresence == TRUE && IsSataPortPresentChanged(&FbVariable)) + { + pRS->SetVariable(L"LastBoot", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE, + 0, + &Variable); + + gFastBootPolicy.LastBootVarPresence = FALSE; + + } +#endif + + + if (gFastBootPolicy.FastBootEnable == FALSE ||gFastBootPolicy.LastBootVarPresence == FALSE) + return; + + //(EIP98617)>> + + Size = sizeof(UINT32); + Status = pRS->GetVariable(L"LastBootFailed", &FastBootVariableGuid, NULL, &Size, &Variable); + if(EFI_ERROR(Status)) { + Variable = 0x55aa55aa; + Status = pRS->SetVariable(L"LastBootFailed", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + Size, + &Variable); + } else { +#if LAST_BOOT_FAIL_MECHANISM + //reset LastBootFailed variable + Status = pRS->SetVariable(L"LastBootFailed", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE, + 0, + &Variable); + //force setup + Status = pRS->SetVariable(L"BootFlow", + &guidBootFlow, + EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(BootFlow), + &BootFlow); + + gFastBootPolicy.LastBootFailure = TRUE; +#else + //check the fail count, if reach max count then perform a full boot + if (Variable == 0x55aa55aa) + Variable = 0x01; + else + Variable++; + + if (Variable == MAX_LAST_BOOT_FAIL_COUNT) { + + pRS->SetVariable(L"LastBoot", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE, + 0, + &FbVariable); + + gFastBootPolicy.LastBootVarPresence = FALSE; + + Variable = 0x55aa55aa; + } + + Status = pRS->SetVariable(L"LastBootFailed", + &FastBootVariableGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + Size, + &Variable); +#endif + } + + //<<(EIP98617) +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootEntry +// +// Description: FastBoot runtime callback entry point +// +// Input: +// IN EFI_HANDLE ImageHandle - Image handle +// IN EFI_SYSTEM_TABLE *SystemTable - pointer to system table +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastBootEntry( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + EFI_EVENT Event; + VOID *Registration; + static EFI_GUID VariableArchProtocolGuid = EFI_VARIABLE_ARCH_PROTOCOL_GUID; + + RegisterProtocolCallback(&VariableArchProtocolGuid, FastBootGetVarCallback, NULL, &Event, &Registration); + return EFI_SUCCESS; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/FastBootSMI.c b/Core/EM/FastBoot/FastBootSMI.c new file mode 100644 index 0000000..78fe114 --- /dev/null +++ b/Core/EM/FastBoot/FastBootSMI.c @@ -0,0 +1,244 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootSMI.c 1 3/11/11 10:07p Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 3/11/11 10:07p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootSMI.c $ +// +// 1 3/11/11 10:07p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBootSMI.c +// +// Description: +// Implementation of fast boot smi functionality +// +//<AMI_FHDR_END> +//************************************************************************* + +#include <AmiDxeLib.h> +#include <Token.h> +#include <Protocol\SmiFlash.h> +#include <Protocol\SmmBase.h> +#include <Protocol\SmmSwDispatch.h> +#include <Protocol\SmmGpiDispatch.h> +#include <Protocol\DevicePath.h> +#include <Protocol\LoadedImage.h> +#include "AmiSmm.h" +#include <Setup.h> +#include <token.h> + +EFI_GUID gSwSmiCpuTriggerGuid = SW_SMI_CPU_TRIGGER_GUID; +EFI_GUID SwDispatchProtocolGuid = EFI_SMM_SW_DISPATCH_PROTOCOL_GUID; + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: SwSmiHandler +// +// Description: SwSmiHandler +// +// Input: +// IN EFI_HANDLE DispatchHandle, +// IN EFI_SMM_SW_DISPATCH_CONTEXT *DispatchContext +// +// Output: +// VOID +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID SwSmiHandler( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_SW_DISPATCH_CONTEXT *DispatchContext +) +{ + EFI_SMM_CPU_SAVE_STATE *pCpuSaveState; + SW_SMI_CPU_TRIGGER *SwSmiCpuTrigger; + EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + UINT8 SwSmiNum; + UINTN i; + UINTN Cpu = pSmst->CurrentlyExecutingCpu - 1; + EFI_STATUS Status; + + // Search for software SMI entry + for (i = 0; i < pSmst->NumberOfTableEntries; ++i) { + if (guidcmp(&pSmst->SmmConfigurationTable[i].VendorGuid,&gSwSmiCpuTriggerGuid) == 0) { + break; + } + } + + // If table found, check for the CPU that caused the software SMI. + if (i != pSmst->NumberOfTableEntries) { // found? + SwSmiCpuTrigger = pSmst->SmmConfigurationTable[i].VendorTable; + Cpu = SwSmiCpuTrigger->Cpu; // got cpu number + } + + pCpuSaveState = pSmst->CpuSaveState; + + SwSmiNum = (UINT8)DispatchContext->SwSmiInputValue; + + // execute according to the software SMI value (from SW_SMI_IO_ADDRESS) + switch(SwSmiNum) + { + case FAST_BOOT_ENABLE_SWSMI: //enable fast boot + case FAST_BOOT_DISABLE_SWSMI: //disable fast boot + + { + EFI_GUID SetupGuid = SETUP_GUID; + UINTN SetupDataSize = sizeof(SETUP_DATA); + SETUP_DATA SetupData; + + Status = pRS->GetVariable( + L"Setup", + &SetupGuid, + NULL, + &SetupDataSize, + &SetupData); + + if (SwSmiNum == FAST_BOOT_ENABLE_SWSMI) + SetupData.FastBoot = 1; + else if (SwSmiNum == FAST_BOOT_DISABLE_SWSMI) + SetupData.FastBoot = 0; + + Status = pRS->SetVariable( + L"Setup", + &SetupGuid, + EFI_VARIABLE_NON_VOLATILE | \ + EFI_VARIABLE_BOOTSERVICE_ACCESS | \ + EFI_VARIABLE_RUNTIME_ACCESS, + SetupDataSize, + &SetupData); + break; + } + + + default: + break; + + } + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: InSmmFunction +// +// Description: InSmmFunction +// +// Input: +// IN EFI_HANDLE ImageHandle, +// IN EFI_SYSTEM_TABLE *SystemTable +// +// Output: +// EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS InSmmFunction( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + + EFI_SMM_SW_DISPATCH_PROTOCOL *SwDispatch; + EFI_SMM_SW_DISPATCH_CONTEXT SwSmiContext1; + EFI_SMM_SW_DISPATCH_CONTEXT SwSmiContext2; + EFI_GUID EfiVariableGuid = EFI_GLOBAL_VARIABLE; + EFI_HANDLE SwSmiHandle; + EFI_STATUS Status; + + SwSmiContext1.SwSmiInputValue = FAST_BOOT_ENABLE_SWSMI; + SwSmiContext2.SwSmiInputValue = FAST_BOOT_DISABLE_SWSMI; + + Status = pBS->LocateProtocol(&SwDispatchProtocolGuid, NULL, &SwDispatch); + if (EFI_ERROR(Status)) + return Status; + + Status = SwDispatch->Register( + SwDispatch, + SwSmiHandler, + &SwSmiContext1, + &SwSmiHandle + ); + + Status = SwDispatch->Register( + SwDispatch, + SwSmiHandler, + &SwSmiContext2, + &SwSmiHandle + ); + + return Status; + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootSMIEntryPoint +// +// Description: FastBootSMIEntryPoint +// +// Input: +// IN EFI_HANDLE ImageHandle, +// IN EFI_SYSTEM_TABLE *SystemTable +// +// Output: +// EFI_STATUS +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastBootSMIEntryPoint( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + InitAmiLib(ImageHandle,SystemTable); + + return InitSmmHandler(ImageHandle, SystemTable, InSmmFunction, NULL); +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + + diff --git a/Core/EM/FastBoot/FastBootSMI.cif b/Core/EM/FastBoot/FastBootSMI.cif new file mode 100644 index 0000000..82261c7 --- /dev/null +++ b/Core/EM/FastBoot/FastBootSMI.cif @@ -0,0 +1,12 @@ +<component> + name = "FastBootSMI" + category = ModulePart + LocalRoot = "CORE\EM\FastBoot\" + RefName = "FastBootSMI" +[files] +"FastBootSMI.sdl" +"FastBootSMI.c" +"FastBootSMI.dxs" +"FastBootSMI.mak" +<endComponent> + diff --git a/Core/EM/FastBoot/FastBootSMI.dxs b/Core/EM/FastBoot/FastBootSMI.dxs new file mode 100644 index 0000000..cfb9393 --- /dev/null +++ b/Core/EM/FastBoot/FastBootSMI.dxs @@ -0,0 +1,64 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootSMI.dxs 1 3/11/11 10:07p Bibbyyeh $ +// +// $Revision: 1 $ +// +// $Date: 3/11/11 10:07p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootSMI.dxs $ +// +// 1 3/11/11 10:07p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +// +//************************************************************************* + +#include <Protocol\SmmSwDispatch.h> + +DEPENDENCY_START + EFI_SMM_SW_DISPATCH_PROTOCOL_GUID +DEPENDENCY_END + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/FastBootSMI.mak b/Core/EM/FastBoot/FastBootSMI.mak new file mode 100644 index 0000000..429c9ee --- /dev/null +++ b/Core/EM/FastBoot/FastBootSMI.mak @@ -0,0 +1,82 @@ +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* +#************************************************************************* +# $Header: /Alaska/SOURCE/Modules/PTT/FastBootSMI.mak 1 3/11/11 10:07p Bibbyyeh $ +# +# $Revision: 1 $ +# +# $Date: 3/11/11 10:07p $ +#************************************************************************* +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/PTT/FastBootSMI.mak $ +# +# 1 3/11/11 10:07p Bibbyyeh +# [TAG] EIP54993 +# [Category] Improvement +# [Description] +# 1.Sync with Fastboot_10 +# 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +# 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +# 4.Use SimpleText protocol to detect mode change hotkey instead of +# pBS->ConIn. +# 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +# 6.Fixed a bug that SATA device can't be found if keep TSE execution on +# fastboot path. +# [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +# FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +# FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +# FastBootSMI.dxs FastBootSMI.mak +# +# +#************************************************************************* +#<AMI_FHDR_START> +# +# Name: FastBootSMI.mak +# +# Description: Make file for FastBoot SMI. +# +#<AMI_FHDR_END> +#************************************************************************* + +all : FastBootSMI + +FastBootSMI:$(BUILD_DIR)\FastBootSMI.mak FastBootSMIBin + +$(BUILD_DIR)\FastBootSMI.mak : $(FastBootSMI_DIR)\FastBootSMI.cif $(FastBootSMI_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(FastBootSMI_DIR)\FastBootSMI.cif $(CIF2MAK_DEFAULTS) + + +FastBootSMIBin : $(AMIDXELIB) $(AMICSPLib) + $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\ + /f $(BUILD_DIR)\FastBootSMI.mak all\ + GUID=D122882C-DA73-438B-A6B3-E07B7D18DB6F\ + ENTRY_POINT=FastBootSMIEntryPoint\ + TYPE=BS_DRIVER \ + COMPRESS=1 + +#************************************************************************* +#************************************************************************* +#** ** +#** (C)Copyright 1985-2010, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#************************************************************************* +#************************************************************************* + diff --git a/Core/EM/FastBoot/FastBootSMI.sdl b/Core/EM/FastBoot/FastBootSMI.sdl new file mode 100644 index 0000000..755fa0a --- /dev/null +++ b/Core/EM/FastBoot/FastBootSMI.sdl @@ -0,0 +1,40 @@ +TOKEN + Name = "FAST_BOOT_SMI_SUPPORT" + Value = "0" + Help = "Switch to enable FastBootSMI in the project." + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + TargetH = Yes + Master = Yes +End + +TOKEN + Name = "FAST_BOOT_ENABLE_SWSMI" + Value = "0xDB" + TokenType = Integer + TargetH = Yes +End + +TOKEN + Name = "FAST_BOOT_DISABLE_SWSMI" + Value = "0xDC" + TokenType = Integer + TargetH = Yes +End + +PATH + Name = "FastBootSMI_DIR" +End + +MODULE + Help = "Includes FastBootSMI.mak to Project" + File = "FastBootSMI.mak" +End + +ELINK + Name = "$(BUILD_DIR)\FastBootSMI.ffs" + Parent = "FV_MAIN" + InvokeOrder = AfterParent +End + diff --git a/Core/EM/FastBoot/FastBootTseHook.c b/Core/EM/FastBoot/FastBootTseHook.c new file mode 100644 index 0000000..b300244 --- /dev/null +++ b/Core/EM/FastBoot/FastBootTseHook.c @@ -0,0 +1,379 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/SOURCE/Modules/PTT/FastBootTseHook.c 8 7/17/13 2:59a Simonchen $ +// +// $Revision: 8 $ +// +// $Date: 7/17/13 2:59a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/PTT/FastBootTseHook.c $ +// +// 8 7/17/13 2:59a Simonchen +// [TAG] EIP125309 +// [Category] New Feature +// [Description] Add function to make sure before boot to OS, BIOS is in +// fastboot path. +// [Files] FastBoot.sdl +// FastBootTseHook.c +// FastBoot.c +// FastBoot.h +// +// 7 8/04/12 5:38a Bibbyyeh +// Fix logic defect in the if statement in procedure +// "FastBootCheckForKey". +// +// 6 6/01/12 6:56a Bibbyyeh +// [TAG] EIP90455 +// [Category] New Feature +// [Description] PTT improvement - fastboot policy protocol for dynamic +// control fast boot behavior. +// [Files] FastBoot.c FastBoot.sdl FastBoot.sd FastBoot.uni +// FastBootRuntime.c FastBootTseHook.c FastBootProtocol.h FastBoot.h +// +// 5 5/30/12 3:38a Bibbyyeh +// [TAG] EIP90874 +// [Category] Improvement +// [Description] Display "Press the DEL or ESC key to enter setup" +// message in fastboot path. +// [Files] FastBootTseHook.c +// +// 4 9/08/11 5:26a Bibbyyeh +// [TAG] EIP68329 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] OS can't back to desktop correctly after resumed from +// S3. +// [RootCause] TSEIDEPasswordFreezeDevices is skipped in fastboot path +// if SKIP_TSE_HANDSHAKE is enabled. +// [Solution] Call TSEIDEPasswordFreezeDevices after ReadyToBoot +// Event in fastboot path. +// [Files] FastBoot.c FastBootProtocol.h FastBootTseHook.c +// +// 3 7/07/11 10:38a Bibbyyeh +// [TAG] EIP63924 +// [Category] Improvement +// [Description] +// 1. Add elink for FastBoot mode change, default checking rule is check +// post hotkey. +// 2. Timer call back for check hotkey is not necessary. Create a protocol +// for calling checkforkey in TSE. +// 3. Since EIP68383 improve the performance of ps2 keyboard, we don't +// need to exchange the initial order of ConIn/ConOut for getting more +// time to detect hotkey. +// [Files] FastBoot.sdl FastBoot.mak FastBoot.c FastBootTseHook.c +// FastBoot.h FastBootProtocol.h +// +// 2 3/11/11 10:01p Bibbyyeh +// [TAG] EIP54993 +// [Category] Improvement +// [Description] +// 1.Sync with Fastboot_10 +// 2.Remove token "SAVE_LAST_BOOT_DEVICE_CHECKSUM" +// 3.Add token "CALL_DISPATCHER_AGAIN_IN_FASTBOOT" +// 4.Use SimpleText protocol to detect mode change hotkey instead of +// pBS->ConIn. +// 5.Simplify the code about "AMILEGACY16_FASTBOOT_SOLUTION". +// 6.Fixed a bug that SATA device can't be found if keep TSE execution on +// fastboot path. +// [Files] PPT.cif FastBoot.sdl FastBootRuntime.c FastBootTseHook.c +// FastBoot.c FastBoot.h FastBoot.sd FastBootProtocol.cif +// FastBootProtocol.h FastBootSMI.cif FastBootSMI.sdl FastBootSMI.c +// FastBootSMI.dxs FastBootSMI.mak +// +// 1 10/12/10 9:04a Bibbyyeh +// Initial check in +// +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: FastBootTseHook.c +// +// Description: +// Implementation of suppress of TSE "Press DEL..." message +// +//<AMI_FHDR_END> +//************************************************************************* +//============================================================================ +// Includes +//============================================================================ + +#include <Efi.h> +#include <Setup.h> +#include <Protocol/FastBootProtocol.h> +#include "FastBoot.h" +#include "AMITSEStrTokens.h" +#if FASTBOOT_NEED_RESTART +#include <AmiDxeLib.h> +#endif +//============================================================================ +// Define +//============================================================================ +#define BOOT_FLOW_CONDITION_NORMAL 0 + +#if FASTBOOT_NEED_RESTART +static EFI_GUID FastbootRestartGuid = FAST_BOOT_RESTART_GUID; +static EFI_GUID FastbootRestartCountGuid = FAST_BOOT_RESTART_COUNT_GUID; +#endif + +//============================================================================ +// External Golbal Variable Declaration +//============================================================================ +extern EFI_RUNTIME_SERVICES *gRT; +extern EFI_BOOT_SERVICES *gBS; +extern UINT32 gBootFlow; +extern BOOLEAN gEnterSetup; +extern EFI_EVENT gKeyTimer; +extern CHAR16 *HiiGetString( VOID* handle, UINT16 token ); +extern EFI_HII_HANDLE gHiiHandle; +//============================================================================ +// External Function Definitions +//============================================================================ +EFI_STATUS PostManagerDisplayPostMessage( CHAR16 *message ); +BOOLEAN ProcessConInAvailability(VOID); +VOID BbsBoot(VOID); +VOID TSEIDEPasswordFreezeDevices(); //(EIP68329)+ +VOID CheckForKeyHook( EFI_EVENT Event, VOID *Context ); +EFI_STATUS TimerStopTimer( EFI_EVENT *Event ); +//============================================================================ +// Golbal Variable Declaration +//============================================================================ +FAST_BOOT_POLICY *gFastBootPolicy; +FAST_BOOT_TSE_PROTOCOL gFastBootTseProtocol = { + FastBootCheckForKey, + FastBootStopCheckForKeyTimer, + TSEIDEPasswordFreezeDevices //(EIP68329)++ +}; +//============================================================================ +// Function Definitions +//============================================================================ + //(EIP63924+)> +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootCheckForKey +// +// Description: This function check TSE variable,gEnterSetup and gBootFlow. +// +// Input: +// BOOLEAN *EnterSetup +// UINT32 *BootFlow +// Output: +// EFI_SUCCESS - Bootflow is changed or EnterSetup if true +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastBootCheckForKey( + IN BOOLEAN *EnterSetup, + IN UINT32 *BootFlow) +{ + CheckForKeyHook( (EFI_EVENT)NULL, NULL ); + + *EnterSetup = gEnterSetup; + *BootFlow = gBootFlow; + + if ((gEnterSetup) || (gBootFlow != BOOT_FLOW_CONDITION_NORMAL)){ + return EFI_SUCCESS; + } + else { + return EFI_NOT_READY; + } +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootStopCheckForKeyTimer +// +// Description: This function stop the timer of CheckForKey callback +// +// Input: None +// +// Output: EFI_STATUS +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS FastBootStopCheckForKeyTimer() +{ + return TimerStopTimer(&gKeyTimer); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootMinisetupDriverEntryHook +// +// Description: Function that will be called when enter TSE Dxe entry +// +// Input: +// None +// +// Output: +// FALSE - as per TSE requirement, that no password was entered +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootMinisetupDriverEntryHook(VOID) +{ + EFI_HANDLE Handle = NULL; + EFI_GUID FastBootTseGuid = FAST_BOOT_TSE_PROTOCOL_GUID; + EFI_GUID FastBootPolicyGuid = FAST_BOOT_POLICY_PROTOCOL_GUID; + EFI_STATUS Status; + + gBS->InstallProtocolInterface(&Handle, + &FastBootTseGuid, + EFI_NATIVE_INTERFACE, + &gFastBootTseProtocol); + + Status = gBS->LocateProtocol(&FastBootPolicyGuid,NULL,&gFastBootPolicy); + +} + //<(EIP63924+) +#if FASTBOOT_NEED_RESTART +VOID InitialRebootCount(VOID) +{ + EFI_STATUS Status; + UINTN RebootFlag = 1; + UINTN RebootFlagSize = sizeof(RebootFlag); + UINTN ClearCount = 0; + UINTN ClearCountSize = sizeof(ClearCount); + Status = gRT->SetVariable(FAST_BOOT_RESTART_COUNT, + &FastbootRestartCountGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + ClearCountSize, + &ClearCount); + + Status = gRT->SetVariable(FAST_BOOT_RESTART, + &FastbootRestartGuid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + RebootFlagSize, + &RebootFlag); + +} +#endif +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootConInAvailHook +// +// Description: Function that will be called instead of generic TSE callback +// on Console Input device is installed event +// +// Input: +// None +// +// Output: +// FALSE - as per TSE requirement, that no password was entered +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +BOOLEAN FastBootConInAvailHook(VOID) +{ +// EFI_STATUS Status; +// UINTN Size = sizeof(SETUP_DATA); +// static EFI_GUID SetupVariableGuid = SETUP_GUID; +// SETUP_DATA SetupData; +// +// Status = gRT->GetVariable(L"Setup", &SetupVariableGuid, NULL, &Size, &SetupData); +// if (EFI_ERROR(Status) || SetupData.FastBoot == 0 || ALLOW_CHECKING_PASSWORD) +// return ProcessConInAvailability(); + + if(gFastBootPolicy->FastBootEnable == 0 || gFastBootPolicy->CheckPassword == 1) + return ProcessConInAvailability(); + +#if SETUP_PRINT_ENTER_SETUP_MSG +{ + CHAR16 *text = NULL; + text = HiiGetString( gHiiHandle, STRING_TOKEN(STR_DEL_ENTER_SETUP) ); + if ( text != NULL ) + PostManagerDisplayPostMessage(text); + gBS->FreePool(text); +} +#endif + + return FALSE; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootBbsBootHook +// +// Description: Function that will be called instead of generic TSE callback +// on BBS popup boot path +// +// Input: +// None +// +// Output: +// None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID FastBootBbsBootHook(VOID) +{ + static EFI_GUID FastBootVariableGuid = FAST_BOOT_VARIABLE_GUID; + EFI_STATUS Status; + UINT32 BbsPopupCalled = 0x55aa55aa; + Status = gRT->SetVariable(L"BbsPopupCalled", + &FastBootVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(BbsPopupCalled), + &BbsPopupCalled); + BbsBoot(); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: FastBootLaunch +// +// Description: Function that will be called instead of generic TSE callback +// on fast boot path +// +// Input: +// None +// +// Output: +// None +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +#if OVERRIDE_FastBootLaunch +EFI_STATUS FastBootLaunch() +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + AMI_FAST_BOOT_PROTOCOL * FastBootProtocol = NULL; + + // do the Fast Boot + if (!EFI_ERROR(gBS->LocateProtocol(&AmiFastBootProtocolGuid, NULL, &FastBootProtocol))) + Status = FastBootProtocol->Launch(); + + // If gFastBootProtocolGuid protocol not found or FastBoot Failed. return + return Status; +} +#endif +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2010, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* diff --git a/Core/EM/FastBoot/PTT.chm b/Core/EM/FastBoot/PTT.chm Binary files differnew file mode 100644 index 0000000..3560958 --- /dev/null +++ b/Core/EM/FastBoot/PTT.chm |