/** @file
|
PCH Pcie root port policy
|
|
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
**/
|
#ifndef _PCH_PCIERP_CONFIG_H_
|
#define _PCH_PCIERP_CONFIG_H_
|
|
#include <PchLimits.h>
|
#include <PcieConfig.h>
|
#include <ConfigBlock.h>
|
|
#define PCIE_RP_CONFIG_REVISION 1
|
#define PCIE_RP_PREMEM_CONFIG_REVISION 1
|
#define PCIE_RP_DXE_CONFIG_REVISION 1
|
|
extern EFI_GUID gPchPcieConfigGuid;
|
extern EFI_GUID gPcieRpPreMemConfigGuid;
|
|
#pragma pack (push,1)
|
|
#define PCIE_LINK_EQ_COEFFICIENTS_MAX 10
|
#define PCIE_LINK_EQ_PRESETS_MAX 11
|
|
typedef enum {
|
PchPcieOverrideDisabled = 0,
|
PchPcieL1L2Override = 0x01,
|
PchPcieL1SubstatesOverride = 0x02,
|
PchPcieL1L2AndL1SubstatesOverride = 0x03,
|
PchPcieLtrOverride = 0x04
|
} PCH_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: PCH_PCIE_ASPM_CONTROL)
|
///< Bit 1 must be set in OverrideConfig for this field to take effect
|
UINT16 OverrideConfig; ///< The override config bitmap (see: PCH_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];
|
} PCH_PCIE_DEVICE_OVERRIDE;
|
|
///
|
/// The values before AutoConfig match the setting of PCI Express Base Specification 1.1, please be careful for adding new feature
|
///
|
typedef enum {
|
PchPcieAspmDisabled,
|
PchPcieAspmL0s,
|
PchPcieAspmL1,
|
PchPcieAspmL0sL1,
|
PchPcieAspmAutoConfig,
|
PchPcieAspmMax
|
} PCH_PCIE_ASPM_CONTROL;
|
|
/**
|
Refer to PCH EDS for the PCH implementation values corresponding
|
to below PCI-E spec defined ranges
|
**/
|
typedef enum {
|
PchPcieL1SubstatesDisabled,
|
PchPcieL1SubstatesL1_1,
|
PchPcieL1SubstatesL1_1_2,
|
PchPcieL1SubstatesMax
|
} PCH_PCIE_L1SUBSTATES_CONTROL;
|
|
enum PCH_PCIE_MAX_PAYLOAD {
|
PchPcieMaxPayload128 = 0,
|
PchPcieMaxPayload256,
|
PchPcieMaxPayloadMax
|
};
|
|
typedef enum {
|
PcieLinkHardwareEq = 0, ///< Hardware is responsible for performing coefficient/preset search.
|
PcieLinkFixedEq ///< No coefficient/preset search is performed. Fixed values are used.
|
} PCIE_LINK_EQ_METHOD;
|
|
typedef enum {
|
PcieLinkEqPresetMode = 0, ///< Use presets during PCIe link equalization
|
PcieLinkEqCoefficientMode ///< Use coefficients during PCIe link equalization
|
} PCIE_LINK_EQ_MODE;
|
|
typedef struct {
|
UINT32 PreCursor; ///< Pre-cursor coefficient
|
UINT32 PostCursor; ///< Post-cursor coefficient
|
} PCIE_LINK_EQ_COEFFICIENTS;
|
|
/**
|
PCIe Link EQ Platform Settings
|
**/
|
typedef struct {
|
UINT8 PcieLinkEqMethod; ///< Tells BIOS which link EQ method should be used for this port. Please refer to PCIE_LINK_EQ_METHOD for details of supported methods. Default: PcieLinkHardwareEq
|
UINT8 PcieLinkEqMode; ///< Tells BIOS which mode should be used for PCIe link EQ. Please refer to PCIE_LINK_EQ_MODE for details of supported modes. Default: depends on SoC
|
/**
|
Specifies if BIOS should perform local transmitter override during phase 2 of EQ process.
|
If enabled value in Ph2LocalTransmitterOverridePreset must be valid.
|
<b>0: Disabled</b>; 1: Enabled
|
**/
|
UINT8 LocalTransmitterOverrideEnable;
|
/**
|
Tells BIOS how many presets/coefficients should be used during link EQ.
|
Entries in the Ph3CoefficientsList or Ph3PresetList(depending on chosen mode) need to be valid up to the number specified in this field.
|
**/
|
UINT8 Ph3NumberOfPresetsOrCoefficients;
|
|
PCIE_LINK_EQ_COEFFICIENTS Ph3CoefficientsList[PCIE_LINK_EQ_COEFFICIENTS_MAX]; ///< List of the PCIe coefficients to be used during equalization process. Only valid if PcieLinkEqMode is PcieLinkEqCoefficientMode
|
UINT32 Ph3PresetList[PCIE_LINK_EQ_PRESETS_MAX]; ///< List of the PCIe preset values to be used during equalization process. Only valid if PcieLinkEqMode is PcieLinkEqPresetMode
|
UINT32 Ph1DownstreamPortTransmitterPreset; ///< Specifies the value of the downstream port transmitter preset to be used during phase 1 of the equalization process. Will be applied to all lanes
|
UINT32 Ph1UpstreamPortTransmitterPreset; ///< Specifies the value of the upstream port transmitter preset to be used during phase 1 of the equalization process. Will be applied to all lanes
|
/**
|
Specifies the preset that should be used during local transmitter override during phase 2 of EQ process.
|
Used only if LocalTransmitterOverrideEnable is TRUE. Will be applied to all PCIe lanes of the root port.
|
Valid up to the PCIE_LINK_EQ_PRESET_MAX value. <b>Default: 0<\b>
|
**/
|
UINT32 Ph2LocalTransmitterOverridePreset;
|
} PCIE_LINK_EQ_PLATFORM_SETTINGS;
|
|
#define PCH_PCIE_NO_SUCH_CLOCK 0xFF
|
|
typedef enum {
|
PchClockUsagePchPcie0 = 0,
|
PchClockUsagePchPcie1 = 1,
|
PchClockUsagePchPcie2 = 2,
|
PchClockUsagePchPcie3 = 3,
|
PchClockUsagePchPcie4 = 4,
|
PchClockUsagePchPcie5 = 5,
|
PchClockUsagePchPcie6 = 6,
|
PchClockUsagePchPcie7 = 7,
|
PchClockUsagePchPcie8 = 8,
|
PchClockUsagePchPcie9 = 9,
|
PchClockUsagePchPcie10 = 10,
|
PchClockUsagePchPcie11 = 11,
|
PchClockUsagePchPcie12 = 12,
|
PchClockUsagePchPcie13 = 13,
|
PchClockUsagePchPcie14 = 14,
|
PchClockUsagePchPcie15 = 15,
|
PchClockUsagePchPcie16 = 16,
|
PchClockUsagePchPcie17 = 17,
|
PchClockUsagePchPcie18 = 18,
|
PchClockUsagePchPcie19 = 19,
|
PchClockUsagePchPcie20 = 20,
|
PchClockUsagePchPcie21 = 21,
|
PchClockUsagePchPcie22 = 22,
|
PchClockUsagePchPcie23 = 23,
|
/**
|
Quantity of PCH and CPU PCIe ports, as well as their encoding in this enum, may change between
|
silicon generations and series. Do not assume that PCH port 0 will be always encoded by 0.
|
Instead, it is recommended to use (PchClockUsagePchPcie0 + PchPortIndex) style to be forward-compatible
|
**/
|
PchClockUsageCpuPcie0 = 0x40,
|
PchClockUsageCpuPcie1 = 0x41,
|
PchClockUsageCpuPcie2 = 0x42,
|
PchClockUsageCpuPcie3 = 0x43,
|
|
PchClockUsageLan = 0x70,
|
PchClockUsageUnspecified = 0x80, ///< In use for a purpose not listed above
|
PchClockUsageNotUsed = 0xFF
|
} PCH_PCIE_CLOCK_USAGE;
|
|
/**
|
PCH_PCIE_CLOCK describes PCIe source clock generated by PCH.
|
**/
|
typedef struct {
|
UINT8 Usage; ///< Purpose of given clock (see PCH_PCIE_CLOCK_USAGE). Default: Unused, 0xFF
|
UINT8 ClkReq; ///< ClkSrc - ClkReq mapping. Default: 1:1 mapping with Clock numbers
|
UINT8 RsvdBytes[2]; ///< Reserved byte
|
} PCH_PCIE_CLOCK;
|
|
/**
|
The PCH_PCI_EXPRESS_ROOT_PORT_CONFIG describe the feature and capability of each PCH PCIe root port.
|
**/
|
typedef struct {
|
PCIE_ROOT_PORT_COMMON_CONFIG PcieRpCommonConfig; ///an instance of Pcie Common Config
|
UINT8 ExtSync; ///< Indicate whether the extended synch is enabled. <b>0: Disable</b>; 1: Enable.
|
//
|
// Error handlings
|
//
|
UINT8 SystemErrorEnable; ///< Indicate whether the System Error is enabled. <b>0: Disable</b>; 1: Enable.
|
/**
|
The Multiple VC (MVC) supports hardware to avoid HoQ block for latency sensitive TC.
|
Currently it is only applicable to Root Ports with 2pX4 port configuration with 2 VCs,or
|
DMI port configuration with 3 VCs. For Root Ports 2pX4 configuration, two RPs (RP0,
|
RP2) shall support two PCIe VCs (VC0 & VC1) and the other RPs (RP1, RP3) shall be
|
disabled.
|
<b>0: Disable</b>; 1: Enable
|
**/
|
UINT8 MvcEnabled;
|
/**
|
Virtual Pin Port is industry standard introduced to PCIe Hot Plug support in systems
|
when GPIO pins expansion is needed. It is server specific feature.
|
<b>0x00: Default</b>; 0xFF: Disabled
|
**/
|
UINT8 VppPort;
|
UINT8 VppAddress; ///< PCIe Hot Plug VPP SMBus Address. Default is zero.
|
UINT8 RsvdBytes0[3]; ///< Reserved bytes
|
} PCH_PCIE_ROOT_PORT_CONFIG;
|
|
/**
|
The PCH_PCIE_CONFIG block describes the expected configuration of the PCH PCI Express controllers
|
<b>Revision 1</b>:
|
- Initial version.
|
**/
|
typedef struct {
|
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
|
///
|
/// These members describe the configuration of each PCH PCIe root port.
|
///
|
PCIE_COMMON_CONFIG PcieCommonConfig;
|
PCH_PCIE_ROOT_PORT_CONFIG RootPort[PCH_MAX_PCIE_ROOT_PORTS];
|
PCIE_LINK_EQ_PLATFORM_SETTINGS PcieLinkEqPlatformSettings; ///< Global PCIe link EQ settings that BIOS will use during PCIe link EQ for every port.
|
///
|
/// <b>0: Use project default equalization settings</b>; 1: Use equalization settings from PcieLinkEqPlatformSettings
|
///
|
UINT8 OverrideEqualizationDefaults;
|
///
|
/// <b>(Test)</b> This member describes whether PCIE root port Port 8xh Decode is enabled. <b>0: Disable</b>; 1: Enable.
|
///
|
UINT8 EnablePort8xhDecode;
|
///
|
/// <b>(Test)</b> The Index of PCIe Port that is selected for Port8xh Decode (0 Based)
|
///
|
UINT8 PchPciePort8xhDecodePortIndex;
|
UINT8 RsvdBytes0[1];
|
} PCH_PCIE_CONFIG;
|
|
/**
|
The PCH_PCIE_RP_PREMEM_CONFIG block describes early configuration of the PCH PCI Express controllers
|
<b>Revision 1</b>:
|
- Initial version.
|
**/
|
typedef struct {
|
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
|
/**
|
Root Port enabling mask.
|
Bit0 presents RP1, Bit1 presents RP2, and so on.
|
0: Disable; <b>1: Enable</b>.
|
**/
|
UINT32 RpEnabledMask;
|
/// Configuration of PCIe source clocks
|
///
|
PCH_PCIE_CLOCK PcieClock[PCH_MAX_PCIE_CLOCKS];
|
|
/**
|
Per Controller Bifurcation Configuration
|
<b>0: Disabled</b>; 1: 4x1; 2: 1x2_2x1; 3: 2x2; 4: 1x4; 5: 4x2; 6: 1x4_2x2; 7: 2x2_1x4; 8: 2x4; 9: 1x8 (see: PCIE_BIFURCATION_CONFIG)
|
**/
|
UINT8 Bifurcation[PCH_MAX_PCIE_CONTROLLERS];
|
UINT8 Rsvd4[(4 - PCH_MAX_PCIE_CONTROLLERS % 4) % 4];
|
} PCH_PCIE_RP_PREMEM_CONFIG;
|
|
/**
|
The PCIE_RP_DXE_CONFIG block describes the expected configuration of the PCH PCI Express controllers in DXE phase
|
|
<b>Revision 1</b>:
|
- Init version
|
**/
|
typedef struct {
|
CONFIG_BLOCK_HEADER Header; ///< Config Block Header
|
|
/**
|
PCIe device override table
|
The PCIe device table is being used to override PCIe device ASPM settings.
|
And it's only used in DXE phase.
|
Please refer to PCH_PCIE_DEVICE_OVERRIDE structure for the table.
|
Last entry VendorId must be 0.
|
**/
|
PCH_PCIE_DEVICE_OVERRIDE *PcieDeviceOverrideTablePtr;
|
} PCIE_RP_DXE_CONFIG;
|
|
#pragma pack (pop)
|
|
#endif // _PCH_PCIERP_CONFIG_H_
|