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