/** @file
PCIe Initialization Library header file
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _PCIE_INIT_LIB_H_
#define _PCIE_INIT_LIB_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef PCIE_X32_SUPPORT
#define PCIE_MAX_LANE 32
#else
#define PCIE_MAX_LANE 16
#endif
#define PCIE_ROOT_PORT_BITMAP_LENGTH 8
#define PCIE_SWEQ_MAX_PRESETS 11
#ifndef STALL_ONE_MICRO_SECOND
#define STALL_ONE_MICRO_SECOND 1
#endif
#ifndef STALL_ONE_MILLI_SECOND
#define STALL_ONE_MILLI_SECOND 1000
#endif
///
/// PCIe Root Port description data structure, used as the interface between low
/// level and high level
///
typedef struct {
UINT8 MaxCapableSpeed;
UINT8 MaxCapableWidth;
BOOLEAN EnableMargin;
BOOLEAN SkipMargin;
BOOLEAN FoundUsableTxEq;
UINT8 ActiveLaneListLength;
UINT8 ActiveLaneList[PCIE_MAX_LANE];
} PCIE_PORT_SWEQ_DATA;
typedef struct {
UINT8 Bus;
UINT8 Device;
UINT8 Function;
UINTN ConfigSpaceBase;
UINT8 PcieCapOffset;
UINT8 MaxPortWidth;
UINT8 MaxPortSpeed;
UINT8 MaxPortLaneListLength;
UINT8 MaxPortLaneList[PCIE_MAX_LANE];
///
/// Variables below this line will only contain valid data after the PCIe link
/// is enabled and completes training
///
BOOLEAN EndpointPresent;
UINT32 EndpointVendorIdDeviceId;
UINT8 EndpointMaxLinkSpeed;
UINT8 EndpointMaxLinkWidth;
PCIE_PORT_SWEQ_DATA SwEqData;
} PCIE_PORT_INFO;
///
/// Data structure for passing static equalization data for programming
///
typedef struct {
PCIE_PORT_INFO *PciePort;
UINT8 RootPortPresets[PCIE_MAX_LANE];
UINT8 EndpointPresets[PCIE_MAX_LANE];
UINT8 EndpointHints[PCIE_MAX_LANE];
} PCIE_PORT_EQS;
///
/// Input Configuration Parameters for Software Equalization Support
///
typedef struct {
BOOLEAN EnableGpioPerstSupport;
GPIO_PAD GpioPad;
BOOLEAN GpioActiveHigh;
} PCIE_SWEQ_GPIO_CONFIG;
typedef struct {
PCIE_PORT_INFO *PciePort;
UINT8 StaticEndpointPresets[PCIE_MAX_LANE];
UINT8 LastBootBestPresets[PCIE_MAX_LANE];
UINT32 LastBootEndpointVendorIdDeviceId;
PCIE_SWEQ_GPIO_CONFIG GpioConfig;
BOOLEAN EnableSwEq;
} PCIE_SWEQ_PORT_INPUT;
typedef struct {
PCIE_SWEQ_PORT_INPUT *PerPortInputParameters;
UINT8 PerPortInputParametersLength;
BOOLEAN HaveDataFromLastBoot;
UINT8 PresetsToTest[PCIE_SWEQ_MAX_PRESETS];
UINT8 PresetsToTestLength;
BOOLEAN AlwaysAttemptSwEq;
UINTN JitterDwellTime;
UINT16 JitterErrorTarget;
UINTN VocDwellTime;
UINT16 VocErrorTarget;
BOOLEAN EnableVocTest;
BOOLEAN EnableBdatScoreSchema;
} PCIE_SWEQ_INPUT_PARAMETERS;
///
/// Data Output from Software Equalization
///
typedef struct {
INT32 MarginScore[PCIE_MAX_LANE];
UINT8 Preset;
} PCIE_SWEQ_PRESET_SCORE;
typedef struct {
PCIE_PORT_INFO *PciePort;
INT32 TempMarginData[PCIE_MAX_LANE];
UINT8 BestPresets[PCIE_MAX_LANE];
INT32 BestScores[PCIE_MAX_LANE];
PCIE_SWEQ_PRESET_SCORE PresetScores[PCIE_SWEQ_MAX_PRESETS];
} PCIE_SWEQ_PORT_OUTPUT;
typedef struct {
PCIE_SWEQ_PORT_OUTPUT *PortOutputList;
UINT8 PortOutputListLength;
BOOLEAN DeferredPlatformResetRequired;
} PCIE_SWEQ_OUTPUT;
typedef enum {
LaneLevelRxJitter,
PortLevelRxJitter,
VocCorners,
MarginTestTypeMax
} MARGIN_TEST_TYPE;
typedef struct _PCIE_SI_LOW_LEVEL_FUNCTION_CALLS PCIE_SI_LOW_LEVEL_FUNCTION_CALLS;
///
/// PCIe Initialization Library Generic High Level Function Calls
///
/**
The PCIe Software Equalization algorithm. Provides an adaptive EQ Phase 3
implementation in software.
@param[in] PcieAccess - Low level function table
@param[in] PciePorts - PCIe Root Ports to wait for
@param[in] PciePortsLength - Length of the PciePorts array
@param[in] InputParameters - Configuration options for SW EQ
@param[out] OutputData - The data that the algorithm generated
**/
VOID
PcieGen3SoftwareEqualization (
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *PcieAccess,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength,
IN PCIE_SWEQ_INPUT_PARAMETERS *InputParameters,
OUT PCIE_SWEQ_OUTPUT *OutputData
);
/**
Waits for the Data Link Layer on all given root ports to reach the DL_Active state.
The user passes a fail mask that indicates which root ports to check. The function
will update the fail mask to indicate which root ports successfully trained.
The fail mask is a bitmap based on PciePorts array indices. The array must be
of length 8 or greater since the PciePorts array can have at most 256 entries.
@param[in] PcieAccess - Low level function table
@param[in] PciePorts - PCIe Root Ports to wait for
@param[in] PciePortsLength - Length of the PciePorts array
@param[in] ForceCheck - TRUE to ignore current FailMask and check all root ports
@param[in, out] FailMask - Bitmap of root ports to check. Returns bitmap indicating which root ports
failed to reach DL_Active. Array must be of length 8 or greater!
**/
VOID
EFIAPI
WaitForDataLinkLayerLinkActiveOnAllPorts (
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *PcieAccess,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength,
IN BOOLEAN ForceCheck,
IN OUT UINT32 *FailMask ///< [PCIE_ROOT_PORT_BITMAP_LENGTH]
);
/**
This function prints the time required for DL_Active to be set. Quits after 100 msec.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
VOID
WaitForDataLinkLayerLinkActive (
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *PcieAccess,
IN PCIE_PORT_INFO *PciePort
);
/**
Computes the Pre-Cursor, Cursor, and Post-Cursor from a preset
@param[in] Preset - Preset to compute coefficients for
@param[in] FullSwing - The full swing of the transmitter
@param[out] PreCursor - Computed Pre-Cursor
@param[out] Cursor - Computed Cursor
@param[out] PostCursor - Computed Post-Cursor
**/
VOID
GetCoefficientsFromPreset (
IN UINT8 Preset,
IN UINT8 FullSwing,
OUT UINT8 *PreCursor,
OUT UINT8 *Cursor,
OUT UINT8 *PostCursor
);
/**
Checks for link speed and width downgrades
@param[in] PcieAccess - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] OriginalLinkSpeed - Original Speed of the Link
@param[in] OriginalLinkWidth - Original Width of the Link
**/
BOOLEAN
LinkIsDowngraded (
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *PcieAccess,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 OriginalLinkSpeed,
IN UINT8 OriginalLinkWidth
);
///
/// PCIe Initialization Library Generic Low Level Function Calls
/// All of these functions can be implemented using only PCIe specification
/// level details. However, it is possible to override the default
/// implementation provided by this library with a Silicon Specific one if needed
///
/**
This function detects if an endpoint is attached to each given root port and
if so, reads data from the endpoint and fills in the remaining fields of the
PCIE_PORT_INFO structure that could not be filled before initial link training
@param[in] This - Low level function table
@param[out] PciePorts - Array of PCIe Root Ports
@param[out] PciePortsLength - Length of the PciePorts array
**/
typedef
VOID
(EFIAPI *PCIE_DETECT_ENDPOINT_PRESENCE)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength
);
/**
Gets the PCIe Capability Structure Pointer
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@retval Offset to the PCIe Capability Structure
**/
typedef
UINT8
(EFIAPI *PCIE_GET_PCIE_CAP_OFFSET)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Checks if the Data Link Layer is in DL_Active state on the given root port
@param[in] This - Low level function table
@param[in] PciePort - Root Port to check for DL_Active
@retval TRUE - Data Link Layer is in DL_Active state
@retval FALSE - Data Link Layer is NOT in DL_Active state
**/
typedef
BOOLEAN
(EFIAPI *PCIE_DATA_LINK_LAYER_LINK_ACTIVE)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Returns the current value of the PCIe Slot Status Presence Detect bit
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@retval Slot Presence Detect bit state
**/
typedef
BOOLEAN
(EFIAPI *PCIE_GET_SLOT_PRESENCE_DETECT)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Set the Link Disable bit in the PCIe Link Control Register
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] LinkDisable - New value for link disable bit
**/
typedef
VOID
(EFIAPI *PCIE_SET_LINK_DISABLE)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN BOOLEAN LinkDisable
);
/**
Retrain the PCIe link
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
typedef
VOID
(EFIAPI *PCIE_RETRAIN_LINK)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Get Negotiated Link Width
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
typedef
UINT8
(EFIAPI *PCIE_GET_NEGOTIATED_WIDTH)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Get Current Link Speed
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
typedef
UINT8
(EFIAPI *PCIE_GET_CURRENT_LINK_SPEED)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
///
/// PCIe Initialization Library Silicon Specific Low Level Function Calls
/// Enables Abstraction of Silicon details keeping this library generic
///
/**
This function determines if the silicon implements the PCIe bus interface
that this instance of PCIE_SI_LOW_LEVEL_FUNCTION_CALLS is intended for.
@retval TRUE - Silicon supports the bus interface
@retval FALSE - otherwise
**/
typedef
BOOLEAN
(EFIAPI *PCIE_EXISTS)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This
);
/**
This function determines the topology of the PCIe bus interface that is being
initialized using silicon defined mechanisms. The PciePorts pointer must
point to a pre-allocated array which is capable of containing the maximum
number of root ports that this function will return. Generally this is done
by a component specific entrypoint that can allocate the array on the stack
using a fixed size appropriate for the HW. If this needs to be called from
generic code, the generic code must allocate a buffer that can contain 256
entries (which should be avoided.)
@param[in] This - Low level function table
@param[out] PciePorts - Array of Detected PCIe Root Ports
@param[out] PciePortsLength - Length of the PciePorts array
**/
typedef
VOID
(EFIAPI *PCIE_GET_ROOT_PORTS)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
OUT PCIE_PORT_INFO *PciePorts,
OUT UINT8 *PciePortsLength
);
/**
Programs static equalization settings for the given list of PCIe root ports.
The PCIE_PORT_EQs structure is laid out such that the Root Port preset for
PHYSICAL lane number PciePortEqs->PciePort->MaxPortLaneList[0] is
PciePortEqs->RootPortPresets[0]. Note that physical lane numbers may not
start at or include zero. Package pin 0 may not be mapped to a given Root Port
@param[in] This - Low level function table
@param[in] PciePortEqs - Array of Root Ports + Eqs to program
@param[in] PciePortEqsLength - Number of Root Ports to program
**/
typedef
VOID
(EFIAPI *PCIE_PROGRAM_STATIC_GEN3_EQ)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_EQS *PciePortEqs,
IN UINT8 PciePortEqsLength
);
/**
Sets Gen3 Equalization Phase 2 Bypass for all given Root Ports
@param[in] This - Low level function table
@param[in] PciePorts - PCIe Root Ports to program Phase2 for
@param[in] PciePortsLength - Length of the PciePorts array
@param[in] BypassPhase2 - TRUE to enable Phase2 bypass, FALSE otherwise
@retval EFI_SUCCESS - Phase 2 bypass was successful
@retval EFI_UNSUPPORTED - Hardware does not support the given Phase2 bypass request
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_SET_GEN3_PHASE2_BYPASS)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength,
IN BOOLEAN BypassPhase2
);
/**
This function reports a PCIe controller's link status
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
typedef
VOID
(EFIAPI *PCIE_REPORT_LINK_STATUS)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
///
/// PCIe Link Recovery Functions
///
/**
Wait until link is up.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@retval EFI_SUCCESS - Completed successfully before timeout
@retval EFI_TIMEOUT - Timed out
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_WAIT_FOR_L0)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Get Target Link Speed
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
**/
typedef
UINT8
(EFIAPI *PCIE_GET_TARGET_LINK_SPEED)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort
);
/**
Set Target Link Speed
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] TargetLinkSpeed - Target Link Speed
**/
typedef
VOID
(EFIAPI *PCIE_SET_TARGET_LINK_SPEED)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 TargetLinkSpeed
);
/**
Resets the endpoint connected to the given root port by directly pulsing the
PERST# signal. The minimum assertion time, T_PERST (100 usec), is defined in
the PCIe CEM Specification.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] InputParameters - SW EQ Input Parameters
@retval EFI_SUCCESS - GPIO set successfully
@retval EFI_UNSUPPORTED - GPIO is not supported
@retval EFI_INVALID_PARAMETER - GPIO pin number is invalid
@retval EFI_TIMEOUT - Link did not train after pulsing PERST#
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_RESET_ENDPOINT_PERST)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN PCIE_SWEQ_INPUT_PARAMETERS *InputParameters
);
/**
This function asserts/deasserts a GPIO that controls PERST#. The minimum
assertion time, T_PERST (100 usec), is defined in the PCIe CEM Specification.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] InputParameters - SW EQ Input Parameters
@param[in] AssertPerst - TRUE to assert PERST#, FALSE to deassert
@retval EFI_SUCCESS - GPIO set successfully
@retval EFI_UNSUPPORTED - GPIO is not supported
@retval EFI_INVALID_PARAMETER - GPIO pin number is invalid
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_SET_PERST)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN PCIE_SWEQ_INPUT_PARAMETERS *InputParameters,
IN BOOLEAN AssertPerst
);
/**
Recovers a link width downgrade back to the original width. Generally this
doesn't need to be called directly since EnsureLinkIsHealthy() checks link
width in addition to other link health checks.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] OriginalLinkWidth - Original Link Width
@retval EFI_SUCCESS - Link is running at the correct width
@retval EFI_DEVICE_ERROR - Unable to correct link width downgrade
@retval EFI_TIMEOUT - Link did not successfully retrain
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_RECOVER_LINK_WIDTH)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 OriginalLinkWidth
);
/**
This function sets a GPIO to a particular level.
@param[in] This - Low level function table
@param[in] GpioPad - PCH GPIO Pad
@param[in] Level - 0 = Low, 1 = High
@retval EFI_SUCCESS - GPIO set successfully
@retval EFI_UNSUPPORTED - GPIO is not supported
@retval EFI_INVALID_PARAMETER - GPIO pin number is invalid
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_SET_PCH_GPIO)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN GPIO_PAD GpioPad,
IN UINT8 Level
);
/**
Check the status of the given PCIe link, detect and correct and downgrades
@param[in] This - Low level function table
@param[in] InputParameters - SW EQ Input Parameters
@param[in] PciePort - PCIe Root Port
@param[in] OriginalLinkSpeed - Expected speed of the PCIe link
@param[in] OriginalLinkWidth - Expected width of the PCIe link
@param[out] DeferredPlatformResetRequired - A platform reset is needed after saving Eq data to NVRAM
@retval EFI_SUCCESS - Link is running at the correct speed/width
@retval EFI_UNSUPPORTED - Unable to correct failure due to lack of GPIO PERST# support
@retval EFI_INVALID_PARAMETER - Unable to correct failure because the GPIO pin number is invalid
@retval EFI_DEVICE_ERROR - Unable to correct link downgrade
@retval EFI_TIMEOUT - Link did not successfully retrain
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_ENSURE_LINK_IS_HEALTHY)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_SWEQ_INPUT_PARAMETERS *InputParameters,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 OriginalLinkSpeed,
IN UINT8 OriginalLinkWidth,
OUT BOOLEAN *DeferredPlatformResetRequired
);
///
/// PCIe Error Counting Functions
///
/**
Open port for monitor
@param[in] This - Low level function table
@retval Monitor Port
**/
typedef
UINT32
(EFIAPI *PCIE_OPEN_MONITOR)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This
);
/**
Close port for monitor
@param[in] This - Low level function table
@param[in] MonitorPort - Monitor Port
**/
typedef
VOID
(EFIAPI *PCIE_CLOSE_MONITOR)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN UINT32 MonitorPort
);
/**
Get Current Error Count
@param[in] This - Low level function table
@param[in] MonitorPort - Monitor Port
@param[in] PciePort - PCIe Root Port
**/
typedef
UINT32
(EFIAPI *PCIE_GET_ERROR_COUNT)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN UINT32 MonitorPort,
IN PCIE_PORT_INFO *PciePort
);
/**
Clear Current Error Count for all Root Ports
@param[in] This - Low level function table
@param[in] MonitorPort - Monitor Port
**/
typedef
VOID
(EFIAPI *PCIE_CLEAR_ERROR_COUNT)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN UINT32 MonitorPort
);
/**
Enable or Disable Polling Compliance Mode
@param[in] This - Low level function table
@param[in] PciePorts - PCIe Root Ports
@param[in] PciePortsLength - Length of PciePorts array
@param[in] Enable - TRUE to enable, FALSE to disable
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_POLLING_COMPLIANCE_MODE)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength,
IN BOOLEAN Enable
);
/**
Program TxEQs on the endpoint attached to the given root port.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] Presets - Array of presets to program per lane
must be of sufficient length to program all lanes
**/
typedef
VOID
(EFIAPI *PCIE_PROGRAM_PORT_PHASE3_TXEQ)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 *Presets///[PCIE_MAX_LANE]
);
/**
Program the same TxEQ to all lanes on the endpoint attached to the given root port.
@param[in] This - Low level function table
@param[in] PciePort - PCIe Root Port
@param[in] Preset - Preset to program
**/
typedef
VOID
(EFIAPI *PCIE_PROGRAM_UNIFORM_PORT_PHASE3_TXEQ)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePort,
IN UINT8 Preset
);
/**
Runs a Margin Test on the specified root ports. The MarginData parameter must
be an array with capacity of PciePortsLength elements or more.
@param[in] This - Low level function table
@param[in] PciePorts - PCIe Root Ports to margin
@param[in] PciePortsLength - Length of the PciePorts array
@param[in] InputParameters - SW EQ Input Parameters
@param[in] MonitorPort - Monitor Port
@param[in] MarginTest - Type of Margin Test to Run
@param[out] MarginData - Margin Data, must be array of size >= PciePortsLength
@param[out] DeferredPlatformResetRequired - A platform reset is needed after saving Eq data to NVRAM
@retval EFI_SUCCESS - Margin Data Generated Successfully
**/
typedef
EFI_STATUS
(EFIAPI *PCIE_RUN_MARGIN_TEST)(
IN PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *This,
IN PCIE_PORT_INFO *PciePorts,
IN UINT8 PciePortsLength,
IN PCIE_SWEQ_INPUT_PARAMETERS *InputParameters,
IN UINT32 MonitorPort,
IN MARGIN_TEST_TYPE MarginTest,
OUT PCIE_SWEQ_PORT_OUTPUT *MarginData,
OUT BOOLEAN *DeferredPlatformResetRequired
);
struct _PCIE_SI_LOW_LEVEL_FUNCTION_CALLS {
VOID *PrivateData;
///
/// Generic Low Level
///
PCIE_DETECT_ENDPOINT_PRESENCE DetectEndpointPresence;
PCIE_GET_PCIE_CAP_OFFSET GetPcieCapOffset;
PCIE_DATA_LINK_LAYER_LINK_ACTIVE DataLinkLayerLinkActive;
PCIE_GET_SLOT_PRESENCE_DETECT GetSlotPresenceDetect;
PCIE_SET_LINK_DISABLE SetLinkDisable;
PCIE_RETRAIN_LINK RetrainLink;
PCIE_GET_NEGOTIATED_WIDTH GetNegotiatedWidth;
PCIE_GET_CURRENT_LINK_SPEED GetCurrentLinkSpeed;
PCIE_GET_TARGET_LINK_SPEED GetTargetLinkSpeed;
PCIE_SET_TARGET_LINK_SPEED SetTargetLinkSpeed;
PCIE_SET_PERST SetPerst;
PCIE_ENSURE_LINK_IS_HEALTHY EnsureLinkIsHealthy;
///
/// Silicon Specific Low Level
///
PCIE_EXISTS PcieExists;
PCIE_GET_ROOT_PORTS GetPcieRootPorts;
PCIE_PROGRAM_STATIC_GEN3_EQ ProgramStaticGen3Eq;
PCIE_SET_GEN3_PHASE2_BYPASS SetPhase2Bypass;
PCIE_REPORT_LINK_STATUS ReportPcieLinkStatus;
PCIE_WAIT_FOR_L0 WaitForL0;
PCIE_RESET_ENDPOINT_PERST ResetEndpointPerst;
PCIE_RECOVER_LINK_WIDTH RecoverLinkWidth;
PCIE_SET_PCH_GPIO SetPchGpio;
PCIE_OPEN_MONITOR OpenMonitor;
PCIE_CLOSE_MONITOR CloseMonitor;
PCIE_GET_ERROR_COUNT GetErrorCount;
PCIE_CLEAR_ERROR_COUNT ClearErrorCount;
PCIE_POLLING_COMPLIANCE_MODE PollingComplianceMode;
PCIE_PROGRAM_PORT_PHASE3_TXEQ ProgramPortPhase3TxEq;
PCIE_PROGRAM_UNIFORM_PORT_PHASE3_TXEQ ProgramUniformPortPhase3TxEq;
PCIE_RUN_MARGIN_TEST RunMarginTest;
};
/**
Find the Offset to a given Capabilities ID
CAPID list:
- 0x01 = PCI Power Management Interface
- 0x04 = Slot Identification
- 0x05 = MSI Capability
- 0x10 = PCI Express Capability
@param[in] Bus - PCI Bus Number
@param[in] Device - PCI Device Number
@param[in] Function - PCI Function Number
@param[in] CapId - CAPID to search for
@retval 0 - CAPID not found
@retval Other - CAPID found, Offset of desired CAPID
**/
UINT32
PcieLibFindCapId (
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT8 CapId
);
/**
This function gets the table of generic low level function calls for the PCIe
interface. These function calls use PCIe spec defined mechanisms and can be
overrided by a silicon specific implementation if needed.
@param[out] PcieLowLevel - Table of function calls for PCIe
@retval EFI_SUCCESS - Table of function calls returned successfully
**/
EFI_STATUS
GetGenericPcieLowLevelFunctionCalls (
OUT PCIE_SI_LOW_LEVEL_FUNCTION_CALLS *PcieLowLevelFunctionCalls
);
#endif