blob: c8a4c9b910ce38939dc7f864e1263587ef9353fc [file] [log] [blame]
/* $NoKeywords:$ */
/**
* @file
*
* PCIe component definitions.
*
*
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: GNB
* @e \$Revision: 38931 $ @e \$Date: 2010-10-01 15:50:05 -0700 (Fri, 01 Oct 2010) $
*
*/
/*
*****************************************************************************
*
* Copyright (c) 2011, Advanced Micro Devices, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Advanced Micro Devices, Inc. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ***************************************************************************
*
*/
#ifndef _GNBPCIE_H_
#define _GNBPCIE_H_
#pragma pack (push, 1)
#define MAX_NUMBER_OF_COMPLEXES 4
#define DESCRIPTOR_TERMINATE_GNB 0x40000000ull
#define DESCRIPTOR_TERMINATE_TOPOLOGY 0x20000000ull
#define DESCRIPTOR_ALLOCATED 0x10000000ull
#define DESCRIPTOR_VIRTUAL 0x08000000ull
#define DESCRIPTOR_PLATFORM 0x04000000ull
#define DESCRIPTOR_COMPLEX 0x02000000ull
#define DESCRIPTOR_SILICON 0x01000000ull
#define DESCRIPTOR_PCIE_WRAPPER 0x00800000ull
#define DESCRIPTOR_DDI_WRAPPER 0x00400000ull
#define DESCRIPTOR_PCIE_ENGINE 0x00200000ull
#define DESCRIPTOR_DDI_ENGINE 0x00100000ull
#define DESCRIPTOR_ALL_WRAPPERS (DESCRIPTOR_DDI_WRAPPER | DESCRIPTOR_PCIE_WRAPPER)
#define DESCRIPTOR_ALL_ENGINES (DESCRIPTOR_DDI_ENGINE | DESCRIPTOR_PCIE_ENGINE)
#define DESCRIPTOR_ALL_TYPES (DESCRIPTOR_ALL_WRAPPERS | DESCRIPTOR_ALL_ENGINES | DESCRIPTOR_SILICON | DESCRIPTOR_PLATFORM)
#define UNUSED_LANE_ID 128
//#define PCIE_LINK_RECEIVER_DETECTION_POOLING (60 * 1000)
//#define PCIE_LINK_L0_POOLING (60 * 1000)
//#define PCIE_LINK_GPIO_RESET_ASSERT_TIME (2 * 1000)
//#define PCIE_LINK_RESET_TO_TRAINING_TIME (2 * 1000)
// Get lowest PHY lane on engine
#define PcieLibGetLoPhyLane(Engine) (Engine != NULL ? ((Engine->EngineData.StartLane > Engine->EngineData.EndLane) ? Engine->EngineData.EndLane : Engine->EngineData.StartLane) : 0xFF)
// Get highest PHY lane on engine
#define PcieLibGetHiPhyLane(Engine) (Engine != NULL ? ((Engine->EngineData.StartLane > Engine->EngineData.EndLane) ? Engine->EngineData.StartLane : Engine->EngineData.EndLane) : 0xFF)
// Get number of lanes on wrapper
#define PcieLibWrapperNumberOfLanes(Wrapper) (Wrapper != NULL ? ((UINT8)(Wrapper->EndPhyLane - Wrapper->StartPhyLane + 1)) : 0)
// Check if virtual descriptor
#define PcieLibIsVirtualDesciptor(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_VIRTUAL) != 0) : (1==0))
// Check if it is allocated descriptor
#define PcieLibIsEngineAllocated(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_ALLOCATED) != 0) : (1==0))
// Check if it is last descriptor in list
#define PcieLibIsLastDescriptor(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) : (1==1))
// Check if descriptor a PCIe engine
#define PcieLibIsPcieEngine(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_ENGINE) != 0) : (1==0))
// Check if descriptor a DDI engine
#define PcieLibIsDdiEngine(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_DDI_ENGINE) != 0) : (1==0))
// Check if descriptor a DDI wrapper
#define PcieLibIsDdiWrapper(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_DDI_WRAPPER) != 0) : (1==0))
// Check if descriptor a PCIe wrapper
#define PcieLibIsPcieWrapper(Descriptor) (Descriptor != NULL ? ((Descriptor->Header.DescriptorFlags & DESCRIPTOR_PCIE_WRAPPER) != 0) : (1==0))
// Check if descriptor a PCIe wrapper
#define PcieLibGetNextDescriptor(Descriptor) (Descriptor != NULL ? (((Descriptor->Header.DescriptorFlags & DESCRIPTOR_TERMINATE_LIST) != 0) ? NULL : ((++Descriptor) != NULL ? Descriptor : NULL)) : NULL)
#define LANE_TYPE_PCIE_CORE_CONFIG 0x00000001
#define LANE_TYPE_PCIE_CORE_ALLOC 0x00000002
#define LANE_TYPE_PCIE_CORE_ACTIVE 0x00000004
#define LANE_TYPE_PCIE_SB_CORE_CONFIG 0x00000008
#define LANE_TYPE_PCIE_CORE_HOTPLUG 0x00000010
#define LANE_TYPE_PCIE_CORE_ALLOC_ACTIVE 0x00000020
#define LANE_TYPE_PCIE_PHY 0x00000100
#define LANE_TYPE_PCIE_PHY_NATIVE 0x00000200
#define LANE_TYPE_PCIE_PHY_NATIVE_ACTIVE 0x00000400
#define LANE_TYPE_PCIE_PHY_NATIVE_HOTPLUG 0x00000800
#define LANE_TYPE_PCIE_PHY_NATIVE_ALLOC_ACTIVE 0x00001000
#define LANE_TYPE_DDI_PHY 0x00010000
#define LANE_TYPE_DDI_PHY_NATIVE 0x00020000
#define LANE_TYPE_DDI_PHY_NATIVE_ACTIVE 0x00040000
#define LANE_TYPE_PHY_NATIVE_ALL 0x00100000
#define LANE_TYPE_CORE_ALL LANE_TYPE_PHY_NATIVE_ALL
#define LANE_TYPE_ALL LANE_TYPE_PHY_NATIVE_ALL
#define LANE_TYPE_PCIE_LANES (LANE_TYPE_PCIE_CORE_ACTIVE | LANE_TYPE_PCIE_SB_CORE_CONFIG | \
LANE_TYPE_PCIE_CORE_HOTPLUG | LANE_TYPE_PCIE_CORE_ALLOC | \
LANE_TYPE_PCIE_PHY | LANE_TYPE_PCIE_PHY_NATIVE | \
LANE_TYPE_PCIE_PHY_NATIVE_ACTIVE | LANE_TYPE_PCIE_PHY_NATIVE_HOTPLUG | \
LANE_TYPE_PCIE_CORE_CONFIG | LANE_TYPE_PCIE_PHY_NATIVE_ALLOC_ACTIVE | \
LANE_TYPE_PCIE_CORE_ALLOC_ACTIVE)
#define LANE_TYPE_DDI_LANES (LANE_TYPE_DDI_PHY | LANE_TYPE_DDI_PHY_NATIVE | LANE_TYPE_DDI_PHY_NATIVE_ACTIVE)
#define INIT_STATUS_PCIE_PORT_GEN2_RECOVERY 0x00000001ull
#define INIT_STATUS_PCIE_PORT_BROKEN_LANE_RECOVERY 0x00000002ull
#define INIT_STATUS_PCIE_PORT_TRAINING_FAIL 0x00000004ull
#define INIT_STATUS_PCIE_TRAINING_SUCCESS 0x00000008ull
#define INIT_STATUS_PCIE_EP_NOT_PRESENT 0x00000010ull
#define INIT_STATUS_PCIE_PORT_IN_COMPLIANCE 0x00000020ull
#define INIT_STATUS_DDI_ACTIVE 0x00000040ull
#define INIT_STATUS_ALLOCATED 0x00000080ull
#define PCIE_PORT_GEN_CAP_BOOT 0x00000001
#define PCIE_PORT_GEN_CAP_MAX 0x00000002
#define PCIE_GLOBAL_GEN_CAP_ALL_PORTS 0x00000010
#define PCIE_GLOBAL_GEN_CAP_TRAINED_PORTS 0x00000011
#define PCIE_GLOBAL_GEN_CAP_HOTPLUG_PORTS 0x00000012
#define PCIE_POWERGATING_SKIP_CORE 0x00000001
#define PCIE_POWERGATING_SKIP_PHY 0x00000002
/// PCIe Link Training State
typedef enum {
PcieTrainingStandard, ///< Standard training algorithm. Training contained to AmdEarlyInit.
///< PCIe device accessible after AmdEarlyInit complete
PcieTrainingDistributed, ///< Distribute training algorithm. Training distributed across AmdEarlyInit/AmdPostInit/AmdS3LateRestore
///< PCIe device accessible after AmdPostInit complete.
///< Algorithm potentially save up to 60ms in S3 resume time by skipping training empty slots.
} PCIE_TRAINING_ALGORITHM;
/// PCIe Link Training State
typedef enum {
LinkStateResetAssert, ///< Assert port GPIO reset
LinkStateResetDuration, ///< Timeout for reset duration
LinkStateResetExit, ///< Deassert port GPIO reset
LinkTrainingResetTimeout, ///< Port GPIO reset timeout
LinkStateReleaseTraining, ///< Release link training
LinkStateDetectPresence, ///< Detect device presence
LinkStateDetecting, ///< Detect link training.
LinkStateBrokenLane, ///< Check and handle broken lane
LinkStateGen2Fail, ///< Check and handle device that fail training if GEN2 capability advertised
LinkStateL0, ///< Device trained to L0
LinkStateVcoNegotiation, ///< Check VCO negotiation complete
LinkStateRetrain, ///< Force retrain link.
LinkStateTrainingFail, ///< Link training fail
LinkStateTrainingSuccess, ///< Link training success
LinkStateGfxWorkaround, ///< GFX workaround
LinkStateCompliance, ///< Link in compliance mode
LinkStateDeviceNotPresent, ///< Link is not connected
LinkStateTrainingCompleted ///< Link training completed
} PCIE_LINK_TRAINING_STATE;
/// PCIe Port Visibility
typedef enum {
UnhidePorts, ///< Command to unhide port
HidePorts, ///< Command to hide unused ports
} PCIE_PORT_VISIBILITY;
/// Table Register Entry
typedef struct {
UINT16 Reg; ///< Address
UINT32 Mask; ///< Mask
UINT32 Data; ///< Data
} PCIE_PORT_REGISTER_ENTRY;
/// Table Register Entry
typedef struct {
PCIE_PORT_REGISTER_ENTRY *Table; ///< Table
UINT32 Length; ///< Length
} PCIE_PORT_REGISTER_TABLE_HEADER;
/// Table Register Entry
typedef struct {
UINT32 Reg; ///< Address
UINT32 Mask; ///< Mask
UINT32 Data; ///< Data
} PCIE_HOST_REGISTER_ENTRY;
/// Table Register Entry
typedef struct {
PCIE_HOST_REGISTER_ENTRY *Table; ///< Table
UINT32 Length; ///< Length
} PCIE_HOST_REGISTER_TABLE_HEADER;
///Link ASPM info
typedef struct {
PCI_ADDR DownstreamPort; ///< PCI address of downstream port
PCIE_ASPM_TYPE DownstreamAspm; ///< Downstream Device Aspm
PCI_ADDR UpstreamPort; ///< PCI address of upstream port
PCIE_ASPM_TYPE UpstreamAspm; ///< Upstream Device Capability
PCIE_ASPM_TYPE RequestedAspm; ///< Requested ASPM
} PCIe_LINK_ASPM;
///PCIe ASPM Latency Information
typedef struct {
UINT8 MaxL0sExitLatency; ///< Max L0s exit latency in us
UINT8 MaxL1ExitLatency; ///< Max L1 exit latency in us
} PCIe_ASPM_LATENCY_INFO;
/// PCI address association
typedef struct {
UINT8 NewDeviceAddress; ///< New PCI address (Device,Fucntion)
UINT8 NativeDeviceAddress; ///< Native PCI address (Device,Fucntion)
} PCI_ADDR_LIST;
/// The return status for GFX Card Workaround.
typedef enum {
GFX_WORKAROUND_DEVICE_NOT_READY, ///< GFX Workaround device is not ready.
GFX_WORKAROUND_RESET_DEVICE, ///< GFX Workaround device need reset.
GFX_WORKAROUND_SUCCESS ///< The service completed normally.
} GFX_WORKAROUND_STATUS;
/// GFX workaround control
typedef enum {
GfxWorkaroundDisable, ///< GFX Workaround disabled
GfxWorkaroundEnable ///< GFX Workaround enabled
} GFX_WORKAROUND_CONTROL;
/// PIF lane power state
typedef enum {
PifPowerStateL0, ///<
PifPowerStateLS1, ///<
PifPowerStateLS2, ///<
PifPowerStateOff = 0x7, ///<
} PCIE_PIF_POWER_STATE;
/// PIF lane power control
typedef enum {
PowerDownPifs, ///<
PowerUpPifs ///<
} PCIE_PIF_POWER_CONTROL;
///PLL rumup time
typedef enum {
NormalRampup, ///<
LongRampup, ///<
} PCIE_PLL_RAMPUP_TIME;
/// PCIe port configuration info
typedef struct {
PCIe_PORT_DATA PortData; ///< Port data
UINT8 StartCoreLane; ///< Start Core Lane
UINT8 EndCoreLane; ///< End Core lane
UINT8 NativeDevNumber :5; ///< Native PCI device number of the port
UINT8 NativeFunNumber :3; ///< Native PCI function number of the port
UINT8 CoreId :4; ///< PCIe core ID
UINT8 PortId :4; ///< Port ID on wrapper
PCI_ADDR Address; ///< PCI address of the port
UINT8 State; ///< Training state
UINT32 TimeStamp; ///< Time stamp used to during training process
UINT8 GfxWrkRetryCount; ///< Number of retry for GFX workaround
} PCIe_PORT_CONFIG;
///Descriptor header
typedef struct {
UINT32 DescriptorFlags; ///< Descriptor flags
UINT16 Parent; ///< Offset of parent descriptor
UINT16 Peer; ///< Offset of the peer descriptor
UINT16 Child; ///< Offset of the list of child descriptors
} PCIe_DESCRIPTOR_HEADER;
/// DDI (Digital Display Interface) configuration info
typedef struct {
PCIe_DDI_DATA DdiData; ///< DDI Data
UINT8 DisplayPriorityIndex; ///< Display priority index
UINT8 ConnectorId; ///< Connector id determined by enumeration
UINT8 DisplayDeviceId; ///< Display device id determined by enumeration
} PCIe_DDI_CONFIG;
/// Engine configuration data
typedef struct {
PCIe_DESCRIPTOR_HEADER Header; ///< Descripto header
PCIe_ENGINE_DATA EngineData; ///< Engine Data
UINT32 InitStatus; ///< Initialization Status
UINT8 Scratch; ///< Scratch pad
union {
PCIe_PORT_CONFIG Port; ///< PCIe port configuration data
PCIe_DDI_CONFIG Ddi; ///< DDI configuration data
} Type;
} PCIe_ENGINE_CONFIG;
/// Wrapper configuration data
typedef struct {
PCIe_DESCRIPTOR_HEADER Header; ///< Descrptor Header
UINT8 WrapId; ///< Wrapper ID
UINT8 NumberOfPIFs; ///< Number of PIFs on wrapper
UINT8 StartPhyLane; ///< Start PHY Lane
UINT8 EndPhyLane; ///< End PHY Lane
UINT8 StartPcieCoreId:4; ///< Start PCIe Core ID
UINT8 EndPcieCoreId:4; ///< End PCIe Core ID
UINT8 NumberOfLanes; ///< Number of lanes
struct {
UINT8 PowerOffUnusedLanes:1; ///< Power Off unused lanes
UINT8 PowerOffUnusedPlls:1; ///< Power Off unused Plls
UINT8 ClkGating:1; ///< TXCLK gating
UINT8 LclkGating:1; ///< LCLK gating
UINT8 TxclkGatingPllPowerDown:1; ///< TXCLK clock gating PLL power down
UINT8 PllOffInL1:1; ///< PLL off in L1
} Features;
} PCIe_WRAPPER_CONFIG;
/// Silicon configuration data
typedef struct {
PCIe_DESCRIPTOR_HEADER Header; ///< Descrptor Header
UINT8 SiliconId; ///< Gnb silicon(module) ID
PCI_ADDR Address; ///< PCI address of GNB host bridge
} PCIe_SILICON_CONFIG;
/// Complex configuration data
typedef struct {
PCIe_DESCRIPTOR_HEADER Header; ///< Descrptor Header
UINT8 SocketId; ///< Processor socket ID
} PCIe_COMPLEX_CONFIG;
/// PCIe platform configuration info
typedef struct {
PCIe_DESCRIPTOR_HEADER Header; ///< Descrptor Header
PVOID StdHeader; ///< Standard configuration header
UINT32 LinkReceiverDetectionPooling; ///< Receiver pooling detection time in us.
UINT32 LinkL0Pooling; ///< Pooling for link to get to L0 in us
UINT32 LinkGpioResetAssertionTime; ///< Gpio reset assertion time in us
UINT32 LinkResetToTrainingTime; ///< Time duration between deassert GPIO reset and release training in us ///
UINT8 GfxCardWorkaround; ///< GFX Card Workaround
UINT8 PsppPolicy; ///< PSPP policy
UINT8 TrainingExitState; ///< State at which training should exit (see PCIE_LINK_TRAINING_STATE)
UINT8 TrainingAlgorithm; ///< Training algorithm (see PCIE_TRAINING_ALGORITHM)
PCIe_COMPLEX_CONFIG ComplexList[MAX_NUMBER_OF_COMPLEXES]; ///< Complex
} PCIe_PLATFORM_CONFIG;
/// PCIe Engine Description
typedef struct {
UINT32 Flags; /**< Descriptor flags
* @li @b Bit31 - last descriptor on wrapper
* @li @b Bit30 - Descriptor allocated for PCIe port or DDI
*/
PCIe_ENGINE_DATA EngineData; ///< Engine Data
} PCIe_ENGINE_DESCRIPTOR;
#pragma pack (pop)
#endif