/** @file
Pcie root port policy
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _CPU_PCIE_CONFIG_H_
#define _CPU_PCIE_CONFIG_H_
#include
#include
#include
#include
#include
#pragma pack(push, 1)
#define CPU_PCIE_PEI_PREMEM_CONFIG_REVISION 1
#define CPU_PCIE_RP_PREMEM_CONFIG_REVISION 4
/**
Making any setup structure change after code frozen
will need to maintain backward compatibility, bump up
structure revision and update below history table\n
Revision 1: - Initial version.
Revision 2: - Add Gen3TxOverride and Gen4TxOverride
Revision 3: - Deprecate Dekel Suqelch Workaround Setup Variable
Revision 4: - Add FOMS Control Policy Setup Variable
Revision 5: - Add Gen3HwEqOverride and Gen4HwEqOverride
Revision 6: - Align revision with CPU_PCIE_RP_CONFIG_REVISION value
**/
#define CPU_PCIE_RP_CONFIG_REVISION 6
#define L0_SET BIT0
#define L1_SET BIT1
/**
PCI Express and DMI controller configuration\n
@note Optional. These policies will be ignored if there is no PEG port present on board.
Revision 1:
- Initial version.
**/
typedef struct {
CONFIG_BLOCK_HEADER Header; ///< Offset 0-27 Config Block Header
/**
Offset 28:0 :
(Test) DMI Link Speed Control
- Auto (0x0) : Maximum possible link speed (Default)
- Gen1 (0x1) : Limit Link to Gen1 Speed
- Gen2 (0x2) : Limit Link to Gen2 Speed
- Gen3 (0x3) : Limit Link to Gen3 Speed
**/
UINT32 DmiMaxLinkSpeed : 2;
/**
Offset 28:2 :
(Test) DMI Equalization Phase 2 Enable Control
- Disabled (0x0) : Disable phase 2
- Enabled (0x1) : Enable phase 2
- Auto (0x2) : Use the current default method (Default)
**/
UINT32 DmiGen3EqPh2Enable : 2;
/**
Offset 28:4 :
(Test) Selects the method for performing Phase3 of Gen3 Equalization on DMI
- Auto (0x0) : Use the current default method (Default)
- HwEq (0x1) : Use Adaptive Hardware Equalization
- SwEq (0x2) : Use Adaptive Software Equalization (Implemented in BIOS Reference Code)
- Static (0x3) : Use the Static EQs provided in DmiGen3EndPointPreset array for Phase1 AND Phase3 (Instead of just Phase1)
- Disabled (0x4) : Bypass Equalization Phase 3
**/
UINT32 DmiGen3EqPh3Method : 3;
/**
Offset 28:7 :
(Test) Program DMI Gen3 EQ Phase1 Static Presets
- Disabled (0x0) : Disable EQ Phase1 Static Presets Programming
- Enabled (0x1) : Enable EQ Phase1 Static Presets Programming (Default)
**/
UINT32 DmiGen3ProgramStaticEq : 1;
UINT32 RsvdBits0 : 24; ///< Offset 28:8 :Reserved for future use
/**
Offset 32:0 :
Select when PCIe ASPM programming will happen in relation to the Oprom
- Before (0x0) : Do PCIe ASPM programming before Oprom. (Default)
- After (0x1) : Do PCIe ASPM programming after Oprom. This will require an SMI handler to save/restore ASPM settings.
**/
UINT32 InitPcieAspmAfterOprom : 1;
UINT32 RsvdBits1 : 31; ///< Offset 32:1 :Reserved for future use
UINT8 DmiGen3RootPortPreset[SA_DMI_MAX_LANE]; ///< Offset 36 Used for programming DMI Gen3 preset values per lane. Range: 0-9, 8 is default for each lane
UINT8 DmiGen3EndPointPreset[SA_DMI_MAX_LANE]; ///< Offset 40/44 Used for programming DMI Gen3 preset values per lane. Range: 0-9, 7 is default for each lane
UINT8 DmiGen3EndPointHint[SA_DMI_MAX_LANE]; ///< Offset 44/52 Hint value per lane for the DMI Gen3 End Point. Range: 0-6, 2 is default for each lane
/**
Offset 48/60 :
DMI Gen3 RxCTLEp per-Bundle control. The range of the setting is (0-15). This setting
has to be specified based upon platform design and must follow the guideline. Default is 12.
**/
UINT8 DmiGen3RxCtlePeaking[SA_DMI_MAX_BUNDLE];
UINT8 DmiDeEmphasis; ///< Offset 64 This field is used to describe the DeEmphasis control for DMI (-6 dB and -3.5 dB are the options)
UINT8 Rsvd0[3]; ///< Offset 65
} PCIE_PEI_PREMEM_CONFIG;
/**
CPU PCIe Root Port Pre-Memory Configuration
Contains Root Port settings and capabilities
Revision 1: - Initial version.
Revision 2: - Adding Dekel Suqelch Workaround Setup Variable
Revision 3: - Deprecate Dekel Suqelch Workaround Setup Variable
Revision 4: - Adding CDR Relock Setup Variable
**/
typedef struct {
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
/**
Root Port enabling mask.
Bit0 presents RP1, Bit1 presents RP2, and so on.
0: Disable; 1: Enable.
**/
UINT32 RpEnabledMask;
/**
Assertion on Link Down GPIOs
- Disabled (0x0) : Disable assertion on Link Down GPIOs(Default)
- Enabled (0x1) : Enable assertion on Link Down GPIOs
**/
UINT8 LinkDownGpios;
/**
Enable ClockReq Messaging
- Disabled> (0x0) : Disable ClockReq Messaging(Default)
- Enabled (0x1) : Enable ClockReq Messaging
**/
UINT8 ClkReqMsgEnable;
/**
Dekel Recipe Workaround
2
1=Minimal, 9=Maximum,
**/
UINT8 DekelSquelchWa; // Deprecated variable
UINT8 Rsvd0[1];
/**
Determines each PCIE Port speed capability.
0: Auto; 1: Gen1; 2: Gen2; 3: Gen3; 4: Gen4 (see: CPU_PCIE_SPEED)
**/
UINT8 PcieSpeed[CPU_PCIE_MAX_ROOT_PORTS];
/**
To Enable/Disable CDR Relock
0: Disable; 1: Enable
**/
UINT8 CdrRelock[CPU_PCIE_MAX_ROOT_PORTS];
/**
This policy is used while programming DEKEL Recipe
0: Disable; 1: Enable
**/
UINT8 Xl1el[CPU_PCIE_MAX_ROOT_PORTS];
} CPU_PCIE_RP_PREMEM_CONFIG;
typedef enum {
CpuPcieOverrideDisabled = 0,
CpuPcieL1L2Override = 0x01,
CpuPcieL1SubstatesOverride = 0x02,
CpuPcieL1L2AndL1SubstatesOverride = 0x03,
CpuPcieLtrOverride = 0x04
} CPU_PCIE_OVERRIDE_CONFIG;
/**
PCIe device table entry entry
The PCIe device table is being used to override PCIe device ASPM settings.
To take effect table consisting of such entries must be instelled as PPI
on gPchPcieDeviceTablePpiGuid.
Last entry VendorId must be 0.
**/
typedef struct {
UINT16 VendorId; ///< The vendor Id of Pci Express card ASPM setting override, 0xFFFF means any Vendor ID
UINT16 DeviceId; ///< The Device Id of Pci Express card ASPM setting override, 0xFFFF means any Device ID
UINT8 RevId; ///< The Rev Id of Pci Express card ASPM setting override, 0xFF means all steppings
UINT8 BaseClassCode; ///< The Base Class Code of Pci Express card ASPM setting override, 0xFF means all base class
UINT8 SubClassCode; ///< The Sub Class Code of Pci Express card ASPM setting override, 0xFF means all sub class
UINT8 EndPointAspm; ///< Override device ASPM (see: CPU_PCIE_ASPM_CONTROL)
///< Bit 1 must be set in OverrideConfig for this field to take effect
UINT16 OverrideConfig; ///< The override config bitmap (see: CPU_PCIE_OVERRIDE_CONFIG).
/**
The L1Substates Capability Offset Override. (applicable if bit 2 is set in OverrideConfig)
This field can be zero if only the L1 Substate value is going to be override.
**/
UINT16 L1SubstatesCapOffset;
/**
L1 Substate Capability Mask. (applicable if bit 2 is set in OverrideConfig)
Set to zero then the L1 Substate Capability [3:0] is ignored, and only L1s values are override.
Only bit [3:0] are applicable. Other bits are ignored.
**/
UINT8 L1SubstatesCapMask;
/**
L1 Substate Port Common Mode Restore Time Override. (applicable if bit 2 is set in OverrideConfig)
L1sCommonModeRestoreTime and L1sTpowerOnScale can have a valid value of 0, but not the L1sTpowerOnValue.
If L1sTpowerOnValue is zero, all L1sCommonModeRestoreTime, L1sTpowerOnScale, and L1sTpowerOnValue are ignored,
and only L1SubstatesCapOffset is override.
**/
UINT8 L1sCommonModeRestoreTime;
/**
L1 Substate Port Tpower_on Scale Override. (applicable if bit 2 is set in OverrideConfig)
L1sCommonModeRestoreTime and L1sTpowerOnScale can have a valid value of 0, but not the L1sTpowerOnValue.
If L1sTpowerOnValue is zero, all L1sCommonModeRestoreTime, L1sTpowerOnScale, and L1sTpowerOnValue are ignored,
and only L1SubstatesCapOffset is override.
**/
UINT8 L1sTpowerOnScale;
/**
L1 Substate Port Tpower_on Value Override. (applicable if bit 2 is set in OverrideConfig)
L1sCommonModeRestoreTime and L1sTpowerOnScale can have a valid value of 0, but not the L1sTpowerOnValue.
If L1sTpowerOnValue is zero, all L1sCommonModeRestoreTime, L1sTpowerOnScale, and L1sTpowerOnValue are ignored,
and only L1SubstatesCapOffset is override.
**/
UINT8 L1sTpowerOnValue;
/**
SnoopLatency bit definition
Note: All Reserved bits must be set to 0
BIT[15] - When set to 1b, indicates that the values in bits 9:0 are valid
When clear values in bits 9:0 will be ignored
BITS[14:13] - Reserved
BITS[12:10] - Value in bits 9:0 will be multiplied with the scale in these bits
000b - 1 ns
001b - 32 ns
010b - 1024 ns
011b - 32,768 ns
100b - 1,048,576 ns
101b - 33,554,432 ns
110b - Reserved
111b - Reserved
BITS[9:0] - Snoop Latency Value. The value in these bits will be multiplied with
the scale in bits 12:10
This field takes effect only if bit 3 is set in OverrideConfig.
**/
UINT16 SnoopLatency;
/**
NonSnoopLatency bit definition
Note: All Reserved bits must be set to 0
BIT[15] - When set to 1b, indicates that the values in bits 9:0 are valid
When clear values in bits 9:0 will be ignored
BITS[14:13] - Reserved
BITS[12:10] - Value in bits 9:0 will be multiplied with the scale in these bits
000b - 1 ns
001b - 32 ns
010b - 1024 ns
011b - 32,768 ns
100b - 1,048,576 ns
101b - 33,554,432 ns
110b - Reserved
111b - Reserved
BITS[9:0] - Non Snoop Latency Value. The value in these bits will be multiplied with
the scale in bits 12:10
This field takes effect only if bit 3 is set in OverrideConfig.
**/
UINT16 NonSnoopLatency;
/**
Forces LTR override to be permanent
The default way LTR override works is:
rootport uses LTR override values provided by BIOS until connected device sends an LTR message, then it will use values from the message
This settings allows force override of LTR mechanism. If it's enabled, then:
rootport will use LTR override values provided by BIOS forever; LTR messages sent from connected device will be ignored
**/
UINT8 ForceLtrOverride;
UINT8 Reserved[3];
} CPU_PCIE_DEVICE_OVERRIDE;
enum CPU_PCIE_SPEED {
CpuPcieAuto,
CpuPcieGen1,
CpuPcieGen2,
CpuPcieGen3,
CpuPcieGen4,
CpuPcieGen5
};
///
/// The values before AutoConfig match the setting of PCI Express Base Specification 1.1, please be careful for adding new feature
///
typedef enum {
CpuPcieAspmDisabled,
CpuPcieAspmL0s,
CpuPcieAspmL1,
CpuPcieAspmL0sL1,
CpuPcieAspmAutoConfig,
CpuPcieAspmMax
} CPU_PCIE_ASPM_CONTROL;
/**
Refer to SA EDS for the SA implementation values corresponding
to below PCI-E spec defined ranges
**/
typedef enum {
CpuPcieL1SubstatesDisabled,
CpuPcieL1SubstatesL1_1,
CpuPcieL1SubstatesL1_1_2,
CpuPcieL1SubstatesMax
} CPU_PCIE_L1SUBSTATES_CONTROL;
enum CPU_PCIE_MAX_PAYLOAD {
CpuPcieMaxPayload128 = 0,
CpuPcieMaxPayload256,
CpuPcieMaxPayload512,
CpuPcieMaxPayloadMax
};
enum CPU_PCIE_COMPLETION_TIMEOUT {
CpuPcieCompletionTO_Default,
CpuPcieCompletionTO_50_100us,
CpuPcieCompletionTO_1_10ms,
CpuPcieCompletionTO_16_55ms,
CpuPcieCompletionTO_65_210ms,
CpuPcieCompletionTO_260_900ms,
CpuPcieCompletionTO_1_3P5s,
CpuPcieCompletionTO_4_13s,
CpuPcieCompletionTO_17_64s,
CpuPcieCompletionTO_Disabled
};
enum CPU_PCIE_GEN3_PRESET_COEFF_SELECTION {
CpuPcieGen3PresetSelection,
CpuPcieGen3CoefficientSelection
};
enum CPU_PCIE_GEN4_PRESET_COEFF_SELECTION {
CpuPcieGen4PresetSelection,
CpuPcieGen4CoefficientSelection
};
typedef enum {
CpuPcieEqDefault = 0, ///< @deprecated since revision 3. Behaves as PchPcieEqHardware.
CpuPcieEqHardware = 1, ///< Hardware equalization
CpuPcieEqStaticCoeff = 4 ///< Fixed equalization (requires Coefficient settings per lane)
} CPU_PCIE_EQ_METHOD;
/**
Represent lane specific PCIe Gen3 equalization parameters.
**/
typedef struct {
UINT8 Cm; ///< Coefficient C-1
UINT8 Cp; ///< Coefficient C+1
UINT8 PegGen3RootPortPreset; ///< (Test) Used for programming PEG Gen3 preset values per lane. Range: 0-9, 8 is default for each lane
UINT8 PegGen3EndPointPreset; ///< (Test) Used for programming PEG Gen3 preset values per lane. Range: 0-9, 7 is default for each lane
UINT8 PegGen3EndPointHint; ///< (Test) Hint value per lane for the PEG Gen3 End Point. Range: 0-6, 2 is default for each lane
UINT8 PegGen4RootPortPreset; ///< (Test) Used for programming PEG Gen4 preset values per lane. Range: 0-9, 8 is default for each lane
UINT8 PegGen4EndPointPreset; ///< (Test) Used for programming PEG Gen4 preset values per lane. Range: 0-9, 7 is default for each lane
UINT8 PegGen4EndPointHint; ///< (Test) Hint value per lane for the PEG Gen4 End Point. Range: 0-6, 2 is default for each lane
} CPU_PCIE_EQ_LANE_PARAM;
/**
The CPU_PCI_ROOT_PORT_CONFIG describe the feature and capability of each CPU PCIe root port.
**/
typedef struct {
UINT32 ExtSync : 1; ///< Indicate whether the extended synch is enabled. 0: Disable; 1: Enable.
UINT32 VcEnabled : 1; ///< Virtual Channel. 0: Disable; 1: Enable
UINT32 MultiVcEnabled : 1; ///< Multiple Virtual Channel. 0: Disable; 1: Enable
UINT32 PeerToPeer : 1; ///< Peer to Peer Mode. 0: Disable; 1: Enable.
UINT32 RsvdBits0 : 28; ///< Reserved bits
/**
PCIe Gen4 Equalization Method
- HwEq (0x1) : Hardware Equalization (Default)
- StaticEq (0x2) : Static Equalization
**/
UINT8 Gen4EqPh3Method;
UINT8 FomsCp; ///< FOM Score Board Control Policy
UINT8 RsvdBytes0[2]; ///< Reserved bytes
//
// Gen3 Equalization settings
//
UINT32 Gen3Uptp : 4; ///< (Test) Upstream Port Transmitter Preset used during Gen3 Link Equalization. Used for all lanes. Default is 7.
UINT32 Gen3Dptp : 4; ///< (Test) Downstream Port Transmiter Preset used during Gen3 Link Equalization. Used for all lanes. Default is 7.
//
// Gen4 Equalization settings
//
UINT32 Gen4Uptp : 4; ///< (Test) Upstream Port Transmitter Preset used during Gen4 Link Equalization. Used for all lanes. Default is 7.
UINT32 Gen4Dptp : 4; ///< (Test) Downstream Port Transmiter Preset used during Gen4 Link Equalization. Used for all lanes. Default is 7.
//
// Gen5 Equalization settings
//
UINT32 Gen5Uptp : 4; ///< (Test) Upstream Port Transmitter Preset used during Gen5 Link Equalization. Used for all lanes. Default is 7.
UINT32 Gen5Dptp : 4; ///< (Test) Downstream Port Transmiter Preset used during Gen5 Link Equalization. Used for all lanes. Default is 7.
UINT32 RsvdBits1 : 8; ///< Reserved Bits
PCIE_ROOT_PORT_COMMON_CONFIG PcieRpCommonConfig; ///< (Test) Includes policies which are common to both SA and PCH RootPort
} CPU_PCIE_ROOT_PORT_CONFIG;
typedef struct {
UINT8 PcieGen3PresetCoeffSelection; ///Revision 1< / b>:
-Initial version.
Revision 2:
- SlotSelection policy added
Revision 3
- Deprecate PegGen3ProgramStaticEq and PegGen4ProgramStaticEq
Revision 4:
- Deprecating SetSecuredRegisterLock
Revision 5:
- Adding Serl
**/
typedef struct {
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
///
/// These members describe the configuration of each SA PCIe root port.
///
CPU_PCIE_ROOT_PORT_CONFIG RootPort[CPU_PCIE_MAX_ROOT_PORTS];
///
/// Gen3 Equalization settings for physical PCIe lane, index 0 represents PCIe lane 1, etc.
/// Corresponding entries are used when root port EqPh3Method is PchPcieEqStaticCoeff (default).
///
CPU_PCIE_EQ_LANE_PARAM EqPh3LaneParam[SA_PEG_MAX_LANE];
///
/// List of coefficients used during equalization (applicable to both software and hardware EQ)
///
PCIE_EQ_PARAM HwEqGen4CoeffList[PCIE_HWEQ_COEFFS_MAX]; // Deprecated Policy
PCIE_COMMON_CONFIG PcieCommonConfig; /// < (Test) Includes policies which are common to both SA and PCH PCIe
UINT32 FiaProgramming : 1; /// < Skip Fia Configuration and lock if enable
///
/// This member describes whether the PCI Express Clock Gating for each root port
/// is enabled by platform modules. 0: Disable; 1: Enable.
///
UINT32 ClockGating : 1;
///
/// This member describes whether the PCI Express Power Gating for each root port
/// is enabled by platform modules. 0: Disable; 1: Enable.
///
UINT32 PowerGating : 1;
// Deprecated Policy
/**
(Test) Program PEG Gen3 EQ Phase1 Static Presets
- Disabled (0x0) : Disable EQ Phase1 Static Presets Programming
- Enabled (0x1) : Enable EQ Phase1 Static Presets Programming (Default)
**/
UINT32 PegGen3ProgramStaticEq : 1;
// Deprecated Policy
/**
(Test) Program PEG Gen4 EQ Phase1 Static Presets
- Disabled (0x0) : Disable EQ Phase1 Static Presets Programming
- Enabled (0x1) : Enable EQ Phase1 Static Presets Programming (Default)
**/
UINT32 PegGen4ProgramStaticEq : 1;
/**
(Test) Cpu Pcie Secure Register Lock
- Disabled (0x0)
- Enabled (0x1)
**/
UINT32 SetSecuredRegisterLock : 1; // Deprecated Policy
///
/// This member allows to select between the PCI Express M2 or CEMx4 slot 1: PCIe M2; 0: CEMx4 slot.
///
UINT32 SlotSelection : 1;
///
/// Set/Clear Serl(Secure Equalization Register Lock)
///
UINT32 Serl : 1;
UINT32 RsvdBits0 : 24;
/**
PCIe device override table
The PCIe device table is being used to override PCIe device ASPM settings.
This is a pointer points to a 32bit address. And it's only used in PostMem phase.
Please refer to PCH_PCIE_DEVICE_OVERRIDE structure for the table.
Last entry VendorId must be 0.
The prototype of this policy is:
CPU_PCIE_DEVICE_OVERRIDE *PcieDeviceOverrideTablePtr;
**/
UINT32 PcieDeviceOverrideTablePtr;
CPU_PCIE_ROOT_PORT_CONFIG2 RootPort2[CPU_PCIE_MAX_ROOT_PORTS];
PCIE_COMMON_CONFIG2 PcieCommonConfig2;
} CPU_PCIE_CONFIG;
#pragma pack (pop)
#endif // _CPU_PCIE_CONFIG_H_