/** @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); }