/** @file
This file contains internal header for PSF lib usage
Copyright (c) 2019 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _PCH_PSF_PRIVATE_LIB_INTERNAL_H_
#define _PCH_PSF_PRIVATE_LIB_INTERNAL_H_
#include
#include
#define PSF_PORT_NULL ((PSF_PORT){0,0})
#define PSF_IS_PORT_NULL(PsfPort) ((PsfPort.PsfPid == 0) && (PsfPort.RegBase == 0))
/**
Disable bridge (e.g. PCIe Root Port) at PSF level
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfDisableBridge (
IN PSF_PORT PsfPort
);
/**
Disable bridge (e.g. PCIe Root Port) at PSF level in RS3
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfRs3DisableBridge (
IN PSF_PORT PsfPort
);
/**
Check if bridge (e.g. PCIe Root Port) is enabled at PSF level
@param[in] PsfPort PSF PORT data structure
@retval TRUE Bridge behind PSF Port is enabled
FALSE Bridge behind PSF Port is disabled
**/
BOOLEAN
PsfIsBridgeEnabled (
IN PSF_PORT PsfPort
);
/**
Disable device IOSpace at PSF level
Method not for bridges (e.g. PCIe Root Port)
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfDisableDeviceIoSpace (
IN PSF_PORT PsfPort
);
/**
Enable device IOSpace at PSF level
Method not for bridges (e.g. PCIe Root Port)
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfEnableDeviceIoSpace (
IN PSF_PORT PsfPort
);
/**
Disable device Memory Space at PSF level
Method not for bridges (e.g. PCIe Root Port)
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfDisableDeviceMemSpace (
IN PSF_PORT PsfPort
);
/**
Enable device Memory Space at PSF level
Method not for bridges (e.g. PCIe Root Port)
@param[in] PsfPort PSF PORT data structure
**/
VOID
PsfEnableDeviceMemSpace (
IN PSF_PORT PsfPort
);
/**
Set device BARx address at PSF level
Method not for bridges (e.g. PCIe Root Port)
@param[in] PsfPort PSF PORT data structure
@param[in] BarNum BAR Number (0:BAR0, 1:BAR1, ...)
@param[in] BarValue 32bit BAR value
**/
VOID
PsfSetDeviceBarValue (
IN PSF_PORT PsfPort,
IN UINT8 BarNum,
IN UINT32 BarValue
);
/**
Return PSF_PORT for TraceHub device
@retval PsfPort PSF PORT structure for TraceHub device
**/
PSF_PORT
PsfTraceHubPort (
VOID
);
/**
This procedure will return PSF_PORT for TraceHub ACPI device
@retval PsfPort PSF PORT structure for TraceHub ACPI device
**/
PSF_PORT
PsfTraceHubAcpiDevPort (
VOID
);
/**
Return PSF_PORT for HECI device
@param[in] HeciDevice HECIx Device (HECI1-4)
@retval PsfPort PSF PORT structure for HECI device
**/
PSF_PORT
PsfHeciPort (
IN UINT8 HeciDevice
);
/**
This procedure will return PSF_PORT for SOL device
@retval PsfPort PSF PORT structure for SOL device
**/
PSF_PORT
PsfSolPort (
VOID
);
/**
Return PSF_PORT for ISH device
@retval PsfPort PSF PORT structure for ISH device
**/
PSF_PORT
PsfIshPort (
VOID
);
/**
Return PSF_PORT for CNVi device
@retval PsfPort PSF PORT structure for CNVi device
**/
PSF_PORT
PsfCnviPort (
VOID
);
/**
Return PSF_PORT for PMC device
@retval PsfPort PSF PORT structure for PMC device
**/
PSF_PORT
PsfPmcPort (
VOID
);
/**
Return second level PSF_PORT to which PCIE Root Port device is connected (directly)
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe
**/
PSF_PORT
PsfPcieSecondLevelPort (
IN UINT32 RpIndex
);
/**
Return PSF_PORT at root PSF level to which PCIe Root Port device is connected
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe
**/
PSF_PORT
PsfRootPciePort (
IN UINT32 RpIndex
);
/**
Return RS3 PSF_PORT at root PSF level to which PCIe Root Port device is connected
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe
**/
PSF_PORT
PsfRootRs3PciePort (
IN UINT32 RpIndex
);
/**
Check if PCIe Root Port is enabled
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval TRUE PCIe Root Port is enabled
FALSE PCIe Root Port is disabled
**/
BOOLEAN
PsfIsPcieRootPortEnabled (
IN UINT32 RpIndex
);
//
// Type of enpoint connected to PSF port.
// PsfNullPort is used for ports which do not exist
//
typedef enum {
PsfNullPort,
PsfToPsfPort,
PsfPcieCtrlPort
} PSF_TOPO_PORT_TYPE;
//
// Structure for storing information on location in PSF topology
// Every PSF node is identified by PsfID and PsfPortId
//
typedef struct {
UINT8 PsfId;
UINT8 PortId;
} PSF_TOPO_PORT;
#define PSF_TOPO_PORT_NULL ((PSF_TOPO_PORT){0, 0})
#define PSF_IS_TOPO_PORT_NULL(PsfTopoPort) (((PsfTopoPort).PsfId == 0) && ((PsfTopoPort).PortId == 0))
//
// This is optional field containing PSF port specific data
//
typedef union {
UINT32 PcieCtrlIndex;
} PSF_TOPO_PORT_DATA;
//
// Structure representing PSF port in PSF topology
// If port is of PsfToPsfPort type Child will point to the first
// port of sub PSF segment.
//
typedef struct PSF_TOPOLOGY {
PSF_TOPO_PORT PsfPort;
PSF_TOPO_PORT_TYPE PortType;
CONST struct PSF_TOPOLOGY *Child;
PSF_TOPO_PORT_DATA PortData;
} PSF_TOPOLOGY;
//
// Tag for identifying last element of PSF_TOPOLOGY type array
//
#define PSF_TOPOLOGY_END {{0, 0}, PsfNullPort, NULL}
/**
Get PSF Pcie Tree topology
@param[in] PsfTopology PSF Port from PSF PCIe tree topology
@retval PsfTopology PSF PCIe tree topology
**/
CONST PSF_TOPOLOGY*
PsfGetRootPciePsfTopology (
VOID
);
//
// Structure for storing data on PCIe controller to PSF assignment and GrantCount register offsets
//
typedef struct {
PCH_SBI_PID PsfPid;
UINT16 DevGntCnt0Base;
UINT16 TargetGntCntPg1Tgt0Base;
} PSF_GRANT_COUNT_REG;
/**
Grant count regs data for PSF that is directly connected to PCIe Root Ports
@param[in] Controller PCIe Root Port Controller index (0 based)
@param[out] GrantCountReg Structure with PSF Grant Count register data
**/
VOID
PsfPcieGrantCountBaseReg (
IN UINT8 Controller,
OUT PSF_GRANT_COUNT_REG *GrantCountReg
);
/**
Get Grant Count number (Device Grant Count and Target Grant Count)
for PSF that is directly connected to PCIe Root Ports
@param[in] Controller PCIe Root Port Controller index
@param[in] Channel PCIe Root Port Channel index
@param[out] DgcrNo Device Grant Count number
@param[out] PgTgtNo Target Grant Count number
**/
VOID
PsfPcieGrantCountNumber (
IN UINT8 Controller,
IN UINT8 Channel,
OUT UINT8 *DgcrNo,
OUT UINT8 *PgTgtNo
);
/**
Grant count regs data for a given PSF-to-PSF port.
@param[in] PsfTopoPort PSF-to-PSF port
@param[out] GrantCountReg Structure with PSF Grant Count register data
**/
VOID
PsfSegmentGrantCountBaseReg (
IN PSF_TOPO_PORT PsfTopoPort,
OUT PSF_GRANT_COUNT_REG *GrantCountReg
);
/**
Grant Count number (Device Grant Count and Target Grant Count) for a given PSF-to-PSF port.
@param[in] PsfTopoPort PSF-to-PSF port
@param[out] DgcrNo Device Grant Count number
@param[out] PgTgtNo Target Grant Count number
**/
VOID
PsfSegmentGrantCountNumber (
IN PSF_TOPO_PORT PsfTopoPort,
OUT UINT8 *DgcrNo,
OUT UINT8 *PgTgtNo
);
//
// Do not override PSF Grant Count value and leave HW default setting
//
#define DEFAULT_PCIE_GRANT_COUNT 0xFF
typedef struct {
UINT32 Id;
PCH_SBI_PID SbPid;
} PSF_SEGMENT;
/**
Get list of supported PSF segments.
@param[out] PsfTable Array of supported PSF segments
@param[out] PsfTableLength Length of PsfTable
**/
VOID
PsfSegments (
OUT PSF_SEGMENT **PsfTable,
OUT UINT32 *PsfTableLength
);
/**
Get PSF SideBand Port ID from PSF ID (1 - PSF1, 2 - PSF2, ...)
@param[in] PsfId PSF ID (1 - PSF1, 2 - PSF2, ...)
@retval PSF SideBand Port ID
**/
PCH_SBI_PID
PsfSbPortId (
UINT32 PsfId
);
/**
Get EOI register data for given PSF ID
@param[in] PsfId PSF ID (1 - PSF1, 2 - PSF2, ...)
@param[out] EoiTargetBase EOI Target register
@param[out] EoiControlBase EOI Control register
@retval MaxTargets Number of supported targets
**/
UINT8
PsfEoiRegData (
UINT32 PsfId,
UINT16 *EoiTargetBase,
UINT16 *EoiControlBase
);
/**
Get MCTP register data for given PSF ID
@param[in] PsfId PSF ID (1 - PSF1, 2 - PSF2, ...)
@param[out] MctpTargetBase MCTP Target register
@param[out] MctpControlBase MCTP Control register
@retval MaxTargets Number of supported targets
**/
UINT8
PsfMctpRegData (
UINT32 PsfId,
UINT16 *MctpTargetBase,
UINT16 *MctpControlBase
);
/**
P2SB PSF port Destination ID (psf_id:port_group_id:port_id:channel_id)
@retval P2SB Destination ID
**/
PSF_PORT_DEST_ID
PsfP2sbDestinationId (
VOID
);
/**
DMI PSF port Destination ID (psf_id:port_group_id:port_id:channel_id)
@retval DMI Destination ID
**/
PSF_PORT_DEST_ID
PsfDmiDestinationId (
VOID
);
/**
Check if MCTP is supported
@retval TRUE MCTP is supported
FALSE MCTP is not supported
**/
BOOLEAN
PsfIsMctpSupported (
VOID
);
/**
Return the PSF (Root level) Function Config PSF_PORT for PCIe Root Port
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe Function Config
**/
PSF_PORT
PsfRootPcieFunctionConfigPort (
IN UINT32 RpIndex
);
/**
Return the PSF (Root level) RS3 Function Config PSF_PORT for PCIe Root Port
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe Function Config
**/
PSF_PORT
PsfRootRs3PcieFunctionConfigPort (
IN UINT32 RpIndex
);
/**
Return the PSF Function Config Second Level PSF_PORT for PCIe Root Port
@param[in] RpIndex PCIe Root Port Index (0 based)
@retval PsfPort PSF PORT structure for PCIe Function Config
**/
PSF_PORT
PsfPcieFunctionConfigSecondLevelPort (
IN UINT32 RpIndex
);
#endif