summaryrefslogtreecommitdiff
path: root/Core/EM/FastBoot/FastBootSMI.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/FastBoot/FastBootSMI.c')
-rw-r--r--Core/EM/FastBoot/FastBootSMI.c244
1 files changed, 244 insertions, 0 deletions
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 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+