/** @file
Header file for PCI Express helpers base library
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _PCIE_HELPER_LIB_H_
#define _PCIE_HELPER_LIB_H_
#include
#include
#include
#include
#include
#include
/**
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] DeviceBase device's base address
@param[in] CapId CAPID to search for
@retval 0 CAPID not found
@retval Other CAPID found, Offset of desired CAPID
**/
UINT8
PcieBaseFindCapId (
IN UINT64 DeviceBase,
IN UINT8 CapId
);
/**
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] Segment Pci Segment Number
@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 Segment,
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 Reporting Capability
0x0002 = Virtual Channel Capability
0x0003 = Device Serial Number Capability
0x0004 = Power Budgeting Capability
@param[in] DeviceBase device base address
@param[in] CapId Extended CAPID to search for
@retval 0 CAPID not found, this includes situation where device doesn't exist
@retval Other CAPID found, Offset of desired CAPID
**/
UINT16
PcieBaseFindExtendedCapId (
IN UINT64 DeviceBase,
IN UINT16 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] Segment Pci Segment Number
@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 Segment,
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
IN UINT16 CapId
);
/*
Checks device's Slot Clock Configuration
@param[in] Base device's base address
@param[in] PcieCapOffset devices Pci express capability list register offset
@retval TRUE when device device uses slot clock, FALSE otherwise
*/
BOOLEAN
GetScc (
UINT64 Base,
UINT8 PcieCapOffset
);
/*
Sets Common Clock Configuration bit for given device.
@param[in] PcieCapOffset devices Pci express capability list register offset
@param[in] Base device's base address
*/
VOID
EnableCcc (
UINT64 Base,
UINT8 PcieCapOffset
);
/*
Retrains link behind given device.
It only makes sense to call it for downstream ports.
If called for upstream port nothing will happen, it won't enter infinite loop.
@param[in] Base device's base address
@param[in] PcieCapOffset devices Pci express capability list register offset
@param[boolean] WaitUnitlDone when TRUE, function waits until link has retrained
*/
VOID
RetrainLink (
UINT64 Base,
UINT8 PcieCapOffset,
BOOLEAN WaitUntilDone
);
/*
Checks if device at given address exists
@param[in] Base device's base address
@retval TRUE when device exists; FALSE otherwise
*/
BOOLEAN
IsDevicePresent (
UINT64 Base
);
/*
Checks if device is a multifunction device
@param[in] Base device's base address
@retval TRUE if multifunction; FALSE otherwise
*/
BOOLEAN
IsMultifunctionDevice (
UINT64 Base
);
#endif // _PCIE_HELPER_LIB_H_