/** @file
Header file for PCH PCI Express helpers library
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _PCH_PCI_EXPRESS_HELPERS_LIB_H_
#define _PCH_PCI_EXPRESS_HELPERS_LIB_H_
#include
typedef enum {
TpoScale2us,
TpoScale10us,
TpoScale100us,
TpoScaleMax
} T_PO_SCALE;
typedef struct {
UINT32 Value;
T_PO_SCALE Scale;
} T_POWER_ON;
//
// Function prototypes
//
T_POWER_ON GetTpoCapability (
UINTN DeviceBase,
UINT32 L1ssCapOffset
);
T_POWER_ON GetTpo (
UINTN DeviceBase,
UINT32 L1ssCapOffset
);
/*
Sets Tpower_on in a device
According to spec, Tpower_on can only be updated while L1_2 is disabled
@param[in] DeviceBase device base address
@param[in] L1ssCapOffset offset to L1substates capability in device's extended config space
@param[in] Tpo value to be programmed into Tpower_on
*/
VOID SetTpo (
UINTN DeviceBase,
UINT32 L1ssCapOffset,
T_POWER_ON Tpo
);
/*
Converts Tpower_on from value:scale notation to microseconds
*/
UINT32 TpoToUs (
T_POWER_ON Tpo
);
/**
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
**/
UINT8
PcieFindCapId (
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT8 CapId
);
/**
Search and return the offset of desired Pci Express Capability ID
CAPID list:
0x0001 = Advanced Error Rreporting Capability
0x0002 = Virtual Channel Capability
0x0003 = Device Serial Number Capability
0x0004 = Power Budgeting Capability
@param[in] Bus Pci Bus Number
@param[in] Device Pci Device Number
@param[in] Function Pci Function Number
@param[in] CapId Extended CAPID to search for
@retval 0 CAPID not found
@retval Other CAPID found, Offset of desired CAPID
**/
UINT16
PcieFindExtendedCapId (
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT16 CapId
);
/**
This returns ClkReq Number from Port Number
@param[in] PortIndex PCIe Port Number (Zero Base. Please use 23 for GBe)
@retval ClkReq Number
**/
UINT8
GetPortClkReqNumber (
IN UINT8 PortIndex
);
/**
Set Common clock to Root port and Endpoint PCI device
@param[in] Bus1 Root port Pci Bus Number
@param[in] Device1 Root port Pci Device Number
@param[in] Function1 Root port Pci Function Number
@param[in] Bus2 Endpoint Pci Bus Number
@param[in] Device2 Endpoint Pci Device Number
@exception EFI_UNSUPPORTED Unsupported operation.
@retval EFI_SUCCESS VC mapping correctly initialized
**/
EFI_STATUS
PcieSetCommonClock (
IN UINT8 Bus1,
IN UINT8 Device1,
IN UINT8 Function1,
IN UINT8 Bus2,
IN UINT8 Device2
);
/**
This function enables the CLKREQ# PM on all the end point functions
@param[in] Bus Pci Bus Number
@param[in] Device Pci Device Number
@param[in] RootDevice Rootport Device Number
@param[in] RootFunction Rootport Function Number
@retval None
**/
VOID
PcieSetClkreq (
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice,
IN UINT8 RootDevice,
IN UINT8 RootFunction
);
/**
This function get or set the Max Payload Size on all the end point functions
@param[in] EndPointBus The Bus Number of the Endpoint
@param[in] EndPointDevice The Device Number of the Endpoint
@param[in] MaxPayload The Max Payolad Size of the root port
@param[in] Operation True: Set the Max Payload Size on all the end point functions
False: Get the Max Payload Size on all the end point functions
@retval EFI_SUCCESS Successfully completed.
**/
EFI_STATUS
PcieMaxPayloadSize (
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice,
IN OUT UINT16 *MaxPayload,
IN BOOLEAN Operation
);
/**
This function disable the forwarding of EOI messages unless it discovers
an IOAPIC behind this root port.
@param[in] RootBus The Bus Number of the root port
@param[in] RootDevice The Device Number of the root port
@param[in] RootFunction The Function Number of the root port
@param[in] EndPointBus The Bus Number of the Endpoint
@param[in] EndPointDevice The Device Number of the Endpoint
@exception EFI_UNSUPPORTED Unsupported operation.
@retval EFI_SUCCESS Successfully completed.
**/
EFI_STATUS
PcieSetEoiFwdDisable (
IN UINT8 RootBus,
IN UINT8 RootDevice,
IN UINT8 RootFunction,
IN UINT8 EndPointBus,
IN UINT8 EndPointDevice
);
/**
Initializes the root port and its down stream devices
@param[in] RootPortBus Pci Bus Number of the root port
@param[in] RootPortDevice Pci Device Number of the root port
@param[in] RootPortFunc Pci Function Number of the root port
@param[in] TempBusNumberMin Minimal temp bus number that can be assigned to the root port (as secondary
bus number) and its down stream switches
@param[in] TempBusNumberMax Maximal temp bus number that can be assigned to the root port (as subordinate
bus number) and its down stream switches
@param[in] EnableCpm Enables Clock Power Management; even if disabled, CLKREQ# can still be used by L1 PM substates mechanism
@retval EFI_SUCCESS Successfully completed
@retval EFI_NOT_FOUND Can not find device.
**/
EFI_STATUS
PchPcieInitRootPortDownstreamDevices (
IN UINT8 RootPortBus,
IN UINT8 RootPortDevice,
IN UINT8 RootPortFunc,
IN UINT8 TempBusNumberMin,
IN UINT8 TempBusNumberMax,
IN BOOLEAN EnableCpm
);
/**
Get current PCIe link speed.
@param[in] RpBase Root Port base address
@return Link speed
**/
UINT32
GetLinkSpeed (
UINTN RpBase
);
/**
Get max PCIe link speed supported by the root port.
@param[in] RpBase Root Port base address
@return Max link speed
**/
UINT32
GetMaxLinkSpeed (
UINTN RpBase
);
/**
Get Pch Maximum Pcie Controller Number
@retval Pch Maximum Pcie Controller Number
**/
UINT8
EFIAPI
GetPchMaxPcieControllerNum (
VOID
);
/**
PCIe controller configuration.
**/
typedef enum {
Pcie4x1 = 0,
Pcie1x2_2x1 = 1,
Pcie2x2 = 2,
Pcie1x4 = 3
} PCIE_CONTROLLER_CONFIG;
/**
Returns the PCIe controller configuration (4x1, 1x2-2x1, 2x2, 1x4)
@param[in] ControllerIndex Number of PCIe controller (0 based)
@retval PCIe controller configuration
**/
PCIE_CONTROLLER_CONFIG
GetPcieControllerConfig (
IN UINT32 ControllerIndex
);
#endif // _PEI_DXE_SMM_PCH_PCI_EXPRESS_HELPERS_LIB_H_