/** @file
|
PCH private PMC Library for all PCH generations.
|
All function in this library is available for PEI, DXE, and SMM,
|
But do not support UEFI RUNTIME environment call.
|
|
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
**/
|
|
#include <Base.h>
|
#include <Uefi/UefiBaseType.h>
|
#include <Library/IoLib.h>
|
#include <Library/DebugLib.h>
|
#include <Library/BaseLib.h>
|
#include <Library/BaseMemoryLib.h>
|
#include <Library/PmcLib.h>
|
#include <Library/PciSegmentLib.h>
|
#include <Library/PchPcrLib.h>
|
#include <Library/PchInfoLib.h>
|
#include <Library/PmcPrivateLib.h>
|
|
/**
|
This function checks if GbE device is supported (not disabled by fuse)
|
|
@retval GbE support state
|
**/
|
BOOLEAN
|
PmcIsGbeSupported (
|
VOID
|
)
|
{
|
//
|
// Get fuse info from PWRMBASE + FUSE_SS_DIS_RD_2
|
//
|
return ((MmioRead32 (PmcGetPwrmBase () + R_PMC_PWRM_FUSE_DIS_RD_2) & B_PMC_PWRM_FUSE_DIS_RD_2_GBE_FUSE_SS_DIS) == 0);
|
}
|
|
/**
|
This function checks if LAN wake from DeepSx is enabled
|
|
@retval Lan Wake state
|
**/
|
BOOLEAN
|
PmcIsLanDeepSxWakeEnabled (
|
VOID
|
)
|
{
|
//
|
// Get wake info from PWRMBASE + DSX_CFG
|
//
|
return ((MmioRead32 (PmcGetPwrmBase () + R_PMC_PWRM_DSX_CFG) & (UINT32) B_PMC_PWRM_DSX_CFG_LAN_WAKE_EN) != 0);
|
}
|
|
/**
|
This function checks if eSPI SMI Lock is set
|
|
@retval eSPI SMI Lock state
|
**/
|
BOOLEAN
|
PmcIsEspiSmiLockSet (
|
VOID
|
)
|
{
|
return ((MmioRead32 ((UINTN) (PmcGetPwrmBase () + R_PMC_PWRM_GEN_PMCON_A)) & B_PMC_PWRM_GEN_PMCON_A_ESPI_SMI_LOCK) != 0);
|
}
|
|
/**
|
This function sets SW SMI Rate.
|
|
@param[in] SwSmiRate Refer to PMC_SWSMI_RATE for possible values
|
**/
|
VOID
|
PmcSetSwSmiRate (
|
IN PMC_SWSMI_RATE SwSmiRate
|
)
|
{
|
UINT32 PchPwrmBase;
|
STATIC UINT8 SwSmiRateRegVal[4] = {
|
V_PMC_PWRM_GEN_PMCON_A_SWSMI_RTSL_1_5MS,
|
V_PMC_PWRM_GEN_PMCON_A_SWSMI_RTSL_16MS,
|
V_PMC_PWRM_GEN_PMCON_A_SWSMI_RTSL_32MS,
|
V_PMC_PWRM_GEN_PMCON_A_SWSMI_RTSL_64MS
|
};
|
|
ASSERT (SwSmiRate <= PmcSwSmiRate64ms);
|
|
PchPwrmBase = PmcGetPwrmBase ();
|
|
//
|
// SWSMI_RATE_SEL BIT (PWRMBASE offset 1020h[7:6]) bits are in RTC well
|
//
|
MmioAndThenOr8 (
|
PchPwrmBase + R_PMC_PWRM_GEN_PMCON_A,
|
(UINT8)~B_PMC_PWRM_GEN_PMCON_A_SWSMI_RTSL,
|
SwSmiRateRegVal[SwSmiRate]
|
);
|
}
|
|
/**
|
This function sets Periodic SMI Rate.
|
|
@param[in] PeriodicSmiRate Refer to PMC_PERIODIC_SMI_RATE for possible values
|
**/
|
VOID
|
PmcSetPeriodicSmiRate (
|
IN PMC_PERIODIC_SMI_RATE PeriodicSmiRate
|
)
|
{
|
UINT32 PchPwrmBase;
|
STATIC UINT8 PeriodicSmiRateRegVal[4] = {
|
V_PMC_PWRM_GEN_PMCON_A_PER_SMI_8S,
|
V_PMC_PWRM_GEN_PMCON_A_PER_SMI_16S,
|
V_PMC_PWRM_GEN_PMCON_A_PER_SMI_32S,
|
V_PMC_PWRM_GEN_PMCON_A_PER_SMI_64S
|
};
|
|
ASSERT (PeriodicSmiRate <= PmcPeriodicSmiRate64s);
|
|
PchPwrmBase = PmcGetPwrmBase ();
|
|
MmioAndThenOr8 (
|
PchPwrmBase + R_PMC_PWRM_GEN_PMCON_A,
|
(UINT8)~B_PMC_PWRM_GEN_PMCON_A_PER_SMI_SEL,
|
PeriodicSmiRateRegVal[PeriodicSmiRate]
|
);
|
}
|
|
/**
|
This function reads Power Button Level
|
|
@retval State of PWRBTN# signal (0: Low, 1: High)
|
**/
|
UINT8
|
PmcGetPwrBtnLevel (
|
VOID
|
)
|
{
|
if (MmioRead32 (PmcGetPwrmBase () + R_PMC_PWRM_GEN_PMCON_B) & B_PMC_PWRM_GEN_PMCON_B_PWRBTN_LVL) {
|
return 1;
|
} else {
|
return 0;
|
}
|
}
|
|
/**
|
This function gets Group to GPE0 configuration
|
|
@param[out] GpeDw0Value GPIO Group to GPE_DW0 assignment
|
@param[out] GpeDw1Value GPIO Group to GPE_DW1 assignment
|
@param[out] GpeDw2Value GPIO Group to GPE_DW2 assignment
|
**/
|
VOID
|
PmcGetGpioGpe (
|
OUT UINT32 *GpeDw0Value,
|
OUT UINT32 *GpeDw1Value,
|
OUT UINT32 *GpeDw2Value
|
)
|
{
|
UINT32 Data32;
|
|
Data32 = MmioRead32 ((UINTN) (PmcGetPwrmBase () + R_PMC_PWRM_GPIO_CFG));
|
|
*GpeDw0Value = ((Data32 & B_PMC_PWRM_GPIO_CFG_GPE0_DW0) >> N_PMC_PWRM_GPIO_CFG_GPE0_DW0);
|
*GpeDw1Value = ((Data32 & B_PMC_PWRM_GPIO_CFG_GPE0_DW1) >> N_PMC_PWRM_GPIO_CFG_GPE0_DW1);
|
*GpeDw2Value = ((Data32 & B_PMC_PWRM_GPIO_CFG_GPE0_DW2) >> N_PMC_PWRM_GPIO_CFG_GPE0_DW2);
|
}
|