blob: 40d186492b4974a24d79ab37fdf6fb4be7ff03a5 [file] [log] [blame]
/* $NoKeywords:$ */
/**
* @file
*
* NB power management features
*
*
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: GNB
* @e \$Revision: 48978 $ @e \$Date: 2011-03-15 13:53:53 +0800 (Tue, 15 Mar 2011) $
*
*/
/*
*****************************************************************************
*
* 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.
* ***************************************************************************
*
*/
/*----------------------------------------------------------------------------------------
* M O D U L E S U S E D
*----------------------------------------------------------------------------------------
*/
#include "AGESA.h"
#include "amdlib.h"
#include "Ids.h"
#include "Gnb.h"
#include "GnbFuseTable.h"
#include "GnbGfx.h"
#include "GnbPcie.h"
#include "GnbCommonLib.h"
#include "GnbGfxInitLibV1.h"
#include "NbConfigData.h"
#include "NbSmuLib.h"
#include "NbFamilyServices.h"
#include "NbPowerMgmt.h"
#include "OptionGnb.h"
#include "GfxLib.h"
#include "GnbRegistersLN.h"
#include "Filecode.h"
#define FILECODE PROC_GNB_NB_NBPOWERMGMT_FILECODE
/*----------------------------------------------------------------------------------------
* D E F I N I T I O N S A N D M A C R O S
*----------------------------------------------------------------------------------------
*/
extern GNB_BUILD_OPTIONS GnbBuildOptions;
/*----------------------------------------------------------------------------------------
* T Y P E D E F S A N D S T R U C T U R E S
*----------------------------------------------------------------------------------------
*/
/*----------------------------------------------------------------------------------------
* 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
*----------------------------------------------------------------------------------------
*/
VOID
NbInitLclkDeepSleep (
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitClockGating (
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitSmuClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitOrbClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitIocClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitBifClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitGmcClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitDceSclkClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
VOID
NbInitDceDisplayClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
);
/*----------------------------------------------------------------------------------------*/
/**
* Init various power management features
*
*
*
* @param[in] Gnb Pointer to global Gnb configuration
* @retval AGESA_SUCCESS LCLK DPM initialization success
* @retval AGESA_ERROR LCLK DPM initialization error
*/
AGESA_STATUS
NbInitPowerManagement (
IN GNB_PLATFORM_CONFIG *Gnb
)
{
AGESA_STATUS Status;
Status = AGESA_SUCCESS;
NbInitLclkDeepSleep (Gnb);
NbInitClockGating (Gnb);
return Status;
}
/*----------------------------------------------------------------------------------------*/
/**
* Init NB LCLK Deep Sleep
*
*
*
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitLclkDeepSleep (
IN GNB_PLATFORM_CONFIG *Gnb
)
{
SMUx1B_STRUCT SMUx1B;
SMUx1D_STRUCT SMUx1D;
UINT32 LclkDpSlpEn;
IDS_HDT_CONSOLE (GNB_TRACE, "NbInitLclkDeepSleep Enter\n");
LclkDpSlpEn = GnbBuildOptions.LclkDeepSleepEn ? 1 : 0;
NbSmuIndirectRead (SMUx1B_ADDRESS, AccessWidth16, &SMUx1B.Value, Gnb->StdHeader);
NbSmuIndirectRead (SMUx1D_ADDRESS, AccessWidth16, &SMUx1D.Value, Gnb->StdHeader);
SMUx1B.Field.LclkDpSlpDiv = 5;
SMUx1B.Field.LclkDpSlpMask = (GfxLibIsControllerPresent (Gnb->StdHeader) ? (0xFF) : 0xEF);
SMUx1B.Field.RampDis = 0;
SMUx1D.Field.LclkDpSlpHyst = 0xf;
SMUx1D.Field.LclkDpSlpEn = LclkDpSlpEn;
IDS_HDT_CONSOLE (GNB_TRACE, " LCLK Deep Sleep [%s]\n", (LclkDpSlpEn != 0) ? "Enabled" : "Disabled");
NbSmuIndirectWrite (SMUx1B_ADDRESS, AccessS3SaveWidth16, &SMUx1B.Value, Gnb->StdHeader);
NbSmuIndirectWrite (SMUx1D_ADDRESS, AccessS3SaveWidth16, &SMUx1D.Value, Gnb->StdHeader);
IDS_HDT_CONSOLE (GNB_TRACE, "NbInitLclkDeepSleep Exit\n");
}
/**
* Init NB SMU clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitSmuClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Smu_Lclk_Gating;
BOOLEAN Smu_Sclk_Gating;
SMUx73_STRUCT SMUx73;
UINT32 Value;
Smu_Lclk_Gating = NbClkGatingCtrl->Smu_Lclk_Gating;
Smu_Sclk_Gating = NbClkGatingCtrl->Smu_Sclk_Gating;
//SMUx6F
Value = 0x006001F0;
NbSmuIndirectWrite (SMUx6F_ADDRESS, AccessS3SaveWidth32, &Value, Gnb->StdHeader);
//SMUx71
Value = 0x007001F0;
NbSmuIndirectWrite (SMUx71_ADDRESS, AccessS3SaveWidth32, &Value, Gnb->StdHeader);
//SMUx73
NbSmuIndirectRead (SMUx73_ADDRESS, AccessWidth16, &SMUx73.Value, Gnb->StdHeader);
SMUx73.Field.DisLclkGating = Smu_Lclk_Gating ? 0 : 1;
SMUx73.Field.DisSclkGating = Smu_Sclk_Gating ? 0 : 1;
NbSmuIndirectWrite (SMUx73_ADDRESS, AccessS3SaveWidth16, &SMUx73.Value, Gnb->StdHeader);
}
/**
* Init NB ORB clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitOrbClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Orb_Sclk_Gating;
BOOLEAN Orb_Lclk_Gating;
D0F0x98_x49_STRUCT D0F0x98_x49;
D0F0x98_x4A_STRUCT D0F0x98_x4A;
D0F0x98_x4B_STRUCT D0F0x98_x4B;
FCRxFF30_01F5_STRUCT FCRxFF30_01F5;
Orb_Sclk_Gating = NbClkGatingCtrl->Orb_Sclk_Gating;
Orb_Lclk_Gating = NbClkGatingCtrl->Orb_Lclk_Gating;
// ORB clock gating (Lclk)
//D0F0x98_x4[A:9]
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x49_ADDRESS,
AccessWidth32,
&D0F0x98_x49.Value,
Gnb->StdHeader
);
D0F0x98_x49.Field.SoftOverrideClk6 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk5 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk4 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk3 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk2 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk1 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x49.Field.SoftOverrideClk0 = Orb_Lclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x49_ADDRESS | (1 << D0F0x94_OrbIndWrEn_OFFSET),
AccessS3SaveWidth32,
&D0F0x98_x49.Value,
Gnb->StdHeader
);
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x4A_ADDRESS | (1 << D0F0x94_OrbIndWrEn_OFFSET),
AccessWidth32,
&D0F0x98_x4A.Value,
Gnb->StdHeader
);
D0F0x98_x4A.Field.SoftOverrideClk6 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk5 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk4 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk3 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk2 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk1 = Orb_Lclk_Gating ? 0 : 1;
D0F0x98_x4A.Field.SoftOverrideClk0 = Orb_Lclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x4A_ADDRESS | (1 << D0F0x94_OrbIndWrEn_OFFSET),
AccessS3SaveWidth32,
&D0F0x98_x4A.Value,
Gnb->StdHeader
);
//D0F0x98_x4B
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x4B_ADDRESS | (1 << D0F0x94_OrbIndWrEn_OFFSET),
AccessWidth32,
&D0F0x98_x4B.Value,
Gnb->StdHeader
);
D0F0x98_x4B.Field.SoftOverrideClk = Orb_Sclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x94_ADDRESS,
D0F0x98_x4B_ADDRESS | (1 << D0F0x94_OrbIndWrEn_OFFSET),
AccessS3SaveWidth32,
&D0F0x98_x4B.Value,
Gnb->StdHeader
);
//FCRxFF30_01F5[CgOrbCgttLclkOverride, CgOrbCgttSclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, Gnb->StdHeader);
FCRxFF30_01F5.Field.CgOrbCgttLclkOverride = 0;
FCRxFF30_01F5.Field.CgOrbCgttSclkOverride = 0;
NbSmuSrbmRegisterWrite (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, TRUE, Gnb->StdHeader);
}
/**
* Init NB IOC clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitIocClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Ioc_Lclk_Gating;
BOOLEAN Ioc_Sclk_Gating;
D0F0x64_x22_STRUCT D0F0x64_x22;
D0F0x64_x23_STRUCT D0F0x64_x23;
D0F0x64_x24_STRUCT D0F0x64_x24;
FCRxFF30_01F5_STRUCT FCRxFF30_01F5;
Ioc_Lclk_Gating = NbClkGatingCtrl->Ioc_Lclk_Gating;
Ioc_Sclk_Gating = NbClkGatingCtrl->Ioc_Sclk_Gating;
//D0F0x64_x22
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x22_ADDRESS | IOC_WRITE_ENABLE,
AccessWidth32,
&D0F0x64_x22.Value,
Gnb->StdHeader
);
D0F0x64_x22.Field.SoftOverrideClk4 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x22.Field.SoftOverrideClk3 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x22.Field.SoftOverrideClk2 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x22.Field.SoftOverrideClk1 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x22.Field.SoftOverrideClk0 = Ioc_Lclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x22_ADDRESS | IOC_WRITE_ENABLE,
AccessS3SaveWidth32,
&D0F0x64_x22.Value,
Gnb->StdHeader
);
//D0F0x64_x23
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x23_ADDRESS | IOC_WRITE_ENABLE,
AccessWidth32,
&D0F0x64_x23.Value,
Gnb->StdHeader
);
D0F0x64_x23.Field.SoftOverrideClk4 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x23.Field.SoftOverrideClk3 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x23.Field.SoftOverrideClk2 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x23.Field.SoftOverrideClk1 = Ioc_Lclk_Gating ? 0 : 1;
D0F0x64_x23.Field.SoftOverrideClk0 = Ioc_Lclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x23_ADDRESS | IOC_WRITE_ENABLE,
AccessS3SaveWidth32,
&D0F0x64_x23.Value,
Gnb->StdHeader
);
//D0F0x64_x24
GnbLibPciIndirectRead (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x24_ADDRESS | IOC_WRITE_ENABLE,
AccessWidth32,
&D0F0x64_x24.Value,
Gnb->StdHeader
);
D0F0x64_x24.Field.SoftOverrideClk1 = Ioc_Sclk_Gating ? 0 : 1;
D0F0x64_x24.Field.SoftOverrideClk0 = Ioc_Sclk_Gating ? 0 : 1;
GnbLibPciIndirectWrite (
Gnb->GnbPciAddress.AddressValue | D0F0x60_ADDRESS,
D0F0x64_x24_ADDRESS | IOC_WRITE_ENABLE,
AccessS3SaveWidth32,
&D0F0x64_x24.Value,
Gnb->StdHeader
);
//FCRxFF30_01F5[CgIocCgttLclkOverride, CgIocCgttSclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, Gnb->StdHeader);
FCRxFF30_01F5.Field.CgIocCgttLclkOverride = 0;
FCRxFF30_01F5.Field.CgIocCgttSclkOverride = 0;
NbSmuSrbmRegisterWrite (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, TRUE, Gnb->StdHeader);
}
/**
* Init NB BIF clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitBifClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Bif_Sclk_Gating;
FCRxFF30_01F4_STRUCT FCRxFF30_01F4;
FCRxFF30_1512_STRUCT FCRxFF30_1512;
Bif_Sclk_Gating = NbClkGatingCtrl->Bif_Sclk_Gating;
//FCRxFF30_01F4[CgBifCgttSclkOverride].
NbSmuSrbmRegisterRead (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, Gnb->StdHeader);
FCRxFF30_01F4.Field.CgBifCgttSclkOverride = 0;
NbSmuSrbmRegisterWrite (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, TRUE, Gnb->StdHeader);
//FCRxFF30_1512
NbSmuSrbmRegisterRead (FCRxFF30_1512_ADDRESS, &FCRxFF30_1512.Value, Gnb->StdHeader);
FCRxFF30_1512.Field.SoftOverride0 = Bif_Sclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_1512_ADDRESS, &FCRxFF30_1512.Value, TRUE, Gnb->StdHeader);
}
/**
* Init NB Gmc clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitGmcClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Gmc_Sclk_Gating;
FCRxFF30_01F4_STRUCT FCRxFF30_01F4;
FCRxFF30_01F5_STRUCT FCRxFF30_01F5;
Gmc_Sclk_Gating = NbClkGatingCtrl->Gmc_Sclk_Gating;
//FCRxFF30_01F4[CgMcdwCgttSclkOverride, CgMcbCgttSclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, Gnb->StdHeader);
FCRxFF30_01F4.Field.CgMcbCgttSclkOverride = Gmc_Sclk_Gating ? 0 : 1;
FCRxFF30_01F4.Field.CgMcdwCgttSclkOverride = Gmc_Sclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, TRUE, Gnb->StdHeader);
//FCRxFF30_01F5[CgVmcCgttSclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, Gnb->StdHeader);
FCRxFF30_01F5.Field.CgVmcCgttSclkOverride = Gmc_Sclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, TRUE, Gnb->StdHeader);
}
/**
* Init NB Dce Sclk clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitDceSclkClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Dce_Sclk_Gating;
FCRxFF30_0134_STRUCT FCRxFF30_0134;
FCRxFF30_01F4_STRUCT FCRxFF30_01F4;
Dce_Sclk_Gating = NbClkGatingCtrl->Dce_Sclk_Gating;
//GMMx4D0[SymclkbGateDisable, SymclkaGateDisable, SclkGateDisable]
NbSmuSrbmRegisterRead (FCRxFF30_0134_ADDRESS, &FCRxFF30_0134.Value, Gnb->StdHeader);
FCRxFF30_0134.Field.SclkGateDisable = Dce_Sclk_Gating ? 0 : 1;
FCRxFF30_0134.Field.SymclkaGateDisable = Dce_Sclk_Gating ? 0 : 1;
FCRxFF30_0134.Field.SymclkbGateDisable = Dce_Sclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_0134_ADDRESS, &FCRxFF30_0134.Value, TRUE, Gnb->StdHeader);
//FCRxFF30_01F4[CgDcCgttSclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, Gnb->StdHeader);
FCRxFF30_01F4.Field.CgDcCgttSclkOverride = 0;
NbSmuSrbmRegisterWrite (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, TRUE, Gnb->StdHeader);
}
/**
* Init NB Dce Display clock gating
*
*
*
* @param[in] NbClkGatingCtrl Pointer to Clock gating control structure
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitDceDisplayClockGating (
IN NB_CLK_GATING_CTRL *NbClkGatingCtrl,
IN GNB_PLATFORM_CONFIG *Gnb
)
{
BOOLEAN Dce_Dispclk_Gating;
FCRxFF30_0134_STRUCT FCRxFF30_0134;
FCRxFF30_1B7C_STRUCT FCRxFF30_1B7C;
FCRxFF30_1E7C_STRUCT FCRxFF30_1E7C;
FCRxFF30_01F5_STRUCT FCRxFF30_01F5;
Dce_Dispclk_Gating = NbClkGatingCtrl->Dce_Dispclk_Gating;
//GMMx4D0[DispclkRDccgGateDisable,DispclkDccgGateDisable]
NbSmuSrbmRegisterRead (FCRxFF30_0134_ADDRESS, &FCRxFF30_0134.Value, Gnb->StdHeader);
FCRxFF30_0134.Field.DispclkDccgGateDisable = Dce_Dispclk_Gating ? 0 : 1;
FCRxFF30_0134.Field.DispclkRDccgGateDisable = Dce_Dispclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_0134_ADDRESS, &FCRxFF30_0134.Value, TRUE, Gnb->StdHeader);
//GMMx[79,6D]F0[CrtcDispclkGSclGateDisable, CrtcDispclkGDcpGateDisable, CrtcDispclkRDcfeGateDisable]
NbSmuSrbmRegisterRead (FCRxFF30_1B7C_ADDRESS, &FCRxFF30_1B7C.Value, Gnb->StdHeader);
FCRxFF30_1B7C.Field.CrtcDispclkRDcfeGateDisable = Dce_Dispclk_Gating ? 0 : 1;
FCRxFF30_1B7C.Field.CrtcDispclkGDcpGateDisable = Dce_Dispclk_Gating ? 0 : 1;
FCRxFF30_1B7C.Field.CrtcDispclkGSclGateDisable = Dce_Dispclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_1B7C_ADDRESS, &FCRxFF30_1B7C.Value, TRUE, Gnb->StdHeader);
NbSmuSrbmRegisterRead (FCRxFF30_1E7C_ADDRESS, &FCRxFF30_1E7C.Value, Gnb->StdHeader);
FCRxFF30_1E7C.Field.CrtcDispclkRDcfeGateDisable = Dce_Dispclk_Gating ? 0 : 1;
FCRxFF30_1E7C.Field.CrtcDispclkGDcpGateDisable = Dce_Dispclk_Gating ? 0 : 1;
FCRxFF30_1E7C.Field.CrtcDispclkGSclGateDisable = Dce_Dispclk_Gating ? 0 : 1;
NbSmuSrbmRegisterWrite (FCRxFF30_1E7C_ADDRESS, &FCRxFF30_1E7C.Value, TRUE, Gnb->StdHeader);
//FCRxFF30_01F5[CgDcCgttDispclkOverride]
NbSmuSrbmRegisterRead (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, Gnb->StdHeader);
FCRxFF30_01F5.Field.CgDcCgttDispclkOverride = 0;
NbSmuSrbmRegisterWrite (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, TRUE, Gnb->StdHeader);
}
/*----------------------------------------------------------------------------------------*/
/**
* Init NB clock gating
*
*
*
* @param[in] Gnb Pointer to global Gnb configuration
*/
VOID
NbInitClockGating (
IN GNB_PLATFORM_CONFIG *Gnb
)
{
NB_CLK_GATING_CTRL NbClkGatingCtrl;
//Init the default value of control structure.
NbClkGatingCtrl.Smu_Sclk_Gating = GnbBuildOptions.SmuSclkClockGatingEnable;
NbClkGatingCtrl.Smu_Lclk_Gating = TRUE;
NbClkGatingCtrl.Orb_Sclk_Gating = TRUE;
NbClkGatingCtrl.Orb_Lclk_Gating = TRUE;
NbClkGatingCtrl.Ioc_Sclk_Gating = TRUE;
NbClkGatingCtrl.Ioc_Lclk_Gating = TRUE;
NbClkGatingCtrl.Bif_Sclk_Gating = TRUE;
NbClkGatingCtrl.Gmc_Sclk_Gating = TRUE;
NbClkGatingCtrl.Dce_Sclk_Gating = TRUE;
NbClkGatingCtrl.Dce_Dispclk_Gating = TRUE;
NbFmNbClockGating (&NbClkGatingCtrl, Gnb->StdHeader);
IDS_OPTION_HOOK (IDS_GNB_CLOCK_GATING, &NbClkGatingCtrl, Gnb->StdHeader);
IDS_HDT_CONSOLE (GNB_TRACE, "NbInitClockGating Enter\n");
//SMU SCLK/LCLK clock gating
NbInitSmuClockGating (&NbClkGatingCtrl, Gnb);
// ORB clock gating
NbInitOrbClockGating (&NbClkGatingCtrl, Gnb);
//IOC clock gating
NbInitIocClockGating (&NbClkGatingCtrl, Gnb);
//BIF Clock Gating
NbInitBifClockGating (&NbClkGatingCtrl, Gnb);
//GMC Clock Gating
NbInitGmcClockGating (&NbClkGatingCtrl, Gnb);
//DCE Sclk clock gating
NbInitDceSclkClockGating (&NbClkGatingCtrl, Gnb);
//DCE Display clock gating
NbInitDceDisplayClockGating (&NbClkGatingCtrl, Gnb);
GNB_DEBUG_CODE (
{
FCRxFF30_01F4_STRUCT FCRxFF30_01F4;
FCRxFF30_01F5_STRUCT FCRxFF30_01F5;
FCRxFF30_1512_STRUCT FCRxFF30_1512;
NbSmuSrbmRegisterRead (FCRxFF30_01F4_ADDRESS, &FCRxFF30_01F4.Value, Gnb->StdHeader);
NbSmuSrbmRegisterRead (FCRxFF30_01F5_ADDRESS, &FCRxFF30_01F5.Value, Gnb->StdHeader);
NbSmuSrbmRegisterRead (FCRxFF30_1512_ADDRESS, &FCRxFF30_1512.Value, Gnb->StdHeader);
IDS_HDT_CONSOLE (NB_MISC, " Clock Gating FCRxFF30_01F4 - 0x%x\n", FCRxFF30_01F4.Value);
IDS_HDT_CONSOLE (NB_MISC, " Clock Gating FCRxFF30_01F5 - 0x%x\n", FCRxFF30_01F5.Value);
IDS_HDT_CONSOLE (NB_MISC, " Clock Gating FCRxFF30_1512 - 0x%x\n", FCRxFF30_1512.Value);
}
);
IDS_HDT_CONSOLE (GNB_TRACE, "NbInitClockGating End\n");
}