/* $NoKeywords:$ */ /** * @file * * AMD CPU Family Translation functions. * * * @xrefitem bom "File Content Label" "Release Content" * @e project: AGESA * @e sub-project: CPU * @e \$Revision$ @e \$Date$ * */ /***************************************************************************** * * Copyright (c) 2008 - 2016, 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. * ***************************************************************************/ #include #ifndef _CPU_FAMILY_TRANSLATION_H_ #define _CPU_FAMILY_TRANSLATION_H_ /** * @page cpuimplfss CPU Family Specific Services Implementation Guide * * CPU Family Specific Services provides access to supported family service functions and data, * in a manner that isolates calling code from knowledge about particular families or which * families are supported in the current build. * * @par Adding a Method to Family Specific Services * * To add a new method to Family Specific Services, follow these steps. * * * @par Implementing a Family Specific Instance of the method. * * To implement an instance of a method for a specific family follow these steps. * * - In appropriate files in the family specific directory, implement the method with the return type * and parameters matching the method typedef. * * - Name the function FnnMethodName(), where nn is the family number. * * - 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 * * * * @CpuServiceMethod{::F_METHOD_NAME}. * * * @endcode * * - To access other family specific services as part of the method implementation, the function * @b must use FamilySpecificServices->OtherMethod(). Do not directly call other family specific * routines, because in the table there may be overrides or this routine may be shared by multiple families. * * - Do @b not call Family translation services from a family specific instance. Use the parameter. * * - Add the instance to the family specific CPU_SPECIFIC_SERVICES instance. * * - If a family does not need an instance of the method use one of the CommonReturns from * CommonReturns.h with the same return type. * * @par Invoking Family Specific Services. * * The following example shows how to invoke a family specific method. * @n @code * CPU_SPECIFIC_SERVICES *FamilyServices; * * GetCpuServicesOfCurrentCore (&FamilyServices, StdHeader); * ASSERT (FamilyServices != NULL); * FamilyServices->MethodName (FamilyServices, StdHeader); * @endcode * */ /*--------------------------------------------------------------------------------------- * M I X E D (Definitions And Macros / Typedefs, Structures, Enums) *--------------------------------------------------------------------------------------- */ /* #include "cpuPostInit.h" */ /* #include "cpuEnvInit.h" */ #include "cpuRegisters.h" #include "cpuServices.h" #include "Table.h" #include "Ids.h" /* #include "Topology.h" */ // Forward declaration needed for multi-structure mutual references. AGESA_FORWARD_DECLARATION (CPU_SPECIFIC_SERVICES); /*--------------------------------------------------------------------------------------- * D E F I N I T I O N S A N D M A C R O S *--------------------------------------------------------------------------------------- */ /*--------------------------------------------------------------------------------------- * T Y P E D E F S, S T R U C T U R E S, E N U M S *--------------------------------------------------------------------------------------- */ /** * Disable the desired P-state. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StateNumber Hardware P-state number. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef AGESA_STATUS F_CPU_DISABLE_PSTATE ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN UINT8 StateNumber, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_DISABLE_PSTATE *PF_CPU_DISABLE_PSTATE; /** * Transition the current core to the desired P-state. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StateNumber Software P-state number. * @param[in] WaitForChange Wait/don't wait for P-state change to complete. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef AGESA_STATUS F_CPU_TRANSITION_PSTATE ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN UINT8 StateNumber, IN BOOLEAN WaitForChange, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_TRANSITION_PSTATE *PF_CPU_TRANSITION_PSTATE; /** * Get the desired P-state's maximum current required in milliamps. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StateNumber The desired hardware P-state number. * @param[out] ProcIddMax The P-state's maximum current. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval TRUE The P-state is enabled, and ProcIddMax is valid. * @retval FALSE The P-state is disabled. * */ typedef BOOLEAN F_CPU_GET_IDD_MAX ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN UINT8 StateNumber, OUT UINT32 *ProcIddMax, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_IDD_MAX *PF_CPU_GET_IDD_MAX; /** * Returns the rate at which the current core's timestamp counter increments in megahertz. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[out] FreqInMHz The rate at which the TSC increments in megahertz. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef AGESA_STATUS F_CPU_GET_TSC_RATE ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, OUT UINT32 *FreqInMHz, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_TSC_RATE *PF_CPU_GET_TSC_RATE; /** * Returns the processor north bridge's clock rate in megahertz. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[out] FreqInMHz The desired node's frequency in megahertz. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval AGESA_SUCCESS FreqInMHz is valid. */ typedef AGESA_STATUS F_CPU_GET_NB_FREQ ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, OUT UINT32 *FreqInMHz, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_NB_FREQ *PF_CPU_GET_NB_FREQ; /** * Returns the node's minimum and maximum northbridge frequency. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] PlatformConfig Platform profile/build option config structure. * @param[in] PciAddress The segment, bus, and device numbers of the CPU in question. * @param[out] MinFreqInMHz The minimum north bridge frequency. * @param[out] MaxFreqInMHz The maximum north bridge frequency. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval AGESA_STATUS Northbridge frequency is valid */ typedef AGESA_STATUS F_CPU_GET_MIN_MAX_NB_FREQ ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN PLATFORM_CONFIGURATION *PlatformConfig, IN PCI_ADDR *PciAddress, OUT UINT32 *MinFreqInMHz, OUT UINT32 *MaxFreqInMHz, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_MIN_MAX_NB_FREQ *PF_CPU_GET_MIN_MAX_NB_FREQ; /** * Returns the processor north bridge's P-state settings. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] PlatformConfig Platform profile/build option config structure. * @param[in] PciAddress The segment, bus, and device numbers of the CPU in question. * @param[in] NbPstate The NB P-state number to check. * @param[out] FreqNumeratorInMHz The desired node's frequency numerator in megahertz. * @param[out] FreqDivisor The desired node's frequency divisor. * @param[out] VoltageInuV The desired node's voltage in microvolts. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval TRUE NbPstate is valid * @retval FALSE NbPstate is disabled or invalid */ typedef BOOLEAN F_CPU_GET_NB_PSTATE_INFO ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN PLATFORM_CONFIGURATION *PlatformConfig, IN PCI_ADDR *PciAddress, IN UINT32 NbPstate, OUT UINT32 *FreqNumeratorInMHz, OUT UINT32 *FreqDivisor, OUT UINT32 *VoltageInuV, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_NB_PSTATE_INFO *PF_CPU_GET_NB_PSTATE_INFO; /** * Returns whether or not the NB frequency initialization sequence is required * to be performed by the BIOS. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] PciAddress The northbridge to query by pci base address. * @param[out] NbVidUpdateAll Do all NbVids need to be updated as well. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef BOOLEAN F_CPU_IS_NBCOF_INIT_NEEDED ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN PCI_ADDR *PciAddress, OUT BOOLEAN *NbVidUpdateAll, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_IS_NBCOF_INIT_NEEDED *PF_CPU_IS_NBCOF_INIT_NEEDED; /** * Get the desired NB P-state's maximum current required in milliamps. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StateNumber The desired hardware P-state number. * @param[out] NbIddMax The NB P-state's maximum current. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval TRUE The NB P-state is enabled, and NbIddMax is valid. * @retval FALSE The NB P-state is disabled. * */ typedef BOOLEAN F_CPU_GET_NB_IDD_MAX ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN UINT8 StateNumber, OUT UINT32 *NbIddMax, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_NB_IDD_MAX *PF_CPU_GET_NB_IDD_MAX; /** * Launches the desired core from the reset vector. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] CoreNumber The desired core's die relative core number. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval TRUE The core was launched successfully. * @retval FALSE The core was previously launched, or has a problem. */ typedef BOOLEAN F_CPU_AP_INITIAL_LAUNCH ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN UINT32 CoreNumber, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_AP_INITIAL_LAUNCH *PF_CPU_AP_INITIAL_LAUNCH; /** * Returns the appropriate number of physical processor cores * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @return One-based number of physical cores on current processor */ typedef UINT8 F_CPU_NUMBER_OF_PHYSICAL_CORES ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_NUMBER_OF_PHYSICAL_CORES *PF_CPU_NUMBER_OF_PHYSICAL_CORES; /** * Get the AP core number from hardware. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @return The AP's unique core number */ typedef UINT32 (F_CPU_GET_AP_CORE_NUMBER) ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a method typedef F_CPU_GET_AP_CORE_NUMBER *PF_CPU_GET_AP_CORE_NUMBER; /** * Core ID position in the initial APIC ID, reflected as a number zero or one. */ typedef enum { CoreIdPositionZero, ///< Zero, the Core Id bits are the Most Significant bits. CoreIdPositionOne, ///< One, the Core Id bits are the Least Significant bits. CoreIdPositionMax ///< Limit check. } CORE_ID_POSITION; /** * Return a number zero or one, based on the Core ID position in the initial APIC Id. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval CoreIdPositionZero Core Id is not low * @retval CoreIdPositionOne Core Id is low */ typedef CORE_ID_POSITION F_CORE_ID_POSITION_IN_INITIAL_APIC_ID ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a method typedef F_CORE_ID_POSITION_IN_INITIAL_APIC_ID *PF_CORE_ID_POSITION_IN_INITIAL_APIC_ID; /** * Set Warm Reset Flag * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StdHeader Header for library and services. * @param[in] Request Value to set the flags to. * */ typedef VOID (F_CPU_SET_WARM_RESET_FLAG) ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN AMD_CONFIG_PARAMS *StdHeader, IN WARM_RESET_REQUEST *Request ); /// Reference to a method typedef F_CPU_SET_WARM_RESET_FLAG *PF_CPU_SET_WARM_RESET_FLAG; /** * Get Warm Reset Flag * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] StdHeader Header for library and services. * @param[out] BiosRstDet Indicate warm reset status. * */ typedef VOID (F_CPU_GET_WARM_RESET_FLAG) ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN AMD_CONFIG_PARAMS *StdHeader, OUT WARM_RESET_REQUEST *Request ); /// Reference to a method typedef F_CPU_GET_WARM_RESET_FLAG *PF_CPU_GET_WARM_RESET_FLAG; /** * Returns a family specific table of information pointer and size. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[out] FamilySpecificArray Pointer to the appropriate list for the core. * @param[out] NumberOfElements Number of valid entries FamilySpecificArray. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef VOID F_CPU_GET_FAMILY_SPECIFIC_ARRAY ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, OUT CONST VOID **FamilySpecificArray, OUT UINT8 *NumberOfElements, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_FAMILY_SPECIFIC_ARRAY *PF_CPU_GET_FAMILY_SPECIFIC_ARRAY; /** * Get CPU Specific Platform Type Info. * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in,out] FeaturesUnion The Features supported by this platform. * @param[in] StdHeader Handle of Header for calling lib functions and services. * */ typedef AGESA_STATUS F_CPU_GET_PLATFORM_TYPE_SPECIFIC_INFO ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN OUT PLATFORM_FEATS *FeaturesUnion, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_CPU_GET_PLATFORM_TYPE_SPECIFIC_INFO *PF_CPU_GET_PLATFORM_TYPE_SPECIFIC_INFO; /** * Is the Northbridge PState feature enabled? * * @CpuServiceInstances * * @param[in] FamilySpecificServices The current Family Specific Services. * @param[in] PlatformConfig Platform profile/build option config structure. * @param[in] StdHeader Handle of Header for calling lib functions and services. * * @retval TRUE The NB PState feature is enabled. * @retval FALSE The NB PState feature is not enabled. */ typedef BOOLEAN F_IS_NB_PSTATE_ENABLED ( IN CPU_SPECIFIC_SERVICES *FamilySpecificServices, IN PLATFORM_CONFIGURATION *PlatformConfig, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a method typedef F_IS_NB_PSTATE_ENABLED *PF_IS_NB_PSTATE_ENABLED; /** * Returns the register tables list * * @CpuServiceInstances * * @param[in] FamilyServices The current Family Specific Services. * @param[in] StdHeader Config handle for library and services * */ typedef REGISTER_TABLE_AT_GIVEN_TP *F_GET_REGISTER_TABLE_LIST ( IN CPU_SPECIFIC_SERVICES *FamilyServices, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_GET_REGISTER_TABLE_LIST *PF_GET_REGISTER_TABLE_LIST; /** * Returns the workaround tables that the executing core should * process at the given point in time. * * @CpuServiceInstances * * @param[in] FamilyServices The current Family Specific Services. * @param[out] NumberOfWorkaroundTableEntries Number of workaround table entries * @param[in] StdHeader Config handle for library and services * */ typedef F_FAM_SPECIFIC_WORKAROUND **F_GET_WORKAROUND_TABLE ( IN CPU_SPECIFIC_SERVICES *FamilyServices, OUT UINT16 *NumberOfWorkaroundTableEntries, IN AMD_CONFIG_PARAMS *StdHeader ); /// Reference to a Method. typedef F_GET_WORKAROUND_TABLE *PF_GET_WORKAROUND_TABLE; /// Cache Enable / Disable policy before giving control back to OS. typedef enum { InitCacheDisabled, ///