aboutsummaryrefslogtreecommitdiff
path: root/src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c')
-rw-r--r--src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c834
1 files changed, 0 insertions, 834 deletions
diff --git a/src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c b/src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c
deleted file mode 100644
index afcea1ddd8..0000000000
--- a/src/vendorcode/amd/agesa/f15/Proc/CPU/Family/0x15/OR/F15OrEarlySamples.c
+++ /dev/null
@@ -1,834 +0,0 @@
-/* $NoKeywords:$ */
-/**
- * @file
- *
- * AMD Family_15 OR early sample support.
- *
- * Provides the code and data required to support pre-production silicon.
- *
- * @xrefitem bom "File Content Label" "Release Content"
- * @e project: AGESA
- * @e sub-project: CPU/Family/0x15/OR
- * @e \$Revision: 56279 $ @e \$Date: 2011-07-11 13:11:28 -0600 (Mon, 11 Jul 2011) $
- *
- */
-/*
- *****************************************************************************
- *
- * Copyright (C) 2012 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.
- *
- ******************************************************************************
- */
-
-/*----------------------------------------------------------------------------------------
- * M O D U L E S U S E D
- *----------------------------------------------------------------------------------------
- */
-#include "AGESA.h"
-#include "amdlib.h"
-#include "Ids.h"
-#include "cpuRegisters.h"
-#include "Table.h"
-#include "cpuEarlyInit.h"
-#include "cpuFamilyTranslation.h"
-#include "F15OrUtilities.h"
-#include "cpuF15Utilities.h"
-#include "cpuF15PowerMgmt.h"
-#include "cpuF15OrPowerMgmt.h"
-#include "GeneralServices.h"
-#include "OptionMultiSocket.h"
-#include "Filecode.h"
-CODE_GROUP (G3_DXE)
-RDATA_GROUP (G3_DXE)
-
-#define FILECODE PROC_CPU_FAMILY_0X15_OR_F15OREARLYSAMPLES_FILECODE
-
-/*----------------------------------------------------------------------------------------
- * D E F I N I T I O N S A N D M A C R O S
- *----------------------------------------------------------------------------------------
- */
-extern OPTION_MULTISOCKET_CONFIGURATION OptionMultiSocketConfiguration;
-/*----------------------------------------------------------------------------------------
- * T Y P E D E F S A N D S T R U C T U R E S
- *----------------------------------------------------------------------------------------
- */
-typedef union {
- UINT64 RawData;
- PATCH_LOADER_MSR BitFields;
-} PATCH_LOADER;
-
-/*----------------------------------------------------------------------------------------
- * P R O T O T Y P E S O F L O C A L F U N C T I O N S
- *----------------------------------------------------------------------------------------
- */
-BOOLEAN
-F15OrEarlySamplesLoadMicrocode (
- IN MICROCODE_PATCH *MicrocodePatchPtr,
- IN OUT AMD_CONFIG_PARAMS *StdHeader
- );
-
-VOID
-F15OrHtcInitEarlySampleHook (
- IN OUT UINT32 *HtcRegister,
- IN AMD_CONFIG_PARAMS *StdHeader
- );
-
-VOID
-F15OrIsCpbDisabledEarlySample (
- IN OUT BOOLEAN *IsEnabled,
- IN AMD_CONFIG_PARAMS *StdHeader
- );
-
-VOID
-F15OrIsC6DisabledEarlySample (
- IN OUT BOOLEAN *IsEnabled,
- IN AMD_CONFIG_PARAMS *StdHeader
- );
-
-VOID
-F15OrEarlySamplesAvoidNbCyclesStart (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN OUT UINT64 *SavedMsrValue
- );
-
-VOID
-F15OrEarlySamplesAvoidNbCyclesEnd (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN UINT64 *SavedMsrValue
- );
-
-VOID
-F15OrEarlySamplesAfterPatchLoaded (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN BOOLEAN IsPatchLoaded
- );
-
-BOOLEAN
-F15OrEarlySamplesLoadMicrocodePatch (
- IN OUT AMD_CONFIG_PARAMS *StdHeader
- );
-
-
-
-
-/*----------------------------------------------------------------------------------------
- * E X P O R T E D F U N C T I O N S
- *----------------------------------------------------------------------------------------
- */
-
-VOID
-F15OrB0WeightsInit (
- IN UINT32 Data,
- IN AMD_CONFIG_PARAMS *StdHeader
- );
-
-/*----------------------------------------------------------------------------------------
- * D A T A D E C L A R A T I O N S
- *----------------------------------------------------------------------------------------
- */
-
-/*-----------------------------
- * Early Sample PCI registers
- *-----------------------------
- */
-
-STATIC CONST TABLE_ENTRY_FIELDS ROMDATA F15OrEarlySamplePciRegisters[] =
-{
-// F3x188 - NB Configuration 2 Register
-// bit[30] Reserved = 1 Erratum #620, only on OR A0, A1 and B0
- {
- PciRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_LT_B1 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MAKE_SBDFO (0, 0, 24, FUNC_3, 0x188), // Address
- 0x40000000, // regData
- 0x40000000, // regMask
- }}
- },
-// F3x18C - Reserved
-// bit[31] Reserved = 1 Erratum #603, only on OR A0, A1 and B0
- {
- PciRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_LT_B1 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MAKE_SBDFO (0, 0, 24, FUNC_3, 0x18C), // Address
- 0x80000000, // regData
- 0x80000000, // regMask
- }}
- },
-
-// F3x1B8 - L3 Control 1
-// bit[7] Reserved = 1, Erratum #574
-// bit[29] Reserved = 1, Erratum #574
- {
- ProfileFixup,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_Ax // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- PERFORMANCE_L3_CACHE, // Features
- MAKE_SBDFO (0, 0, 24, FUNC_3, 0x1B8), // Address
- 0x20000080, // regData
- 0x20000080, // regMask
- }}
- },
-// F4x110 - Sample and Residency Timers
-// bits[20:13] MinResTmr = 0x64
- {
- PciRegister,
- {
- AMD_FAMILY_15_OR, // CpuFamily
- AMD_F15_OR_Ax // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MAKE_SBDFO (0, 0, 24, FUNC_4, 0x110), // Address
- 0x000C8000, // regData
- 0x001FE000, // regMask
- }}
- },
-// F4x1A0 - Reserved
-// bits[31:0] Reserved = 4
- {
- ProfileFixup,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_A0 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- PERFORMANCE_L3_CACHE, // Features
- MAKE_SBDFO (0, 0, 24, FUNC_4, 0x1A0), // Address
- 0x00000004, // regData
- 0xFFFFFFFF, // regMask
- }}
- },
-// F4x1A4 - Reserved
-// bits[31:0] Reserved = 0x24 Erratum #553
- {
- ProfileFixup,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_A0 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- PERFORMANCE_L3_CACHE, // Features
- MAKE_SBDFO (0, 0, 24, FUNC_4, 0x1A4), // Address
- 0x00000024, // regData
- 0xFFFFFFFF, // regMask
- }}
- },
-};
-
-CONST REGISTER_TABLE ROMDATA F15OrEarlySamplePciRegisterTable = {
- PrimaryCores,
- (sizeof (F15OrEarlySamplePciRegisters) / sizeof (TABLE_ENTRY_FIELDS)),
- F15OrEarlySamplePciRegisters,
-};
-
-/*-----------------------------
- * Early Sample MSR registers
- *-----------------------------
- */
-
-STATIC CONST MSR_TYPE_ENTRY_INITIALIZER ROMDATA F15OrEarlySampleMsrRegisters[] =
-{
-// MSR_LS_CFG (0xC0011020)
-// bit[0] = 1, Erratum #500 for OR-A0 only
-// bit[4] = 1, Erratum #501 for OR-A0 only
-// bit[28] DisSS = 1, Erratum #495, #496 for OR-A0 only
-// bit[30] = 1, Erratum #544 for OR-A0 only
-// bit[62] = 1, Erratum #494 for OR-A0 only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_A0 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_LS_CFG, // MSR Address
- 0x4000000050000011, // OR Mask
- 0x4000000050000011, // NAND Mask
- }}
- },
-// MSR_DC_CFG (0xC0011022)
-// bit[13] DisHwPf = 1, Erratum #498, OR-A0 only
-// bit[10] = 1, Erratum #575, OR-A0 only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_A0 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_DC_CFG, // MSR Address
- 0x0000000000002400, // OR Mask
- 0x0000000000002400, // NAND Mask
- }}
- },
-// MSR_DE_CFG (0xC0011029)
-// bit[7:2] = 111111b, Erratum #497, OR-A0 only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_A0 // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_DE_CFG, // MSR Address - Shared
- 0x00000000000000FC, // OR Mask
- 0x00000000000000FC, // NAND Mask
- }}
- },
-};
-
-CONST REGISTER_TABLE ROMDATA F15OrEarlySampleMsrRegisterTable = {
- AllCores,
- (sizeof (F15OrEarlySampleMsrRegisters) / sizeof (TABLE_ENTRY_FIELDS)),
- (TABLE_ENTRY_FIELDS *) &F15OrEarlySampleMsrRegisters,
-};
-
-/*-----------------------------
- * Early Sample Shared MSR registers
- *-----------------------------
- */
-
-STATIC CONST MSR_TYPE_ENTRY_INITIALIZER ROMDATA F15OrEarlySampleSharedMsrRegisters[] =
-{
-// MSR_CU_CFG2 (0xC001102A)
-// bit[27] = 1, Erratum #572, OR-Ax only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_Ax // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_CU_CFG2, // MSR Address - Shared
- 0x0000000008000000, // OR Mask
- 0x0000000008000000, // NAND Mask
- }}
- },
-
-// MSR_CU_CFG3 (0xC001102B)
-// bit[34] Reserved = 1, Erratum #568, OR-Ax only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_Ax // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_CU_CFG3, // MSR Address
- 0x0000000400000000, // OR Mask
- 0x0000000400000000, // NAND Mask
- }}
- },
-// MSR_C001_1070
-// bit[41] = 0, Erratum #597, OR-Ax only
- {
- MsrRegister,
- {
- AMD_FAMILY_15, // CpuFamily
- AMD_F15_OR_Ax // CpuRevision
- },
- {AMD_PF_ALL}, // platformFeatures
- {{
- MSR_C001_1070, // MSR Address - Shared
- 0x0000000000000000, // OR Mask
- 0x0000020000000000, // NAND Mask
- }}
- },
-};
-
-CONST REGISTER_TABLE ROMDATA F15OrEarlySampleSharedMsrRegisterTable = {
- CorePairPrimary,
- (sizeof (F15OrEarlySampleSharedMsrRegisters) / sizeof (TABLE_ENTRY_FIELDS)),
- (TABLE_ENTRY_FIELDS *) &F15OrEarlySampleSharedMsrRegisters,
-};
-
-/*-----------------------------
- * Early Sample Workarounds
- *-----------------------------
- */
-
-STATIC CONST FAM_SPECIFIC_WORKAROUND_TYPE_ENTRY_INITIALIZER ROMDATA F15OrEarlySampleWorkarounds[] =
-{
- // HT PHY DLL Compensation setting for Ax
- {
- FamSpecificWorkaround,
- {
- AMD_FAMILY_15,
- AMD_F15_OR_Ax
- },
- {AMD_PF_ALL},
- {{
- F15HtPhyOverrideDllCompensation,
- 0x00000000
- }}
- },
- // CPU TDP Limit 2 setting for Ax
- {
- FamSpecificWorkaround,
- {
- AMD_FAMILY_15,
- AMD_F15_OR_Ax
- },
- {AMD_PF_ALL},
- {{
- F15OrOverrideNodeTdpLimit,
- 0x00000000
- }}
- },
- // CPU Node TDP Accumulator Throttle Threshold setting for Ax
- {
- FamSpecificWorkaround,
- {
- AMD_FAMILY_15_OR,
- AMD_F15_OR_Ax
- },
- {AMD_PF_ALL},
- {{
- F15OrOverrideNodeTdpAccumulatorThrottleThreshold,
- 0x00000000
- }}
- },
-};
-
-CONST REGISTER_TABLE ROMDATA F15OrEarlySampleWorkaroundsTable = {
- PrimaryCores,
- (sizeof (F15OrEarlySampleWorkarounds) / sizeof (TABLE_ENTRY_FIELDS)),
- (TABLE_ENTRY_FIELDS *)F15OrEarlySampleWorkarounds,
-};
-
-/*-----------------------------
- * Early Sample shared MSRs with Special Programming Requirements Table
- *-----------------------------
- */
-
-STATIC CONST FAM_SPECIFIC_WORKAROUND_TYPE_ENTRY_INITIALIZER ROMDATA F15OrEarlySampleSharedMsrWorkarounds[] =
-{
- // MSRC001_1072
- {
- FamSpecificWorkaround,
- {
- AMD_FAMILY_15_OR,
- AMD_F15_OR_B0
- },
- {AMD_PF_ALL},
- {{
- F15OrB0WeightsInit,
- 0x00000000
- }}
- }
-};
-
-CONST REGISTER_TABLE ROMDATA F15OrEarlySampleSharedMsrWorkaroundTable = {
- CorePairPrimary,
- (sizeof (F15OrEarlySampleSharedMsrWorkarounds) / sizeof (TABLE_ENTRY_FIELDS)),
- (TABLE_ENTRY_FIELDS *) &F15OrEarlySampleSharedMsrWorkarounds,
-};
-
-
-CONST UINT32 ROMDATA F15OrB0WeightsTable [] = {
- 0x1300005A, //MSRC001_1072_x00
- 0x10ABD100, //MSRC001_1072_x01
- 0xBF1A1A44, //MSRC001_1072_x02
- 0xC4DABEA4, //MSRC001_1072_x03
- 0x147B7B6A, //MSRC001_1072_x04
- 0x320C0C00, //MSRC001_1072_x05
- 0xE6D6C6DC, //MSRC001_1072_x06
- 0x00911C06, //MSRC001_1072_x07
- 0x1F473727, //MSRC001_1072_x08
- 0x9FA3A32B, //MSRC001_1072_x09
- 0xDFCFBFAF, //MSRC001_1072_x0A
- 0xCFBFAF9F, //MSRC001_1072_x0B
- 0x606060DF, //MSRC001_1072_x0C
- 0x00000060, //MSRC001_1072_x0D
- 0xBAAA9A00, //MSRC001_1072_x0E
- 0xFF00DACA, //MSRC001_1072_x0F
- 0xFEFEFF64, //MSRC001_1072_x10
- 0x41FCFEFE, //MSRC001_1072_x11
- 0xE14C2F0D, //MSRC001_1072_x12
- 0x95A371EA, //MSRC001_1072_x13
- 0x002EE260, //MSRC001_1072_x14
- 0x00F907D2, //MSRC001_1072_x15
- 0xF9F2A5A5, //MSRC001_1072_x16
- 0x97C100E3, //MSRC001_1072_x17
- 0x91C5B577, //MSRC001_1072_x18
- 0x95C1B1A1, //MSRC001_1072_x19
- 0x68584800, //MSRC001_1072_x1A
- 0x67000000, //MSRC001_1072_x1B
- 0xB2003109, //MSRC001_1072_x1C
- 0x3F8DCDC4, //MSRC001_1072_x1D
- 0xD2D4D409, //MSRC001_1072_x1E
- 0x090000D2, //MSRC001_1072_x1F
- 0x00160000, //MSRC001_1072_x20
- 0x0000E300 //MSRC001_1072_x21
-};
-
-
-/*---------------------------------------------------------------------------------------*/
-/**
- * Early sample hook point during HTC initialization
- *
- * @param[in,out] HtcRegister Value of F3x64 to be written.
- * @param[in] StdHeader Handle of Header for calling lib functions and services.
- *
- */
-VOID
-F15OrHtcInitEarlySampleHook (
- IN OUT UINT32 *HtcRegister,
- IN AMD_CONFIG_PARAMS *StdHeader
- )
-{
- UINT32 MsrAddr;
- UINT64 Msr;
-
- if (((HTC_REGISTER *) HtcRegister)->HtcPstateLimit == 0) {
- // HtcPstateLimit is set to Pb0. Reprogram it to the minimum enabled P-state with
- // with NbPstate = 0
- for (MsrAddr = PS_MAX_REG; MsrAddr > PS_MIN_REG; MsrAddr--) {
- LibAmdMsrRead (MsrAddr, &Msr, StdHeader);
- if ((((PSTATE_MSR *) &Msr)->PsEnable == 1) && (((PSTATE_MSR *) &Msr)->NbPstate == 0)) {
- break;
- }
- }
- ((HTC_REGISTER *) HtcRegister)->HtcPstateLimit = (MsrAddr - PS_MIN_REG);
- }
-}
-
-/*---------------------------------------------------------------------------------------*/
-/**
- * Is CPB supported on this CPU
- *
- * @param[in,out] IsEnabled Whether or not CPB should be enabled.
- * @param[in] StdHeader Config Handle for library, services.
- *
- */
-VOID
-F15OrIsCpbDisabledEarlySample (
- IN OUT BOOLEAN *IsEnabled,
- IN AMD_CONFIG_PARAMS *StdHeader
- )
-{
- CPU_LOGICAL_ID LogicalId;
-
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
- // Check if this CPU is OR A0, then disable CPB support.
- if ((LogicalId.Revision & AMD_F15_OR_A0) != 0) {
- *IsEnabled = FALSE;
- }
-}
-
-/*---------------------------------------------------------------------------------------*/
-/**
- * Is C6 supported on this CPU
- *
- * @param[in,out] IsEnabled Whether or not C6 should be enabled.
- * @param[in] StdHeader Config Handle for library, services.
- *
- */
-VOID
-F15OrIsC6DisabledEarlySample (
- IN OUT BOOLEAN *IsEnabled,
- IN AMD_CONFIG_PARAMS *StdHeader
- )
-{
- CPU_LOGICAL_ID LogicalId;
-
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
- // Check if this CPU is OR A0, then disable C6 support.
- if ((LogicalId.Revision & AMD_F15_OR_A0) != 0) {
- *IsEnabled = FALSE;
- }
-}
-
-/*---------------------------------------------------------------------------------------*/
-/**
- * Update the weights for affected OR B0 CPUs.
- *
- * This function implements a workaround for OR B0 when applicable.
- *
- * @param[in] Data The table data value, for example to indicate which CPU and Platform types matched.
- * @param[in] StdHeader Config handle for library and services.
- *
- */
-VOID
-F15OrB0WeightsInit (
- IN UINT32 Data,
- IN AMD_CONFIG_PARAMS *StdHeader
- )
-{
- UINT32 i;
- UINT32 ProductInfo;
- UINT64 LocalMsr;
- PCI_ADDR PciAddress;
-
- if (IsWarmReset (StdHeader)) {
- OptionMultiSocketConfiguration.GetCurrPciAddr (&PciAddress, StdHeader);
- PciAddress.Address.Function = FUNC_3;
- PciAddress.Address.Register = PRCT_INFO_REG;
- LibAmdPciRead (AccessWidth32, PciAddress, &ProductInfo, StdHeader);
-
- if ((ProductInfo & BIT31) == 0) {
- for (i = 0; i < ((sizeof F15OrB0WeightsTable) / (sizeof F15OrB0WeightsTable[0])); i++) {
- LocalMsr = (((((UINT64) F15OrB0WeightsTable[i]) << 32) | i) | BIT14);
- LibAmdMsrWrite (0xC0011072, &LocalMsr, StdHeader);
- }
- }
- }
-}
-
-/* -----------------------------------------------------------------------------*/
-/**
- * Workaround to avoid patch loading from causing NB cycles
- *
- *
- * @param[in,out] StdHeader - Config handle for library and services.
- * @param[in,out] SavedMsrValue - Saved a MSR value
- *
- */
-VOID
-F15OrEarlySamplesAvoidNbCyclesStart (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN OUT UINT64 *SavedMsrValue
- )
-{
- UINT64 MsrValue;
- CPU_LOGICAL_ID LogicalId;
-
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
- // Check if this CPU is OR Ax, expected fix in OR-B0
- if ((LogicalId.Revision & AMD_F15_OR_Ax) != 0) {
- // Workaround for F15 OR-Ax workaround to avoid patch loading from causing NB cycles
- // Start - Set MSR C001_102A [8]
- LibAmdMsrRead (MSR_BU_CFG2, SavedMsrValue, StdHeader);
- MsrValue = *SavedMsrValue | BIT8;
- LibAmdMsrWrite (MSR_BU_CFG2, &MsrValue, StdHeader);
- }
-}
-
-/* -----------------------------------------------------------------------------*/
-/**
- * Workaround to avoid patch loading from causing NB cycles
- *
- *
- * @param[in,out] StdHeader - Config handle for library and services.
- * @param[in] SavedMsrValue - Saved a MSR value
- *
- */
-VOID
-F15OrEarlySamplesAvoidNbCyclesEnd (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN UINT64 *SavedMsrValue
- )
-{
- CPU_LOGICAL_ID LogicalId;
-
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
- if ((LogicalId.Revision & AMD_F15_OR_Ax) != 0) {
- // Restore Workaround for F15 OR-Ax workaround to avoid patch loading from causing NB cycles
- // End - Restore MSR C001_102A
- LibAmdMsrWrite (MSR_BU_CFG2, SavedMsrValue, StdHeader);
- }
-
-}
-
-/* -----------------------------------------------------------------------------*/
-/**
- * Workaround for Ax processors after patch is loaded.
- *
- *
- * @param[in] StdHeader - Config handle for library and services.
- * @param[in] IsPatchLoaded - Is patch loaded
- *
- */
-VOID
-F15OrEarlySamplesAfterPatchLoaded (
- IN OUT AMD_CONFIG_PARAMS *StdHeader,
- IN BOOLEAN IsPatchLoaded
- )
-{
- UINT64 MsrValue;
- CPU_LOGICAL_ID LogicalId;
-
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
-
- // MSR C001_1023[4:3] = 11b
- // Erratum #502, OR-A0 only after microcode patch has been loaded
- if (((LogicalId.Revision & AMD_F15_OR_A0) != 0) && (IsPatchLoaded)) {
- LibAmdMsrRead (MSR_CU_CFG, &MsrValue, StdHeader);
- MsrValue |= 0x18;
- LibAmdMsrWrite (MSR_CU_CFG, &MsrValue, StdHeader);
- }
-
- // Erratum #590, OR-A1 only, if any patch is applied
- // MSR C001_0028 = 0x2E00_0080
- // MSR C001_0029 = 0xFE00_0080
- // MSR C001_002C = 0x0400_1029
- if (((LogicalId.Revision & AMD_F15_OR_A1) != 0) && (IsPatchLoaded)) {
- MsrValue = 0x2E000080;
- LibAmdMsrWrite (0xC0010028, &MsrValue, StdHeader);
-
- MsrValue = 0xFE000080;
- LibAmdMsrWrite (0xC0010029, &MsrValue, StdHeader);
-
- MsrValue = 0x04001029;
- LibAmdMsrWrite (0xC001002C, &MsrValue, StdHeader);
- }
-}
-
-/* -----------------------------------------------------------------------------*/
-/**
- * Update microcode patch in current processor.
- *
- * Then reads the patch id, and compare it to the expected, in the Microprocessor
- * patch block.
- *
- * @param[in] StdHeader - Config handle for library and services.
- *
- * @retval TRUE - Patch Loaded Successfully.
- * @retval FALSE - Patch Did Not Get Loaded.
- *
- */
-BOOLEAN
-F15OrEarlySamplesLoadMicrocodePatch (
- IN OUT AMD_CONFIG_PARAMS *StdHeader
- )
-{
- UINT8 PatchNumber;
- UINT8 TotalPatches;
- UINT16 ProcessorEquivalentId;
- BOOLEAN Status;
- MICROCODE_PATCH **MicrocodePatchPtr;
- CPU_SPECIFIC_SERVICES *FamilySpecificServices;
-
- Status = FALSE;
-
- if (IsCorePairPrimary (FirstCoreIsComputeUnitPrimary, StdHeader)) {
- // Get the patch pointer
- GetCpuServicesOfCurrentCore ((CONST CPU_SPECIFIC_SERVICES **)&FamilySpecificServices, StdHeader);
- FamilySpecificServices->GetMicroCodePatchesStruct (FamilySpecificServices, (const VOID **) &MicrocodePatchPtr, &TotalPatches, StdHeader);
-
- IDS_OPTION_HOOK (IDS_UCODE, &TotalPatches, StdHeader);
-
- // Get the processor microcode path equivalent ID
- if (GetPatchEquivalentId (&ProcessorEquivalentId, StdHeader)) {
- // parse the patch table to see if we have one for the current cpu
- for (PatchNumber = 0; PatchNumber < TotalPatches; PatchNumber++) {
- if (ValidateMicrocode (MicrocodePatchPtr[PatchNumber], ProcessorEquivalentId, StdHeader)) {
- if (F15OrEarlySamplesLoadMicrocode (MicrocodePatchPtr[PatchNumber], StdHeader)) {
- Status = TRUE;
- } else {
- PutEventLog (AGESA_ERROR,
- CPU_ERROR_MICRO_CODE_PATCH_IS_NOT_LOADED,
- 0, 0, 0, 0, StdHeader);
- }
- break; // Once we find a microcode patch that matches the processor, exit the for loop
- }
- }
- }
- }
- return Status;
-}
-
-/* -----------------------------------------------------------------------------*/
-/**
- *
- * F15OrEarlySamplesLoadMicrocode
- *
- * Update microcode patch in current processor, then reads the
- * patch id, and compare it to the expected, in the Microprocessor
- * patch block.
- *
- * Note: This is a special version of the normal LoadMicrocode()
- * function which lives in cpuMicrocodePatch.c. This version
- * implements a workaround (on Or-B0 only) before applying the
- * microcode patch.
- *
- * @param[in] MicrocodePatchPtr - Pointer to Microcode Patch.
- * @param[in,out] StdHeader - Pointer to AMD_CONFIG_PARAMS struct.
- *
- * @retval TRUE - Patch Loaded Successfully.
- * @retval FALSE - Patch Did Not Get Loaded.
- *
- */
-BOOLEAN
-F15OrEarlySamplesLoadMicrocode (
- IN MICROCODE_PATCH *MicrocodePatchPtr,
- IN OUT AMD_CONFIG_PARAMS *StdHeader
- )
-{
- UINT32 MicrocodeVersion;
- UINT64 MsrData;
- PATCH_LOADER PatchLoaderMsr;
- CPU_LOGICAL_ID LogicalId;
-
- // Load microcode patch into CPU
- GetLogicalIdOfCurrentCore (&LogicalId, StdHeader);
- PatchLoaderMsr.RawData = (UINT64)(intptr_t) MicrocodePatchPtr;
- PatchLoaderMsr.BitFields.SBZ = 0;
- // Check if this CPU is OR-B0, expected fix in OR-B1
- if ((LogicalId.Revision & AMD_F15_OR_B0) != 0) {
- LibAmdMsrRead (MSR_BR_FROM, &MsrData, StdHeader);
- }
-
- LibAmdMsrWrite (MSR_PATCH_LOADER, &PatchLoaderMsr.RawData, StdHeader);
-
- // Do ucode patch Authentication
- // Read microcode version back from CPU, determine if
- // it is the same patch level as contained in the source
- // microprocessor patch block passed in
- GetMicrocodeVersion (&MicrocodeVersion, StdHeader);
- if (MicrocodeVersion == MicrocodePatchPtr->PatchID) {
- return (TRUE);
- } else {
- return (FALSE);
- }
-}
-
-/*---------------------------------------------------------------------------------------
- * L O C A L F U N C T I O N S
- *---------------------------------------------------------------------------------------
- */
-