text: /** @file
    File to contain all the hardware specific stuff for the Smm Power Button dispatch protocol.
  
    Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
    SPDX-License-Identifier: BSD-2-Clause-Patent
  **/
  #include <PchSmmHelpers.h>
  #include <Library/PmcPrivateLib.h>
  
  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);
  }
  