/** @file
File to contain all the hardware specific stuff for the Smm Power Button dispatch protocol.
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
GLOBAL_REMOVE_IF_UNREFERENCED CONST PCH_SMM_SOURCE_DESC POWER_BUTTON_SOURCE_DESC = {
PCH_SMM_SCI_EN_DEPENDENT,
{
{
{
ACPI_ADDR_TYPE,
{R_PCH_ACPI_PM1_EN}
},
S_PCH_ACPI_PM1_EN,
N_PCH_ACPI_PM1_EN_PWRBTN
},
NULL_BIT_DESC_INITIALIZER
},
{
{
{
ACPI_ADDR_TYPE,
{R_PCH_ACPI_PM1_STS}
},
S_PCH_ACPI_PM1_STS,
N_PCH_ACPI_PM1_STS_PWRBTN
}
},
{
{
ACPI_ADDR_TYPE,
{R_PCH_SMI_STS}
},
S_PCH_SMI_STS,
N_PCH_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
)
{
UINT32 GenPmConA;
UINTN PmcBaseAddress;
PmcBaseAddress = MmPciBase (
DEFAULT_PCI_BUS_NUMBER_PCH,
PCI_DEVICE_NUMBER_PCH_PMC,
PCI_FUNCTION_NUMBER_PCH_PMC
);
GenPmConA = MmioRead32 (PmcBaseAddress + R_PCH_PMC_GEN_PMCON_A);
if ((GenPmConA & B_PCH_PMC_GEN_PMCON_A_PWRBTN_LVL) != 0) {
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);
}