blob: c20c29470672b3dd98d12ac32e39a5865b4b2ecb [file] [log] [blame]
/* $NoKeywords:$ */
/**
* @file
*
* Internal access to HT Interface.
*
* This file provides definitions used by HT internal modules. The
* external HT interface (in agesa.h) is accessed using these methods.
* This keeps the HT Feature implementations abstracted from the HT
* interface.
*
* This file includes the interface access constructor and interface
* support which is not removed with various build options.
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: HyperTransport
* @e \$Revision: 63425 $ @e \$Date: 2011-12-22 11:24:10 -0600 (Thu, 22 Dec 2011) $
*
*/
/*
*****************************************************************************
*
* Copyright 2008 - 2012 ADVANCED MICRO DEVICES, INC. All Rights Reserved.
*
* AMD is granting you permission to use this software (the Materials)
* pursuant to the terms and conditions of your Software License Agreement
* with AMD. This header does *NOT* give you permission to use the Materials
* or any rights under AMD's intellectual property. Your use of any portion
* of these Materials shall constitute your acceptance of those terms and
* conditions. If you do not agree to the terms and conditions of the Software
* License Agreement, please do not use any portion of these Materials.
*
* CONFIDENTIALITY: The Materials and all other information, identified as
* confidential and provided to you by AMD shall be kept confidential in
* accordance with the terms and conditions of the Software License Agreement.
*
* LIMITATION OF LIABILITY: THE MATERIALS AND ANY OTHER RELATED INFORMATION
* PROVIDED TO YOU BY AMD ARE PROVIDED "AS IS" WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTY OF ANY KIND, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
* MERCHANTABILITY, NONINFRINGEMENT, TITLE, FITNESS FOR ANY PARTICULAR PURPOSE,
* OR WARRANTIES ARISING FROM CONDUCT, COURSE OF DEALING, OR USAGE OF TRADE.
* IN NO EVENT SHALL AMD OR ITS LICENSORS BE LIABLE FOR ANY DAMAGES WHATSOEVER
* (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS
* INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF AMD'S NEGLIGENCE,
* GROSS NEGLIGENCE, THE USE OF OR INABILITY TO USE THE MATERIALS OR ANY OTHER
* RELATED INFORMATION PROVIDED TO YOU BY AMD, EVEN IF AMD HAS BEEN ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME JURISDICTIONS PROHIBIT THE
* EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES,
* THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
*
* AMD does not assume any responsibility for any errors which may appear in
* the Materials or any other related information provided to you by AMD, or
* result from use of the Materials or any related information.
*
* You agree that you will not reverse engineer or decompile the Materials.
*
* NO SUPPORT OBLIGATION: AMD is not obligated to furnish, support, or make any
* further information, software, technical information, know-how, or show-how
* available to you. Additionally, AMD retains the right to modify the
* Materials at any time, without notice, and is not obligated to provide such
* modified Materials to you.
*
* U.S. GOVERNMENT RESTRICTED RIGHTS: The Materials are provided with
* "RESTRICTED RIGHTS." Use, duplication, or disclosure by the Government is
* subject to the restrictions as set forth in FAR 52.227-14 and
* DFAR252.227-7013, et seq., or its successor. Use of the Materials by the
* Government constitutes acknowledgement of AMD's proprietary rights in them.
*
* EXPORT ASSURANCE: You agree and certify that neither the Materials, nor any
* direct product thereof will be exported directly or indirectly, into any
* country prohibited by the United States Export Administration Act and the
* regulations thereunder, without the required authorization from the U.S.
* government nor will be used for any purpose prohibited by the same.
* ***************************************************************************
*
*/
#ifndef _HT_INTERFACE_H_
#define _HT_INTERFACE_H_
/**
* @page htimplintf HT Internal Interface Implementation Guide
*
* HT Internal Interface provides access to the HT Component external interface (see AGESA.h),
* in a manner that isolates calling code from knowledge about the external interface or which
* interfaces are supported in the current build.
*
* @par Adding a Method to HT Internal Interface
*
* To add a new method to the HT Internal Interface, follow these steps.
* <ul>
* <li> Create a typedef for the Method with the correct parameters and return type.
*
* <ul>
* <li> Name the method typedef (F_METHOD_NAME)(), where METHOD_NAME is the same name as the method table item,
* but with "_"'s and UPPERCASE, rather than mixed case.
* @n <tt> typedef VOID (F_METHOD_NAME)(); </tt> @n
*
* <li> Make a reference type for references to a method implementation:
* @n <tt> /// Reference to a Method </tt>
* @n <tt> typedef F_METHOD_NAME *PF_METHOD_NAME </tt> @n
* </ul>
*
* <li> Provide a standard doxygen function preamble for the Method typedef. Begin the
* detailed description by providing a reference to the method instances page by including
* the lines below:
* @code
* *
* * @HtInterfaceInstances
* *
* @endcode
* @note It is important to provide documentation for the method type, because the method may not
* have an implementation in any families supported by the current package. @n
*
* <li> Add to the HT_INTERFACE struct an item for the Method:
* @n <tt> PF_METHOD_NAME MethodName; ///< Method: description. </tt> @n
* </ul>
*
* @par Implementing an HT Internal Interface Instance of the method.
*
* To implement an instance of a method for a specific interface follow these steps.
*
* - In appropriate files, implement the method with the return type and parameters
* matching the method typedef.
*
* - Name the function MethodName().
*
* - Create a doxygen function preamble for the method instance. Begin the detailed description with
* an Implements command to reference the method type and add this instance to the Method Instances page.
* @code
* *
* * @HtInterfaceMethod{::F_METHOD_NAME}.
* *
* @endcode
*
* - To access other Ht internal interface routines or data as part of the method implementation, the function
* must use HtInterface->OtherMethod(). Do not directly access other HT internal interface
* routines, because in the table there may be overrides or this routine may be shared by multiple families.
*
* - Add the instance to the HT_INTERFACE instances.
*
* - If a configuration does not need an instance of the method use one of the CommonReturns from
* CommonReturns.h with the same return type.
*
* @par Invoking HT Internal Interface Methods.
*
* The first step is carried out only once by the top level HT entry point.
* @n @code
* HT_INTERFACE HtInterface;
* // Get the current HT internal interface (to HtBlock data)
* NewHtInterface (&HtInterface);
* State->HtInterface = &HtInterface;
* @endcode
*
* The following example shows how to invoke a HT Internal Interface method.
* @n @code
* State->HtInterface->MethodName ();
* @endcode
*
*/
/*----------------------------------------------------------------------------
* Mixed (DEFINITIONS AND MACROS / TYPEDEFS, STRUCTURES, ENUMS)
*
*----------------------------------------------------------------------------
*/
/*-----------------------------------------------------------------------------
* DEFINITIONS AND MACROS
*
*-----------------------------------------------------------------------------
*/
/*----------------------------------------------------------------------------
* TYPEDEFS, STRUCTURES, ENUMS
*
*----------------------------------------------------------------------------
*/
/**
* Get limits for CPU to CPU Links.
*
* @HtInterfaceInstances.
*
* @param[in] NodeA One Node on which this Link is located
* @param[in] LinkA The Link on this Node
* @param[in] NodeB The other Node on which this Link is located
* @param[in] LinkB The Link on that Node
* @param[in,out] ABLinkWidthLimit modify to change the Link Width In
* @param[in,out] BALinkWidthLimit modify to change the Link Width Out
* @param[in,out] PcbFreqCap modify to change the Link's frequency capability
* @param[in] State the input data
*
*/
typedef VOID F_GET_CPU_2_CPU_PCB_LIMITS (
IN UINT8 NodeA,
IN UINT8 LinkA,
IN UINT8 NodeB,
IN UINT8 LinkB,
IN OUT UINT8 *ABLinkWidthLimit,
IN OUT UINT8 *BALinkWidthLimit,
IN OUT UINT32 *PcbFreqCap,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_CPU_2_CPU_PCB_LIMITS *PF_GET_CPU_2_CPU_PCB_LIMITS;
/**
* Skip reganging of subLinks.
*
* @HtInterfaceInstances.
*
* @param[in] NodeA One Node on which this Link is located
* @param[in] LinkA The Link on this Node
* @param[in] NodeB The other Node on which this Link is located
* @param[in] LinkB The Link on that Node
* @param[in] State the input data
*
* @retval MATCHED leave Link unganged
* @retval POWERED_OFF leave link unganged and power off the paired sublink
* @retval UNMATCHED regang Link automatically
*/
typedef FINAL_LINK_STATE F_GET_SKIP_REGANG (
IN UINT8 NodeA,
IN UINT8 LinkA,
IN UINT8 NodeB,
IN UINT8 LinkB,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_SKIP_REGANG *PF_GET_SKIP_REGANG;
/**
* Manually control bus number assignment.
*
* @HtInterfaceInstances.
*
* @param[in] Node The Node on which this chain is located
* @param[in] Link The Link on the host for this chain
* @param[out] SecBus Secondary Bus number for this non-coherent chain
* @param[out] SubBus Subordinate Bus number
* @param[in] State the input data
*
* @retval TRUE this routine is supplying the bus numbers
* @retval FALSE use auto Bus numbering
*/
typedef BOOLEAN F_GET_OVERRIDE_BUS_NUMBERS (
IN UINT8 Node,
IN UINT8 Link,
OUT UINT8 *SecBus,
OUT UINT8 *SubBus,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_OVERRIDE_BUS_NUMBERS *PF_GET_OVERRIDE_BUS_NUMBERS;
/**
* Get Manual BUID assignment list.
*
* @HtInterfaceInstances.
*
* @param[in] Node The Node on which this chain is located
* @param[in] Link The Link on the host for this chain
* @param[out] List a pointer to a list, if returns TRUE
* @param[in] State the input data
*
* @retval TRUE use manual List
* @retval FALSE initialize the Link automatically. List not valid.
*/
typedef BOOLEAN F_GET_MANUAL_BUID_SWAP_LIST (
IN UINT8 Node,
IN UINT8 Link,
OUT BUID_SWAP_LIST **List,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_MANUAL_BUID_SWAP_LIST *PF_GET_MANUAL_BUID_SWAP_LIST;
/**
* Override capabilities of a device.
*
* @HtInterfaceInstances.
*
* @param[in] HostNode The Node on which this chain is located
* @param[in] HostLink The Link on the host for this chain
* @param[in] Depth The Depth in the I/O chain from the Host
* @param[in] PciAddress The Device's PCI config address (for callout)
* @param[in] DevVenId The Device's PCI Vendor + Device ID (offset 0x00)
* @param[in] Revision The Device's PCI Revision
* @param[in] Link The Device's Link number (0 or 1)
* @param[in,out] LinkWidthIn modify to change the Link Width In
* @param[in,out] LinkWidthOut modify to change the Link Width Out
* @param[in,out] FreqCap modify to change the Link's frequency capability
* @param[in,out] Clumping modify to change unit id clumping capability
* @param[in] State the input data
*
*/
typedef VOID F_GET_DEVICE_CAP_OVERRIDE (
IN UINT8 HostNode,
IN UINT8 HostLink,
IN UINT8 Depth,
IN PCI_ADDR PciAddress,
IN UINT32 DevVenId,
IN UINT8 Revision,
IN UINT8 Link,
IN OUT UINT8 *LinkWidthIn,
IN OUT UINT8 *LinkWidthOut,
IN OUT UINT32 *FreqCap,
IN OUT UINT32 *Clumping,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_DEVICE_CAP_OVERRIDE *PF_GET_DEVICE_CAP_OVERRIDE;
/**
* Get limits for non-coherent Links.
*
* @HtInterfaceInstances.
*
* @param[in] HostNode The Node on which this Link is located
* @param[in] HostLink The Link about to be initialized
* @param[in] Depth The Depth in the I/O chain from the Host
* @param[in,out] DownstreamLinkWidthLimit modify to change the Link Width In
* @param[in,out] UpstreamLinkWidthLimit modify to change the Link Width Out
* @param[in,out] PcbFreqCap modify to change the Link's frequency capability
* @param[in] State the input data
*/
typedef VOID F_GET_IO_PCB_LIMITS (
IN UINT8 HostNode,
IN UINT8 HostLink,
IN UINT8 Depth,
IN OUT UINT8 *DownstreamLinkWidthLimit,
IN OUT UINT8 *UpstreamLinkWidthLimit,
IN OUT UINT32 *PcbFreqCap,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_IO_PCB_LIMITS *PF_GET_IO_PCB_LIMITS;
/**
* Get the Socket number for a given Node number.
*
* @HtInterfaceInstances.
*
* @param[in] Node Node discovered event data.
* @param[in] State reference to Node to socket map
*
* @return the socket id
*
*/
typedef UINT8 F_GET_SOCKET_FROM_MAP (
IN UINT8 Node,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_SOCKET_FROM_MAP *PF_GET_SOCKET_FROM_MAP;
/**
* Ignore a Link.
*
* @HtInterfaceInstances.
*
* @param[in] Node The Node on which this Link is located
* @param[in] Link The Link about to be initialized
* @param[in] NbList The northbridge default ignore link list
* @param[in] State the input data
*
* @retval MATCHED ignore this Link and skip it
* @retval POWERED_OFF ignore this link and power it off.
* @retval UNMATCHED initialize the Link normally
*/
typedef FINAL_LINK_STATE F_GET_IGNORE_LINK (
IN UINT8 Node,
IN UINT8 Link,
IN IGNORE_LINK *NbIgnoreLinkList,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_GET_IGNORE_LINK *PF_GET_IGNORE_LINK;
/**
* Post Node id and other context info to AP cores via mailbox.
*
* @HtInterfaceInstances.
*
* @param[in] State Our state
*/
typedef VOID F_POST_MAP_TO_AP (
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_POST_MAP_TO_AP *PF_POST_MAP_TO_AP;
/**
* Clean up the map structures after severe event has caused a fall back to 1 node.
*
* @HtInterfaceInstances.
*
* @param[in] State Our state
*/
typedef VOID F_CLEAN_MAPS_AFTER_ERROR (
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_CLEAN_MAPS_AFTER_ERROR *PF_CLEAN_MAPS_AFTER_ERROR;
/**
* Get a new Socket Die to Node Map.
*
* @HtInterfaceInstances.
*
* @param[in,out] State global state
*/
typedef VOID F_NEW_NODE_AND_SOCKET_TABLES (
IN OUT STATE_DATA *State
);
/// Reference to a method.
typedef F_NEW_NODE_AND_SOCKET_TABLES *PF_NEW_NODE_AND_SOCKET_TABLES;
/**
* Fill in the socket's Node id when a processor is discovered in that socket.
*
* @HtInterfaceInstances.
*
* @param[in] Node Node from which a new node was discovered
* @param[in] CurrentNodeModule The current node's module id in it's processor.
* @param[in] PackageLink The package level link from Node to NewNode.
* @param[in] NewNode The new node's id
* @param[in] HardwareSocket If we use the hardware method (preferred), this is the socket of new node.
* @param[in] Module The new node's module id in it's processor.
* @param[in] State our State
*/
typedef VOID F_SET_NODE_TO_SOCKET_MAP (
IN UINT8 Node,
IN UINT8 CurrentNodeModule,
IN UINT8 PackageLink,
IN UINT8 NewNode,
IN UINT8 HardwareSocket,
IN UINT8 Module,
IN STATE_DATA *State
);
/// Reference to a method.
typedef F_SET_NODE_TO_SOCKET_MAP *PF_SET_NODE_TO_SOCKET_MAP;
/**
* Get a new, empty Hop Count Table, to make one for the installed topology.
*
* @HtInterfaceInstances.
*
* @param[in,out] State Keep our buffer handle.
*
*/
typedef VOID F_NEW_HOP_COUNT_TABLE (
IN OUT STATE_DATA *State
);
/// Reference to a method.
typedef F_NEW_HOP_COUNT_TABLE *PF_NEW_HOP_COUNT_TABLE;
/**
* Get the minimum Northbridge frequency for the system.
*
* @HtInterfaceInstances.
*
* Invoke the CPU component power mgt interface.
*
* @param[in] PlatformConfig Platform profile/build option config structure.
* @param[in] StdHeader Config for library and services.
*
* @return Frequency in MHz.
*
*/
typedef UINT32 F_GET_MIN_NB_CORE_FREQ (
IN PLATFORM_CONFIGURATION *PlatformConfig,
IN AMD_CONFIG_PARAMS *StdHeader
);
/// Reference to a Method.
typedef F_GET_MIN_NB_CORE_FREQ *PF_GET_MIN_NB_CORE_FREQ;
/**
* The HT Interface, feature code uses these methods to get interface parameters.
*/
struct _HT_INTERFACE { // See Forward Declaration in HtFeates.h
PF_GET_CPU_2_CPU_PCB_LIMITS GetCpu2CpuPcbLimits; /**< Method: Get link limits for coherent links. */
PF_GET_SKIP_REGANG GetSkipRegang; /**< Method: Skip reganging for coherent links. */
PF_NEW_HOP_COUNT_TABLE NewHopCountTable; /**< Method: Get a new hop count table. */
PF_GET_OVERRIDE_BUS_NUMBERS GetOverrideBusNumbers; /**< Method: Control Bus number assignment. */
PF_GET_MANUAL_BUID_SWAP_LIST GetManualBuidSwapList; /**< Method: Assign device IDs. */
PF_GET_DEVICE_CAP_OVERRIDE GetDeviceCapOverride; /**< Method: Override Device capabilities. */
PF_GET_IO_PCB_LIMITS GetIoPcbLimits; /**< Method: Get link limits for noncoherent links. */
PF_GET_SOCKET_FROM_MAP GetSocketFromMap; /**< Method: Get the Socket for a node id. */
PF_GET_IGNORE_LINK GetIgnoreLink; /**< Method: Ignore a link. */
PF_POST_MAP_TO_AP PostMapToAp; /**< Method: Post Socket and other info to AP cores. */
PF_NEW_NODE_AND_SOCKET_TABLES NewNodeAndSocketTables; /**< Method: Get new socket and node maps. */
PF_CLEAN_MAPS_AFTER_ERROR CleanMapsAfterError; /**< Method: Clean up maps for forced 1P on error fall back. */
PF_SET_NODE_TO_SOCKET_MAP SetNodeToSocketMap; /**< Method: Associate a node id with a socket. */
PF_GET_MIN_NB_CORE_FREQ GetMinNbCoreFreq; /**< Method: Get the minimum northbridge frequency */
} ;
/*----------------------------------------------------------------------------
* Prototypes to Interface from Feature Code
*
*----------------------------------------------------------------------------
*/
/**
* A constructor for the internal Ht Interface.
*
*/
VOID
NewHtInterface (
OUT HT_INTERFACE *HtInterface,
IN AMD_CONFIG_PARAMS *StdHeader
);
#endif /* _HT_INTERFACE_H_ */