/** @file
PCH private PMC Library.
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.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
/**
This S3 BootScript only function disables triggering Global Reset of both
the Host and the ME partitions after CF9h write of 6h or Eh.
**/
VOID
PmcDisableCf9GlobalResetInS3BootScript (
VOID
)
{
UINT32 Data;
UINT32 PchPwrmBase;
PchPwrmBase = PmcGetPwrmBase ();
Data = MmioRead32 (PchPwrmBase + R_PMC_PWRM_ETR3);
Data &= (UINT32) ~B_PMC_PWRM_ETR3_CF9GR;
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint32,
(UINTN) PchPwrmBase +
R_PMC_PWRM_ETR3,
1,
&Data
);
}
/**
This S3 BootScript only function disables triggering Global Reset of both
the Host and the ME partitions after CF9h write of 6h or Eh.
Global Reset configuration is locked after programming
**/
VOID
PmcDisableCf9GlobalResetWithLockInS3BootScript (
VOID
)
{
UINT32 Data;
UINT32 PchPwrmBase;
PchPwrmBase = PmcGetPwrmBase ();
Data = MmioRead32 (PchPwrmBase + R_PMC_PWRM_ETR3);
Data &= (UINT32) ~B_PMC_PWRM_ETR3_CF9GR;
Data |= (UINT32) B_PMC_PWRM_ETR3_CF9LOCK;
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint32,
(UINTN) PchPwrmBase +
R_PMC_PWRM_ETR3,
1,
&Data
);
}
/**
This function sets SMI Lock with S3 Boot Script programming
**/
VOID
PmcLockSmiWithS3BootScript (
VOID
)
{
UINT32 PchPwrmBase;
PchPwrmBase = PmcGetPwrmBase ();
MmioOr8 ((UINTN) (PchPwrmBase + R_PMC_PWRM_GEN_PMCON_B), B_PMC_PWRM_GEN_PMCON_B_SMI_LOCK);
S3BootScriptSaveMemWrite (
S3BootScriptWidthUint8,
(UINTN) (PchPwrmBase + R_PMC_PWRM_GEN_PMCON_B),
1,
(VOID *) (UINTN) (PchPwrmBase + R_PMC_PWRM_GEN_PMCON_B)
);
}
/**
This function sets eSPI SMI Lock
@attention This function must be called after eSPI SMI generation has been enabled.
This setting is required in all boot modes and before EndOfDxe.
If set value will be restored upon S3 resume by bootscript.
**/
VOID
PmcLockEspiSmiWithS3BootScript (
VOID
)
{
UINT8 Data8Or;
UINT8 Data8And;
Data8Or = (UINT8) (B_PMC_PWRM_GEN_PMCON_A_ESPI_SMI_LOCK >> 8);
Data8And = (UINT8)~((B_PMC_PWRM_GEN_PMCON_A_PWR_FLR | B_PMC_PWRM_GEN_PMCON_A_HOST_RST_STS) >> 8);
MmioAndThenOr8 (PmcGetPwrmBase () + R_PMC_PWRM_GEN_PMCON_A + 1, Data8And, Data8Or);
S3BootScriptSaveMemReadWrite (
S3BootScriptWidthUint8,
PmcGetPwrmBase () + R_PMC_PWRM_GEN_PMCON_A + 1,
&Data8Or,
&Data8And
);
}