/** @file
PCH DMI library.
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "PchDmi14.h"
/**
This function checks if DMI Secured Register Lock (SRL) is set
@retval SRL state
**/
BOOLEAN
IsPchDmiLocked (
VOID
)
{
return IsPchDmi14Locked ();
}
/**
Get PCH TCO base address.
@retval Address Address of TCO base address.
**/
UINT16
PchDmiGetTcoBase (
VOID
)
{
//
// Read "TCO Base Address" PCR[DMI] + 2778h[15:5]
//
return (PchPcrRead16 (PID_DMI, R_PCH_DMI_PCR_TCOBASE) & B_PCH_DMI_PCR_TCOBASE_TCOBA);
}
/**
Set PCH LPC/eSPI generic IO range decoding in DMI
@param[in] Address Address for generic IO range base address.
@param[in] Length Length of generic IO range.
@param[in] RangeIndex Index of choosen range
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetLpcGenIoRange (
IN UINT32 Address,
IN UINT32 Length,
IN UINT32 RangeIndex
)
{
return EFI_UNSUPPORTED;
}
/**
Set PCH eSPI eSPI CS1# generic IO range decoding in DMI
@param[in] Address Address for generic IO range base address.
@param[in] Length Length of generic IO range.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetEspiCs1GenIoRange (
IN UINT32 Address,
IN UINT32 Length
)
{
return EFI_UNSUPPORTED;
}
/**
Set PCH LPC/eSPI memory range decoding in DMI
@param[in] Address Address for memory base address.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetLpcMemRange (
IN UINT32 Address
)
{
if (IsPchDmiLocked ()) {
DEBUG ((DEBUG_ERROR, "%a Error. DMI is locked.\n", __FUNCTION__));
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// Program LPC Memory Range, PCR[DMI] + 2740h to the same value programmed in LPC/eSPI PCI Offset 98h.
//
PchPcrWrite32 (
PID_DMI, R_PCH_DMI_PCR_LPCGMR,
(Address | B_LPC_CFG_LGMR_LMRD_EN)
);
return EFI_SUCCESS;
}
/**
Set PCH eSPI CS1# memory range decoding in DMI
@param[in] Address Address for memory base address.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetEspiCs1MemRange (
IN UINT32 Address
)
{
if (IsPchDmiLocked ()) {
DEBUG ((DEBUG_ERROR, "%a Error. DMI is locked.\n", __FUNCTION__));
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// Program LPC Memory Range, PCR[DMI] + 27C0h to the same value programmed in eSPI PCI Offset A8h.
//
PchPcrWrite32 (
PID_DMI, R_PCH_DMI_PCR_SEGMR,
(Address | B_LPC_CFG_LGMR_LMRD_EN)
);
return EFI_SUCCESS;
}
/**
Check if Boot BIOS Strap is set for SPI.
@retval TRUE Boot BIOS Strap set for SPI
@retval FALSE Boot BIOS Strap set for LPC/eSPI
**/
BOOLEAN
PchDmiIsBootBiosStrapSetForSpi (
VOID
)
{
//
// Check General Control and Status (GCS) [10]
// '0': SPI
// '1': LPC/eSPI
//
return ((PchPcrRead32 (PID_DMI, R_PCH_DMI_PCR_GCS) & B_PCH_DMI_PCR_BBS) != B_PCH_DMI_PCR_BBS);
}
/**
Set PCH BIOS range decoding in DMI
Please check EDS for detail of BiosDecodeEnable bit definition.
bit 15: F8-FF Enable
bit 14: F0-F8 Enable
bit 13: E8-EF Enable
bit 12: E0-E8 Enable
bit 11: D8-DF Enable
bit 10: D0-D7 Enable
bit 9: C8-CF Enable
bit 8: C0-C7 Enable
bit 7: Legacy F Segment Enable
bit 6: Legacy E Segment Enable
bit 5: Reserved
bit 4: Reserved
bit 3: 70-7F Enable
bit 2: 60-6F Enable
bit 1: 50-5F Enable
bit 0: 40-4F Enable
@param[in] BiosDecodeEnable Bios decode enable setting.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetBiosDecodeEnable (
IN UINT16 BiosDecodeEnable
)
{
if (IsPchDmiLocked ()) {
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// program LPC BIOS Decode Enable, PCR[DMI] + 2744h to the same value programmed in LPC or SPI Offset D8h.
//
PchPcrWrite16 (PID_DMI, R_PCH_DMI_PCR_LPCBDE, BiosDecodeEnable);
return EFI_SUCCESS;
}
/**
Set PCH LPC/eSPI IO decode ranges in DMI
Please check EDS for detail of LPC/eSPI IO decode ranges bit definition.
Bit 12: FDD range
Bit 9:8: LPT range
Bit 6:4: ComB range
Bit 2:0: ComA range
@param[in] LpcIoDecodeRanges LPC/eSPI IO decode ranges bit settings.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetLpcIoDecodeRanges (
IN UINT16 LpcIoDecodeRanges
)
{
//
// This cycle decoding is only allowed to set when DMI is not locked.
//
if (IsPchDmiLocked ()) {
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// program LPC I/O Decode Ranges, PCR[DMI] + 2770h[15:0] to the same value programmed in LPC/eSPI PCI offset 80h.
//
PchPcrWrite16 (PID_DMI, R_PCH_DMI_PCR_LPCIOD, LpcIoDecodeRanges);
return EFI_SUCCESS;
}
/**
Set PCH LPC/eSPI IO enable decoding in DMI
@param[in] LpcIoEnableDecoding LPC/eSPI IO enable decoding bit settings.
@retval EFI_SUCCESS Successfully completed.
@retval EFI_UNSUPPORTED DMIC.SRL is set.
**/
EFI_STATUS
PchDmiSetLpcIoEnable (
IN UINT16 LpcIoEnableDecoding
)
{
//
// This cycle decoding is only allowed to set when DMI is not locked.
//
if (IsPchDmiLocked ()) {
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// program LPC I/O Decode Ranges, PCR[DMI] + 2774h[15:0] to the same value programmed in LPC/eSPI PCI offset 82h.
//
PchPcrWrite16 (PID_DMI, R_PCH_DMI_PCR_LPCIOE, LpcIoEnableDecoding);
return EFI_SUCCESS;
}