426 lines
16 KiB
C
426 lines
16 KiB
C
/** @file
|
|
Header file for PchCycleDecodingLib.
|
|
|
|
@copyright
|
|
INTEL CONFIDENTIAL
|
|
Copyright 2015 - 2021 Intel Corporation.
|
|
|
|
The source code contained or described herein and all documents related to the
|
|
source code ("Material") are owned by Intel Corporation or its suppliers or
|
|
licensors. Title to the Material remains with Intel Corporation or its suppliers
|
|
and licensors. The Material may contain trade secrets and proprietary and
|
|
confidential information of Intel Corporation and its suppliers and licensors,
|
|
and is protected by worldwide copyright and trade secret laws and treaty
|
|
provisions. No part of the Material may be used, copied, reproduced, modified,
|
|
published, uploaded, posted, transmitted, distributed, or disclosed in any way
|
|
without Intel's prior express written permission.
|
|
|
|
No license under any patent, copyright, trade secret or other intellectual
|
|
property right is granted to or conferred upon you by disclosure or delivery
|
|
of the Materials, either expressly, by implication, inducement, estoppel or
|
|
otherwise. Any license under such intellectual property rights must be
|
|
express and approved by Intel in writing.
|
|
|
|
Unless otherwise agreed by Intel in writing, you may not remove or alter
|
|
this notice or any other notice embedded in Materials by Intel or
|
|
Intel's suppliers or licensors in any way.
|
|
|
|
This file contains an 'Intel Peripheral Driver' and is uniquely identified as
|
|
"Intel Reference Module" and is licensed for Intel CPUs and chipsets under
|
|
the terms of your license agreement with Intel or your vendor. This file may
|
|
be modified by the user, subject to additional terms of the license agreement.
|
|
|
|
@par Specification Reference:
|
|
**/
|
|
#ifndef _PCH_CYCLE_DECODING_LIB_H_
|
|
#define _PCH_CYCLE_DECODING_LIB_H_
|
|
|
|
/**
|
|
Set PCH TCO base address.
|
|
This cycle decoding is allowed to set when DMIC.SRL is 0.
|
|
Programming steps:
|
|
1. set Smbus PCI offset 54h [8] to enable TCO base address.
|
|
2. program Smbus PCI offset 50h [15:5] to TCO base address.
|
|
3. set Smbus PCI offset 54h [8] to enable TCO base address.
|
|
4. program "TCO Base Address" PCR[DMI] + 2778h[15:5, 1] to [Smbus PCI offset 50h[15:5], 1].
|
|
|
|
@param[in] Address Address for TCO base address.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address passed.
|
|
**/
|
|
EFI_STATUS
|
|
PchTcoBaseSet (
|
|
IN UINT16 Address
|
|
);
|
|
|
|
/**
|
|
Get PCH TCO base address.
|
|
|
|
@param[out] Address Address of TCO base address.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid pointer passed.
|
|
**/
|
|
EFI_STATUS
|
|
PchTcoBaseGet (
|
|
OUT UINT16 *Address
|
|
);
|
|
|
|
///
|
|
/// structure of LPC general IO range register
|
|
/// It contains base address, address mask, and enable status.
|
|
///
|
|
typedef struct {
|
|
UINT32 BaseAddr :16;
|
|
UINT32 Length :15;
|
|
UINT32 Enable : 1;
|
|
} PCH_LPC_GEN_IO_RANGE;
|
|
|
|
#define PCH_LPC_GEN_IO_RANGE_MAX 4
|
|
#define ESPI_CS1_GEN_IO_RANGE_MAX 1
|
|
|
|
///
|
|
/// structure of LPC general IO range register list
|
|
/// It lists all LPC general IO ran registers supported by PCH.
|
|
///
|
|
typedef struct {
|
|
PCH_LPC_GEN_IO_RANGE Range[PCH_LPC_GEN_IO_RANGE_MAX];
|
|
} PCH_LPC_GEN_IO_RANGE_LIST;
|
|
|
|
/**
|
|
Set PCH LPC/eSPI generic IO range.
|
|
For generic IO range, the base address must align to 4 and less than 0xFFFF, and the length must be power of 2
|
|
and less than or equal to 256. Moreover, the address must be length aligned.
|
|
This function basically checks the address and length, which should not overlap with all other generic ranges.
|
|
If no more generic range register available, it returns out of resource error.
|
|
This cycle decoding is also required on DMI side.
|
|
Some IO ranges below 0x100 have fixed target. The target might be ITSS,RTC,LPC,PMC or terminated inside P2SB
|
|
but all predefined and can't be changed. IO range below 0x100 will be rejected in this function except below ranges:
|
|
0x00-0x1F,
|
|
0x44-0x4B,
|
|
0x54-0x5F,
|
|
0x68-0x6F,
|
|
0x80-0x8F,
|
|
0xC0-0xFF
|
|
Steps of programming generic IO range:
|
|
1. Program LPC/eSPI PCI Offset 84h ~ 93h of Mask, Address, and Enable.
|
|
2. Program LPC/eSPI Generic IO Range 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_INVALID_PARAMETER Invalid base address or length passed.
|
|
@retval EFI_OUT_OF_RESOURCES No more generic range available.
|
|
@retval EFI_UNSUPPORTED DMIC.SRL is set.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcGenIoRangeSet (
|
|
IN UINT16 Address,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Clear IBL eSPI generic IO range.
|
|
Clear Generic IO range if already programmed.
|
|
If Address/Length not match any already programmed values return EFI_NOT_FOUND status.
|
|
|
|
Steps of programming generic IO range:
|
|
1. Clear eSPI PCI Offset 84h ~ 93h of Mask, Address, and Enable.
|
|
|
|
@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_NOT_FOUND Address/Length not found in alredy programmed Gen IO.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcGenIoRangeClear (
|
|
IN UINT16 Address,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Set PCH eSPI CS1# generic IO range decoding.
|
|
For generic IO range, the base address must align to 4 and less than 0xFFFF, and the length must be power of 2
|
|
and less than or equal to 256. Moreover, the address must be length aligned.
|
|
This function basically checks the address and length, which should not overlap with all other generic ranges.
|
|
If no more generic range register available, it returns out of resource error.
|
|
This cycle decoding is also required on DMI side
|
|
Some IO ranges below 0x100 have fixed target. The target might be ITSS,RTC,LPC,PMC or terminated inside P2SB
|
|
but all predefined and can't be changed. IO range below 0x100 will be rejected in this function except below ranges:
|
|
0x00-0x1F,
|
|
0x44-0x4B,
|
|
0x54-0x5F,
|
|
0x68-0x6F,
|
|
0x80-0x8F,
|
|
0xC0-0xFF
|
|
Steps of programming generic IO range:
|
|
1. Program eSPI PCI Offset A4h (eSPI CS1#) of Mask, Address, and Enable.
|
|
2. Program eSPI Generic IO Range in DMI
|
|
|
|
@param[in] Address Address for generic IO range decoding.
|
|
@param[in] Length Length of generic IO range.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address or length passed.
|
|
@retval EFI_OUT_OF_RESOURCES No more generic range available.
|
|
@retval EFI_UNSUPPORTED eSPI secondary target not supported
|
|
**/
|
|
EFI_STATUS
|
|
PchEspiCs1GenIoRangeSet (
|
|
IN UINT16 Address,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Get PCH LPC/eSPI generic IO range list.
|
|
This function returns a list of base address, length, and enable for all LPC/eSPI generic IO range registers.
|
|
|
|
@param[out] LpcGenIoRangeList Return all LPC/eSPI generic IO range register status.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address passed.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcGenIoRangeGet (
|
|
OUT PCH_LPC_GEN_IO_RANGE_LIST *LpcGenIoRangeList
|
|
);
|
|
|
|
/**
|
|
Get PCH eSPI CS1# generic IO range list.
|
|
This function returns a list of base address, length, and enable for all eSPI CS1# generic IO range registers.
|
|
|
|
@param[out] GenIoRangeList eSPI generic IO range registers.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address passed.
|
|
@retval EFI_UNSUPPORTED eSPI secondary target not supported
|
|
**/
|
|
EFI_STATUS
|
|
PchEspiCs1GenIoRangeGet (
|
|
OUT PCH_LPC_GEN_IO_RANGE_LIST *GenIoRangeList
|
|
);
|
|
|
|
/**
|
|
Set PCH LPC/eSPI memory range decoding.
|
|
This cycle decoding is required to be set on DMI side
|
|
Programming steps:
|
|
1. Program LPC PCI Offset 98h [0] to [0] to disable memory decoding first before changing base address.
|
|
2. Program LPC PCI Offset 98h [31:16, 0] to [Address, 1].
|
|
3. Program LPC Memory Range in DMI
|
|
|
|
@param[in] Address Address for memory base address.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address or length passed.
|
|
@retval EFI_OUT_OF_RESOURCES No more generic range available.
|
|
@retval EFI_UNSUPPORTED DMIC.SRL is set.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcMemRangeSet (
|
|
IN UINT32 Address
|
|
);
|
|
|
|
/**
|
|
Set PCH eSPI CS1# memory range decoding.
|
|
This cycle decoding is required to be set on DMI side
|
|
Programming steps:
|
|
1. Program eSPI PCI Offset A8h (eSPI CS1#) [0] to [0] to disable memory decoding first before changing base address.
|
|
2. Program eSPI PCI Offset A8h (eSPI CS1#) [31:16, 0] to [Address, 1].
|
|
3. Program eSPI Memory Range in DMI
|
|
|
|
@param[in] Address Address for memory for decoding.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address or length passed.
|
|
@retval EFI_UNSUPPORTED eSPI secondary target not supported
|
|
**/
|
|
EFI_STATUS
|
|
PchEspiCs1MemRangeSet (
|
|
IN UINT32 Address
|
|
);
|
|
|
|
/**
|
|
Get PCH LPC/eSPI memory range decoding address.
|
|
|
|
@param[out] Address Address of LPC/eSPI memory decoding base address.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address passed.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcMemRangeGet (
|
|
OUT UINT32 *Address
|
|
);
|
|
|
|
/**
|
|
Get PCH eSPI CS1# memory range decoding address.
|
|
|
|
@param[out] Address Address of eSPI CS1# memory decoding base address.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid base address passed.
|
|
@retval EFI_UNSUPPORTED eSPI secondary target not supported
|
|
**/
|
|
EFI_STATUS
|
|
PchEspiCs1MemRangeGet (
|
|
OUT UINT32 *Address
|
|
);
|
|
|
|
/**
|
|
Set PCH BIOS range deocding.
|
|
This will check General Control and Status bit 10 (GCS.BBS) to identify SPI or LPC/eSPI and program BDE register accordingly.
|
|
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
|
|
This cycle decoding is allowed to set when DMIC.SRL is 0.
|
|
Programming steps:
|
|
1. if GCS.BBS is 0 (SPI), program SPI PCI offset D8h to BiosDecodeEnable.
|
|
if GCS.BBS is 1 (LPC/eSPi), program LPC/eSPI PCI offset D8h to BiosDecodeEnable.
|
|
2. program LPC/eSPI/SPI BIOS Decode Enable, PCR[DMI] + 2744h to the same value programmed in LPC/eSPI or SPI PCI Offset D8h.
|
|
|
|
@param[in] BiosDecodeEnable Bios decode enable setting.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
**/
|
|
EFI_STATUS
|
|
PchBiosDecodeEnableSet (
|
|
IN UINT16 BiosDecodeEnable
|
|
);
|
|
|
|
/**
|
|
Set PCH LPC IO decode ranges.
|
|
Program LPC I/O Decode Ranges, PCR[DMI] + 2770h[15:0] to the same value programmed in LPC offset 80h.
|
|
Please check EDS for detail of Lpc 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 IO decode ranges bit settings.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_UNSUPPORTED DMIC.SRL is set.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcIoDecodeRangesSet (
|
|
IN UINT16 LpcIoDecodeRanges
|
|
);
|
|
|
|
/**
|
|
Set PCH LPC and eSPI CS0# IO enable decoding.
|
|
Setup I/O Enables in DMI to the same value program in LPC/eSPI PCI offset 82h.
|
|
Note: Bit[15:10] of the source decode register is Read-Only. The IO range indicated by the Enables field
|
|
in LPC/eSPI PCI offset 82h[13:10] is always forwarded by DMI to subtractive agent for handling.
|
|
Please check EDS for detail of LPC/eSPI IO decode ranges bit definition.
|
|
|
|
@param[in] LpcIoEnableDecoding LPC IO enable decoding bit settings.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_UNSUPPORTED DMIC.SRL is set.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcIoEnableDecodingSet (
|
|
IN UINT16 LpcIoEnableDecoding
|
|
);
|
|
|
|
/**
|
|
Set PCH eSPI CS1# IO enable decoding.
|
|
Setup I/O Enables in DMI to the same value program in eSPI PCI offset A0h (eSPI CS1#).
|
|
Note: Bit[15:10] of the source decode register is Read-Only. The IO range indicated by the Enables field
|
|
in eSPI PCI offset A0h[13:10] is always forwarded by DMI to subtractive agent for handling.
|
|
Please check EDS for detail of eSPI IO decode ranges bit definition.
|
|
|
|
@param[in] IoEnableDecoding eSPI IO enable decoding bit settings.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_UNSUPPORTED DMI configuration is locked
|
|
**/
|
|
EFI_STATUS
|
|
PchEspiCs1IoEnableDecodingSet (
|
|
IN UINT16 IoEnableDecoding
|
|
);
|
|
|
|
/**
|
|
AND then OR PCH LPC and eSPI CS0# IO enable decoding.
|
|
Setup I/O Enables in DMI to the same value program in LPC/eSPI PCI offset 82h.
|
|
Note: Bit[15:10] of the source decode register is Read-Only. The IO range indicated by the Enables field
|
|
in LPC/eSPI PCI offset 82h[13:10] is always forwarded by DMI to subtractive agent for handling.
|
|
|
|
@param[in] AndValue LPC IO enable decoding "AND" value.
|
|
@param[in] OrValue LPC IO enable decoding "OR" value.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_UNSUPPORTED DMIC.SRL is set.
|
|
**/
|
|
EFI_STATUS
|
|
PchLpcIoEnableDecodingAndThenOr (
|
|
IN UINT16 AndValue,
|
|
IN UINT16 OrValue
|
|
);
|
|
|
|
/**
|
|
Set PCH IO port 80h cycle decoding to PCIE root port.
|
|
System BIOS is likely to do this very soon after reset before PCI bus enumeration, it must ensure that
|
|
the IO Base Address field (PCIe:1Ch[7:4]) contains a value greater than the IO Limit field (PCIe:1Ch[15:12])
|
|
before setting the IOSE bit. Otherwise the bridge will positively decode IO range 000h - FFFh by its default
|
|
IO range values.
|
|
This cycle decoding is allowed to set when DMIC.SRL is 0.
|
|
Programming steps:
|
|
1. Program "RPR Destination ID", PCR[DMI] + 274Ch[31:16] to the Dest ID of RP.
|
|
2. Program "Reserved Page Route", PCR[DMI] + 274Ch[11] to '1'. Use byte write on GCS+1 and leave the BILD bit which is RWO.
|
|
3. Program IOSE bit of PCIE:Reg04h[0] to '1' for PCH to send such IO cycles to PCIe bus for subtractive decoding.
|
|
|
|
@param[in] RpPhyNumber PCIE root port physical number.
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
**/
|
|
EFI_STATUS
|
|
PchIoPort80DecodeSet (
|
|
IN UINTN RpPhyNumber
|
|
);
|
|
|
|
/**
|
|
Get IO APIC regsiters base address.
|
|
|
|
@param[out] IoApicBase Buffer of IO APIC regsiter address
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
**/
|
|
EFI_STATUS
|
|
PchIoApicBaseGet (
|
|
OUT UINT32 *IoApicBase
|
|
);
|
|
|
|
/**
|
|
Get HPET base address.
|
|
This function will be unavailable after P2SB is hidden by PSF.
|
|
|
|
@param[out] HpetBase Buffer of HPET base address
|
|
|
|
@retval EFI_SUCCESS Successfully completed.
|
|
@retval EFI_INVALID_PARAMETER Invalid offset passed.
|
|
**/
|
|
EFI_STATUS
|
|
PchHpetBaseGet (
|
|
OUT UINT32 *HpetBase
|
|
);
|
|
|
|
#endif // _PCH_CYCLE_DECODING_LIB_H_
|