252 lines
7.5 KiB
C
252 lines
7.5 KiB
C
/** @file
|
|
//*****************************************************************************
|
|
//
|
|
// Copyright (c) 2012 - 2016, Hefei LCFC Information Technology Co.Ltd.
|
|
// And/or its affiliates. All rights reserved.
|
|
// Hefei LCFC Information Technology Co.Ltd. PROPRIETARY/CONFIDENTIAL.
|
|
// Use is subject to license terms.
|
|
//
|
|
//******************************************************************************
|
|
*/
|
|
// Project SMM Common code here
|
|
/*
|
|
Data Name Version Description
|
|
2015.07.18 Antony.Guo v1.00 Initial Release
|
|
2016.01.29 Cissie.Gu v1.01 Add a new function ,which is used to notify EC to
|
|
keep on power when use RTC to wake up PC from S4
|
|
in DC mode.
|
|
*/
|
|
|
|
//
|
|
// Module specific Includes
|
|
//
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/IoLib.h>
|
|
#include <Library/SmmServicesTableLib.h>
|
|
#include <Protocol/SmmSxDispatch2.h>
|
|
#include <Protocol/SmmSwDispatch2.h>
|
|
#include <Protocol/SmmPowerButtonDispatch2.h>
|
|
#include <Uefi/UefiSpec.h>
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Guid/HobList.h>
|
|
#include <Library/IoLib.h>
|
|
#include <IndustryStandard/Pci.h>
|
|
#include <Library/LfcEcLib.h>
|
|
#include <Library/OemSvcLfcS3S4CBWBCallBack.h>
|
|
|
|
/**
|
|
|
|
**/
|
|
EFI_STATUS
|
|
LfcS3EntryCallback (
|
|
IN EFI_HANDLE DispatchHandle,
|
|
IN CONST VOID *DispatchContext,
|
|
IN OUT VOID *CommBuffer OPTIONAL,
|
|
IN UINTN *CommBufferSize OPTIONAL
|
|
)
|
|
{
|
|
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
|
|
Status = OemSvcLfcSmmS3S4CbWbCallback ((UINT8)SxS3);
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
LfcS4EntryCallback (
|
|
IN EFI_HANDLE DispatchHandle,
|
|
IN CONST VOID *DispatchContext,
|
|
IN OUT VOID *CommBuffer OPTIONAL,
|
|
IN UINTN *CommBufferSize OPTIONAL
|
|
)
|
|
{
|
|
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
|
|
Status = OemSvcLfcSmmS3S4CbWbCallback ((UINT8)SxS4);
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
LfcS5EntryCallback (
|
|
IN EFI_HANDLE DispatchHandle,
|
|
IN CONST VOID *DispatchContext,
|
|
IN OUT VOID *CommBuffer OPTIONAL,
|
|
IN UINTN *CommBufferSize OPTIONAL
|
|
)
|
|
{
|
|
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
|
|
Status = OemSvcLfcSmmS3S4CbWbCallback ((UINT8)SxS5);
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
LfcPowerButtonCallback (
|
|
IN EFI_HANDLE DispatchHandle,
|
|
IN CONST VOID *DispatchContext,
|
|
IN OUT VOID *CommBuffer,
|
|
IN OUT UINTN *CommBufferSize
|
|
)
|
|
{
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
|
|
LfcEcLibDisableEcPower();
|
|
|
|
Status = OemSvcLfcSmmS3S4CbWbCallback ((UINT8)(SxS5 + 2));
|
|
|
|
return Status;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
LfcSwSmiCallback (
|
|
IN EFI_HANDLE DispatchHandle,
|
|
IN CONST VOID *DispatchContext,
|
|
IN OUT VOID *CommBuffer OPTIONAL,
|
|
IN UINTN *CommBufferSize OPTIONAL
|
|
)
|
|
{
|
|
EFI_STATUS Status = EFI_SUCCESS;
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
InSmmFunction (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_SMM_SX_DISPATCH2_PROTOCOL *SxDispatchProtocol;
|
|
EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch;
|
|
EFI_SMM_SX_REGISTER_CONTEXT EntryDispatchContext;
|
|
EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL *PowerButtonDispatch;
|
|
EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT PowerButtonContext;
|
|
//EFI_SMM_SW_REGISTER_CONTEXT SwContext; //need add this code in projects
|
|
EFI_HANDLE SwDispatchHandle;
|
|
EFI_HANDLE S1DispatchHandle;
|
|
EFI_HANDLE S3DispatchHandle;
|
|
EFI_HANDLE S4DispatchHandle;
|
|
EFI_HANDLE S5DispatchHandle;
|
|
EFI_HANDLE PowerButtonHandle;
|
|
EFI_STATUS Status;
|
|
|
|
SwDispatchHandle = NULL;
|
|
S1DispatchHandle = NULL;
|
|
S3DispatchHandle = NULL;
|
|
S4DispatchHandle = NULL;
|
|
S5DispatchHandle = NULL;
|
|
PowerButtonHandle = NULL;
|
|
|
|
|
|
Status = gSmst->SmmLocateProtocol (
|
|
&gEfiSmmSxDispatch2ProtocolGuid,
|
|
NULL,
|
|
(VOID **) &SxDispatchProtocol
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Register S3 entry phase call back function
|
|
//
|
|
EntryDispatchContext.Type = SxS3;
|
|
EntryDispatchContext.Phase = SxEntry;
|
|
Status = SxDispatchProtocol->Register (
|
|
SxDispatchProtocol,
|
|
LfcS3EntryCallback,
|
|
&EntryDispatchContext,
|
|
&S3DispatchHandle
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Register S4 entry phase call back function
|
|
//
|
|
EntryDispatchContext.Type = SxS4;
|
|
EntryDispatchContext.Phase = SxEntry;
|
|
Status = SxDispatchProtocol->Register (
|
|
SxDispatchProtocol,
|
|
LfcS4EntryCallback,
|
|
&EntryDispatchContext,
|
|
&S4DispatchHandle
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Register S5 entry phase call back function
|
|
//
|
|
EntryDispatchContext.Type = SxS5;
|
|
EntryDispatchContext.Phase = SxEntry;
|
|
Status = SxDispatchProtocol->Register (
|
|
SxDispatchProtocol,
|
|
LfcS5EntryCallback,
|
|
&EntryDispatchContext,
|
|
&S5DispatchHandle
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Register power button entry phase call back function
|
|
//
|
|
Status = gSmst->SmmLocateProtocol (&gEfiSmmPowerButtonDispatch2ProtocolGuid, NULL, (VOID**)&PowerButtonDispatch);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Register the power button SMM event
|
|
//
|
|
PowerButtonContext.Phase = EfiPowerButtonEntry;
|
|
Status = PowerButtonDispatch->Register (
|
|
PowerButtonDispatch,
|
|
LfcPowerButtonCallback,
|
|
&PowerButtonContext,
|
|
&PowerButtonHandle
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Locate the SMM SW dispatch protocol
|
|
//
|
|
Status = gSmst->SmmLocateProtocol (
|
|
&gEfiSmmSwDispatch2ProtocolGuid,
|
|
NULL,
|
|
&SwDispatch
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
//
|
|
// Register SWSMI handler
|
|
//
|
|
/* //need add this code in projects
|
|
SwContext.SwSmiInputValue = LCFC_SW_SMI_ENUMERATE;
|
|
Status = SwDispatch->Register (
|
|
SwDispatch,
|
|
LfcSwSmiCallback,
|
|
&SwContext,
|
|
&SwDispatchHandle
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
*/
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
LfcSmmEntryPoint (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
Status = TRUE;
|
|
DEBUG ((DEBUG_INFO, "LfcSmmEntryPoint\n"));
|
|
//
|
|
// Do project code here............
|
|
//
|
|
return InSmmFunction (ImageHandle, SystemTable);
|
|
}
|
|
|