summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset
diff options
context:
space:
mode:
authorRichard J. Knight <rjknight@us.ibm.com>2013-06-19 14:45:43 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-07-08 10:33:08 -0500
commitd7fe9d5249533747b6d796ca876fe5147b88819f (patch)
tree2433a0424b6f969c98701ecc0cbe8241b2a5a4ba /src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset
parent7a2c484cc9c574302beb70cfff449bb40d26c2e2 (diff)
downloadtalos-hostboot-d7fe9d5249533747b6d796ca876fe5147b88819f.tar.gz
talos-hostboot-d7fe9d5249533747b6d796ca876fe5147b88819f.zip
SW210027 : P8 Lab : Centaur : ADR flush procedure updates (Hostboot)
cen_scom_addresses.H v1.63 mss_ddr_phy_reset.C v1.25 mss_draminit_mc.C v1.39 Change-Id: Ie041e9c1503b72d031a0b48113692de0d73bb3c0 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/5284 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset')
-rw-r--r--src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset/mss_ddr_phy_reset.C271
1 files changed, 175 insertions, 96 deletions
diff --git a/src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset/mss_ddr_phy_reset.C b/src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset/mss_ddr_phy_reset.C
index 9202268ff..5017535b9 100644
--- a/src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset/mss_ddr_phy_reset.C
+++ b/src/usr/hwpf/hwp/dram_training/mss_ddr_phy_reset/mss_ddr_phy_reset.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: mss_ddr_phy_reset.C,v 1.18 2013/03/18 19:38:48 mfred Exp $
+// $Id: mss_ddr_phy_reset.C,v 1.25 2013/06/26 17:40:56 mwuu Exp $
// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/ipl/fapi/mss_ddr_phy_reset.C,v $
//------------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2011
@@ -70,6 +70,7 @@ using namespace fapi;
// prototypes of functions called in phy reset
ReturnCode mss_deassert_force_mclk_low (const Target& i_target);
ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target);
+ReturnCode mss_ddr_phy_flush(const fapi::Target & i_target);
fapi::ReturnCode mss_ddr_phy_reset(const fapi::Target & i_target)
{
@@ -78,6 +79,7 @@ fapi::ReturnCode mss_ddr_phy_reset(const fapi::Target & i_target)
fapi::ReturnCode rc;
fapi::ReturnCode slewcal_rc;
+ fapi::ReturnCode phyflush_rc;
rc = mss_ddr_phy_reset_cloned(i_target);
@@ -92,7 +94,7 @@ fapi::ReturnCode mss_ddr_phy_reset(const fapi::Target & i_target)
FAPI_ERR(" mss_slew_cal failed! rc = 0x%08X (creator = %d)", uint32_t(slewcal_rc), slewcal_rc.getCreator());
fapiLogError(slewcal_rc);
}
- else if (slewcal_rc)
+ else if (slewcal_rc)
{
rc = slewcal_rc;
}
@@ -103,6 +105,17 @@ fapi::ReturnCode mss_ddr_phy_reset(const fapi::Target & i_target)
// it will just return the passed in rc.
rc = mss_unmask_ddrphy_errors(i_target, rc);
+ phyflush_rc = mss_ddr_phy_flush(i_target);
+
+ if ((phyflush_rc) && (rc))
+ {
+ FAPI_ERR(" mss_ddr_phy_flush failed! rc = 0x%08X (creator = %d)", uint32_t(phyflush_rc), phyflush_rc.getCreator());
+ }
+ else if (phyflush_rc)
+ {
+ rc = phyflush_rc;
+ }
+
return rc;
}
@@ -124,21 +137,21 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
uint8_t l_dqBitmap[DIMM_DQ_RANK_BITMAP_SIZE]; // 10 byte array of bad bits
uint8_t valid_dimms = 0;
uint8_t valid_dimm[2][2];
- uint8_t num_ranks_per_dimm[2][2];
+ uint8_t num_mranks_per_dimm[2][2];
uint8_t l_port = 0;
uint8_t l_dimm = 0;
uint8_t l_rank = 0;
- uint8_t new_error = 0;
- uint8_t P0_DP0_reg_error = 0;
- uint8_t P0_DP1_reg_error = 0;
- uint8_t P0_DP2_reg_error = 0;
- uint8_t P0_DP3_reg_error = 0;
- uint8_t P0_DP4_reg_error = 0;
- uint8_t P1_DP0_reg_error = 0;
- uint8_t P1_DP1_reg_error = 0;
- uint8_t P1_DP2_reg_error = 0;
- uint8_t P1_DP3_reg_error = 0;
- uint8_t P1_DP4_reg_error = 0;
+ bool new_error = false;
+ bool P0_DP0_reg_error = false;
+ bool P0_DP1_reg_error = false;
+ bool P0_DP2_reg_error = false;
+ bool P0_DP3_reg_error = false;
+ bool P0_DP4_reg_error = false;
+ bool P1_DP0_reg_error = false;
+ bool P1_DP1_reg_error = false;
+ bool P1_DP2_reg_error = false;
+ bool P1_DP3_reg_error = false;
+ bool P1_DP4_reg_error = false;
fapi::Target l_centaurTarget;
uint8_t continue_on_dp18_pll_lock_failure = 0;
@@ -407,54 +420,53 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
FAPI_ERR("Error getting Centaur parent target from the input MBA");
break;
}
- else
+ rc = FAPI_ATTR_GET( ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL, &l_centaurTarget, continue_on_dp18_pll_lock_failure);
+ if (rc)
{
- rc = FAPI_ATTR_GET( ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL, &l_centaurTarget, continue_on_dp18_pll_lock_failure);
- if (rc)
- {
- FAPI_ERR("Failed to get attribute: ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL.");
- break;
- }
- else
- {
- FAPI_DBG("Got attribute ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL: value=%X.\n", continue_on_dp18_pll_lock_failure);
- }
+ FAPI_ERR("Failed to get attribute: ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL.");
+ break;
}
+ FAPI_DBG("Got attribute ATTR_CENTAUR_EC_MSS_CONTINUE_ON_DP18_PLL_LOCK_FAIL: value=%X.\n", continue_on_dp18_pll_lock_failure);
+
//-------------------------------
// 8b - Check Port 0 DP lock bits
if ( dp_p0_lock_data.getHalfWord(3) != DP18_PLL_EXP_LOCK_STATUS )
{
- FAPI_ERR("One or more DP18 port 0 (0x0C000) PLL failed to lock! Lock Status = %04X",dp_p0_lock_data.getHalfWord(3));
- FAPI_SET_HWP_ERROR(rc, RC_MSS_DP18_0_PLL_FAILED_TO_LOCK);
- if ( dp_p0_lock_data.isBitClear(48) ) { FAPI_ERR("Port 0 DP 0 PLL failed to lock!");}
- if ( dp_p0_lock_data.isBitClear(49) ) { FAPI_ERR("Port 0 DP 1 PLL failed to lock!");}
- if ( dp_p0_lock_data.isBitClear(50) ) { FAPI_ERR("Port 0 DP 2 PLL failed to lock!");}
- if ( dp_p0_lock_data.isBitClear(51) ) { FAPI_ERR("Port 0 DP 3 PLL failed to lock!");}
- if ( dp_p0_lock_data.isBitClear(52) ) { FAPI_ERR("Port 0 DP 4 PLL failed to lock!");}
+ if ( dp_p0_lock_data.isBitClear(48) ) { FAPI_INF("Port 0 DP 0 PLL failed to lock!");}
+ if ( dp_p0_lock_data.isBitClear(49) ) { FAPI_INF("Port 0 DP 1 PLL failed to lock!");}
+ if ( dp_p0_lock_data.isBitClear(50) ) { FAPI_INF("Port 0 DP 2 PLL failed to lock!");}
+ if ( dp_p0_lock_data.isBitClear(51) ) { FAPI_INF("Port 0 DP 3 PLL failed to lock!");}
+ if ( dp_p0_lock_data.isBitClear(52) ) { FAPI_INF("Port 0 DP 4 PLL failed to lock!");}
if (!continue_on_dp18_pll_lock_failure)
{
+ FAPI_ERR("One or more DP18 port 0 (0x0C000) PLL failed to lock! Lock Status = %04X",dp_p0_lock_data.getHalfWord(3));
FAPI_ERR("DP18 PLL lock failed and this chip does not have the known DP18 lock bug.");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_DP18_0_PLL_FAILED_TO_LOCK);
break;
}
// for DD1 parts that have the DP18 lock bug - keep going to initialize any other channels that might be good.
+ FAPI_INF("One or more DP18 port 0 (0x0C000) PLL failed to lock! Lock Status = %04X",dp_p0_lock_data.getHalfWord(3));
+ FAPI_INF("Continuing anyway to initialize any other channels that might be good...");
}
//-------------------------------
// 8c - Check Port 1 DP lock bits
if ( dp_p1_lock_data.getHalfWord(3) != DP18_PLL_EXP_LOCK_STATUS )
{
- FAPI_ERR("One or more DP18 port 1 (0x1C000) PLL failed to lock! Lock Status = %04X",dp_p1_lock_data.getHalfWord(3));
- FAPI_SET_HWP_ERROR(rc, RC_MSS_DP18_1_PLL_FAILED_TO_LOCK);
- if ( dp_p1_lock_data.isBitClear(48) ) { FAPI_ERR("Port 1 DP 0 PLL failed to lock!");}
- if ( dp_p1_lock_data.isBitClear(49) ) { FAPI_ERR("Port 1 DP 1 PLL failed to lock!");}
- if ( dp_p1_lock_data.isBitClear(50) ) { FAPI_ERR("Port 1 DP 2 PLL failed to lock!");}
- if ( dp_p1_lock_data.isBitClear(51) ) { FAPI_ERR("Port 1 DP 3 PLL failed to lock!");}
- if ( dp_p1_lock_data.isBitClear(52) ) { FAPI_ERR("Port 1 DP 4 PLL failed to lock!");}
+ if ( dp_p1_lock_data.isBitClear(48) ) { FAPI_INF("Port 1 DP 0 PLL failed to lock!");}
+ if ( dp_p1_lock_data.isBitClear(49) ) { FAPI_INF("Port 1 DP 1 PLL failed to lock!");}
+ if ( dp_p1_lock_data.isBitClear(50) ) { FAPI_INF("Port 1 DP 2 PLL failed to lock!");}
+ if ( dp_p1_lock_data.isBitClear(51) ) { FAPI_INF("Port 1 DP 3 PLL failed to lock!");}
+ if ( dp_p1_lock_data.isBitClear(52) ) { FAPI_INF("Port 1 DP 4 PLL failed to lock!");}
if (!continue_on_dp18_pll_lock_failure)
{
+ FAPI_ERR("One or more DP18 port 1 (0x1C000) PLL failed to lock! Lock Status = %04X",dp_p1_lock_data.getHalfWord(3));
FAPI_ERR("DP18 PLL lock failed and this chip does not have the known DP18 lock bug.");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_DP18_1_PLL_FAILED_TO_LOCK);
break;
}
// for DD1 parts that have the DP18 lock bug - keep going to initialize any other channels that might be good.
+ FAPI_INF("One or more DP18 port 1 (0x1C000) PLL failed to lock! Lock Status = %04X",dp_p1_lock_data.getHalfWord(3));
+ FAPI_INF("Continuing anyway to initialize any other channels that might be good...");
}
//-------------------------------
// 8d - Check Port 0 AD lock bits
@@ -528,61 +540,61 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_0 register.");
- P0_DP0_reg_error = 1;
+ P0_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0_0x800100070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0 register.");
- P1_DP0_reg_error = 1;
+ P1_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1_0x800004070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1 register.");
- P0_DP1_reg_error = 1;
+ P0_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1_0x800104070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1 register.");
- P1_DP1_reg_error = 1;
+ P1_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2_0x800008070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2 register.");
- P0_DP2_reg_error = 1;
+ P0_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2_0x800108070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2 register.");
- P1_DP2_reg_error = 1;
+ P1_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3_0x80000C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3 register.");
- P0_DP3_reg_error = 1;
+ P0_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3_0x80010C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3 register.");
- P1_DP3_reg_error = 1;
+ P1_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4_0x800010070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4 register.");
- P0_DP4_reg_error = 1;
+ P0_DP4_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4_0x800110070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4 register.");
- P1_DP4_reg_error = 1;
+ P1_DP4_reg_error = true;
}
@@ -673,61 +685,61 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_0 register.");
- P0_DP0_reg_error = 1;
+ P0_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0_0x800100070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0 register.");
- P1_DP0_reg_error = 1;
+ P1_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1_0x800004070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1 register.");
- P0_DP1_reg_error = 1;
+ P0_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1_0x800104070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1 register.");
- P1_DP1_reg_error = 1;
+ P1_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2_0x800008070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2 register.");
- P0_DP2_reg_error = 1;
+ P0_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2_0x800108070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2 register.");
- P1_DP2_reg_error = 1;
+ P1_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3_0x80000C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3 register.");
- P0_DP3_reg_error = 1;
+ P0_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3_0x80010C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3 register.");
- P1_DP3_reg_error = 1;
+ P1_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4_0x800010070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4 register.");
- P0_DP4_reg_error = 1;
+ P0_DP4_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4_0x800110070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4 register.");
- P1_DP4_reg_error = 1;
+ P1_DP4_reg_error = true;
}
@@ -781,61 +793,61 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_0 register.");
- P0_DP0_reg_error = 1;
+ P0_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0_0x800100070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0 register.");
- P1_DP0_reg_error = 1;
+ P1_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1_0x800004070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1 register.");
- P0_DP1_reg_error = 1;
+ P0_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1_0x800104070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1 register.");
- P1_DP1_reg_error = 1;
+ P1_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2_0x800008070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2 register.");
- P0_DP2_reg_error = 1;
+ P0_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2_0x800108070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2 register.");
- P1_DP2_reg_error = 1;
+ P1_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3_0x80000C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3 register.");
- P0_DP3_reg_error = 1;
+ P0_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3_0x80010C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3 register.");
- P1_DP3_reg_error = 1;
+ P1_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4_0x800010070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4 register.");
- P0_DP4_reg_error = 1;
+ P0_DP4_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4_0x800110070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4 register.");
- P1_DP4_reg_error = 1;
+ P1_DP4_reg_error = true;
}
@@ -878,61 +890,61 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_0 register.");
- P0_DP0_reg_error = 1;
+ P0_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0_0x800100070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_0 register.");
- P1_DP0_reg_error = 1;
+ P1_DP0_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1_0x800004070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_1 register.");
- P0_DP1_reg_error = 1;
+ P0_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1_0x800104070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_1 register.");
- P1_DP1_reg_error = 1;
+ P1_DP1_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2_0x800008070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_2 register.");
- P0_DP2_reg_error = 1;
+ P0_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2_0x800108070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_2 register.");
- P1_DP2_reg_error = 1;
+ P1_DP2_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3_0x80000C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_3 register.");
- P0_DP3_reg_error = 1;
+ P0_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3_0x80010C070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_3 register.");
- P1_DP3_reg_error = 1;
+ P1_DP3_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4_0x800010070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P0_4 register.");
- P0_DP4_reg_error = 1;
+ P0_DP4_reg_error = true;
}
rc = fapiPutScom( i_target, DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4_0x800110070301143F, i_data);
if (rc)
{
FAPI_ERR("Error writing DPHY01_DDRPHY_DP18_SYSCLK_PR_P1_4 register.");
- P1_DP4_reg_error = 1;
+ P1_DP4_reg_error = true;
}
}
@@ -1003,7 +1015,7 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
valid_dimm[1][1] = (valid_dimms & 0x04);
// Find out how many ranks are on each dimm
- rc = FAPI_ATTR_GET( ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target, num_ranks_per_dimm);
+ rc = FAPI_ATTR_GET( ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, &i_target, num_mranks_per_dimm);
if (rc)
{
FAPI_ERR("Failed to get attribute: ATTR_EFF_NUM_RANKS_PER_DIMM.");
@@ -1020,7 +1032,7 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
if (valid_dimm[l_port][l_dimm])
{
// Ok, this DIMM is functional. So loop through the RANKs of this dimm.
- for(l_rank=0; l_rank<num_ranks_per_dimm[l_port][l_dimm]; l_rank++ )
+ for(l_rank=0; l_rank<num_mranks_per_dimm[l_port][l_dimm]; l_rank++ )
{
// Get the bad DQ Bitmap for l_port, l_dimm, l_rank
rc = dimmGetBadDqBitmap(i_target,
@@ -1035,24 +1047,24 @@ fapi::ReturnCode mss_ddr_phy_reset_cloned(const fapi::Target & i_target)
}
// Mark the bad bits for each register that had problems or PLL that did not lock
- new_error = 0;
+ new_error = false;
if ( l_port == 0 )
{
- if (( P0_DP0_reg_error == 1 ) || ( dp_p0_lock_data.isBitClear(48) )) { l_dqBitmap[0] = 0xff; l_dqBitmap[1] = 0xff; new_error = 1; }
- if (( P0_DP1_reg_error == 1 ) || ( dp_p0_lock_data.isBitClear(49) )) { l_dqBitmap[2] = 0xff; l_dqBitmap[3] = 0xff; new_error = 1; }
- if (( P0_DP2_reg_error == 1 ) || ( dp_p0_lock_data.isBitClear(50) )) { l_dqBitmap[4] = 0xff; l_dqBitmap[5] = 0xff; new_error = 1; }
- if (( P0_DP3_reg_error == 1 ) || ( dp_p0_lock_data.isBitClear(51) )) { l_dqBitmap[6] = 0xff; l_dqBitmap[7] = 0xff; new_error = 1; }
- if (( P0_DP4_reg_error == 1 ) || ( dp_p0_lock_data.isBitClear(52) )) { l_dqBitmap[8] = 0xff; l_dqBitmap[9] = 0xff; new_error = 1; }
+ if (( P0_DP0_reg_error ) || ( dp_p0_lock_data.isBitClear(48) )) { l_dqBitmap[0] = 0xff; l_dqBitmap[1] = 0xff; new_error = true; }
+ if (( P0_DP1_reg_error ) || ( dp_p0_lock_data.isBitClear(49) )) { l_dqBitmap[2] = 0xff; l_dqBitmap[3] = 0xff; new_error = true; }
+ if (( P0_DP2_reg_error ) || ( dp_p0_lock_data.isBitClear(50) )) { l_dqBitmap[4] = 0xff; l_dqBitmap[5] = 0xff; new_error = true; }
+ if (( P0_DP3_reg_error ) || ( dp_p0_lock_data.isBitClear(51) )) { l_dqBitmap[6] = 0xff; l_dqBitmap[7] = 0xff; new_error = true; }
+ if (( P0_DP4_reg_error ) || ( dp_p0_lock_data.isBitClear(52) )) { l_dqBitmap[8] = 0xff; l_dqBitmap[9] = 0xff; new_error = true; }
} else {
- if (( P1_DP0_reg_error == 1 ) || ( dp_p1_lock_data.isBitClear(48) )) { l_dqBitmap[0] = 0xff; l_dqBitmap[1] = 0xff; new_error = 1; }
- if (( P1_DP1_reg_error == 1 ) || ( dp_p1_lock_data.isBitClear(49) )) { l_dqBitmap[2] = 0xff; l_dqBitmap[3] = 0xff; new_error = 1; }
- if (( P1_DP2_reg_error == 1 ) || ( dp_p1_lock_data.isBitClear(50) )) { l_dqBitmap[4] = 0xff; l_dqBitmap[5] = 0xff; new_error = 1; }
- if (( P1_DP3_reg_error == 1 ) || ( dp_p1_lock_data.isBitClear(51) )) { l_dqBitmap[6] = 0xff; l_dqBitmap[7] = 0xff; new_error = 1; }
- if (( P1_DP4_reg_error == 1 ) || ( dp_p1_lock_data.isBitClear(52) )) { l_dqBitmap[8] = 0xff; l_dqBitmap[9] = 0xff; new_error = 1; }
+ if (( P1_DP0_reg_error ) || ( dp_p1_lock_data.isBitClear(48) )) { l_dqBitmap[0] = 0xff; l_dqBitmap[1] = 0xff; new_error = true; }
+ if (( P1_DP1_reg_error ) || ( dp_p1_lock_data.isBitClear(49) )) { l_dqBitmap[2] = 0xff; l_dqBitmap[3] = 0xff; new_error = true; }
+ if (( P1_DP2_reg_error ) || ( dp_p1_lock_data.isBitClear(50) )) { l_dqBitmap[4] = 0xff; l_dqBitmap[5] = 0xff; new_error = true; }
+ if (( P1_DP3_reg_error ) || ( dp_p1_lock_data.isBitClear(51) )) { l_dqBitmap[6] = 0xff; l_dqBitmap[7] = 0xff; new_error = true; }
+ if (( P1_DP4_reg_error ) || ( dp_p1_lock_data.isBitClear(52) )) { l_dqBitmap[8] = 0xff; l_dqBitmap[9] = 0xff; new_error = true; }
}
// If there are new errors, write back the bad DQ Bitmap for l_port, l_dimm, l_rank
- if ( new_error == 1 )
+ if ( new_error )
{
rc = dimmSetBadDqBitmap(i_target,
l_port,
@@ -1102,19 +1114,86 @@ ReturnCode mss_deassert_force_mclk_low (const Target& i_target)
return rc;
}
+fapi::ReturnCode mss_ddr_phy_flush(const fapi::Target & i_target)
+{
+ fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ ecmdDataBufferBase i_data(64);
+ ecmdDataBufferBase l_mask(64);
+
+ FAPI_INF(" Performing mss_ddr_phy_flush routine");
+
+ FAPI_INF("ADR/DP18 FLUSH: 1) set PC_POWERDOWN_1 register, powerdown enable(48), flush bit(58)");
+ rc_ecmd = i_data.flushTo0(); // clear data buffer
+ rc_ecmd |= i_data.setBit(48); // set MASTER_PD_CNTL bit
+ rc_ecmd |= i_data.setBit(58); // set WR_FIFO_STAB bit
+
+ rc_ecmd |= l_mask.flushTo0(); // clear mask buffer
+ rc_ecmd |= l_mask.setBit(48); // set MASTER_PD_CNTL bit
+ rc_ecmd |= l_mask.setBit(58); // set WR_FIFO_STAB mask bit
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+
+ rc = fapiPutScomUnderMask(i_target, DPHY01_DDRPHY_PC_POWERDOWN_1_P0_0x8000C0100301143F, i_data, l_mask);
+ if(rc) return rc;
+
+ rc = fapiPutScomUnderMask(i_target, DPHY01_DDRPHY_PC_POWERDOWN_1_P1_0x8001C0100301143F, i_data, l_mask);
+ if(rc) return rc;
+
+ rc = fapiDelay(DELAY_100NS, DELAY_2000SIMCYCLES); // wait 2000 simcycles (in sim mode) OR 100 nS (in hw mode)
+ if(rc) return rc;
+
+ FAPI_INF("ADR/DP18 FLUSH: 2) clear PC_POWERDOWN_1 register, powerdown enable(48), flush bit(58)");
+ rc_ecmd = i_data.flushTo0(); // clear data buffer
+
+ rc_ecmd |= l_mask.flushTo0(); // clear mask buffer
+ rc_ecmd |= l_mask.setBit(48); // set MASTER_PD_CNTL bit
+ rc_ecmd |= l_mask.setBit(58); // set WR_FIFO_STAB mask bit
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+
+ rc = fapiPutScomUnderMask(i_target, DPHY01_DDRPHY_PC_POWERDOWN_1_P0_0x8000C0100301143F, i_data, l_mask);
+ if(rc) return rc;
+
+ rc = fapiPutScomUnderMask(i_target, DPHY01_DDRPHY_PC_POWERDOWN_1_P1_0x8001C0100301143F, i_data, l_mask);
+ if(rc) return rc;
+
+ return rc;
+}
} //end extern C
-
-
-
/*
*************** Do not edit this area ***************
This section is automatically updated by CVS when you check in this file.
Be sure to create CVS comments when you commit so that they can be included here.
$Log: mss_ddr_phy_reset.C,v $
+Revision 1.25 2013/06/26 17:40:56 mwuu
+Submitting Mark Fredrickson's clean up from FW review.
+
+Revision 1.24 2013/06/19 20:07:53 mwuu
+Implemented new ADR flush procedure via powerdown1 register.
+
+Revision 1.22 2013/06/14 17:44:49 mwuu
+Backed out the ADR flush workaround.
+
+Revision 1.21 2013/06/12 23:17:19 mwuu
+Removed DP18 flush section, fixed ADR toggle flush loop.
+
+Revision 1.20 2013/06/12 20:58:17 mwuu
+Fixed loop control structure for toggling the 0,1,0 in ADR block of flush FN.
+
+Revision 1.19 2013/06/11 19:05:27 mwuu
+Update to use master ranks for bad bitmap, and added flush function for ADR/DP18 workaround.
+
Revision 1.18 2013/03/18 19:38:48 mfred
Update to not continue if DP18 PLL fails to lock and EC is DD2.
OpenPOWER on IntegriCloud