/** @file
File to contain all the hardware specific stuff for the Smm Power Button dispatch protocol.
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
GLOBAL_REMOVE_IF_UNREFERENCED CONST PCH_SMM_SOURCE_DESC mPowerButtonSourceDesc = {
PCH_SMM_SCI_EN_DEPENDENT,
{
{
{
ACPI_ADDR_TYPE,
{R_ACPI_IO_PM1_EN}
},
S_ACPI_IO_PM1_EN,
N_ACPI_IO_PM1_EN_PWRBTN
},
NULL_BIT_DESC_INITIALIZER
},
{
{
{
ACPI_ADDR_TYPE,
{R_ACPI_IO_PM1_STS}
},
S_ACPI_IO_PM1_STS,
N_ACPI_IO_PM1_STS_PWRBTN
}
},
{
{
ACPI_ADDR_TYPE,
{R_ACPI_IO_SMI_STS}
},
S_ACPI_IO_SMI_STS,
N_ACPI_IO_SMI_STS_PM1_STS_REG
}
};
/**
Get the power button status.
@param[in] Record The pointer to the DATABASE_RECORD.
@param[out] Context Calling context from the hardware, will be updated with the current power button status.
**/
VOID
EFIAPI
PowerButtonGetContext (
IN DATABASE_RECORD *Record,
OUT PCH_SMM_CONTEXT *Context
)
{
if (PmcGetPwrBtnLevel ()) {
Context->PowerButton.Phase = EfiPowerButtonExit;
} else {
Context->PowerButton.Phase = EfiPowerButtonEntry;
}
}
/**
Check whether Power Button status of two contexts match
@param[in] Context1 Context 1 that includes Power Button status 1
@param[in] Context2 Context 2 that includes Power Button status 2
@retval FALSE Power Button status match
@retval TRUE Power Button status don't match
**/
BOOLEAN
EFIAPI
PowerButtonCmpContext (
IN PCH_SMM_CONTEXT *Context1,
IN PCH_SMM_CONTEXT *Context2
)
{
return (BOOLEAN) (Context1->PowerButton.Phase == Context2->PowerButton.Phase);
}