summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/tod_init
diff options
context:
space:
mode:
authorThi Tran <thi@us.ibm.com>2014-10-24 07:50:34 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-10-31 10:54:11 -0500
commit9d72dd315b1a1633cb2992afaed6d9f55e9e4274 (patch)
treee34d41e12e23cd6f1985e4aea1f5cbf33396ea10 /src/usr/hwpf/hwp/tod_init
parent420044aa017b534e92e3043d6bda85eeff3c7a59 (diff)
downloadtalos-hostboot-9d72dd315b1a1633cb2992afaed6d9f55e9e4274.tar.gz
talos-hostboot-9d72dd315b1a1633cb2992afaed6d9f55e9e4274.zip
SW282769: FW820:Subsequent MPIPL test hit a B111BA24 - RC_PROC_TOD_INIT_ERROR er
CQ:SW282769 Change-Id: Ieb9062e1cec2180c9aad7e7355a0aeacd022bbca Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14123 Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: James N. Klazynski <jklazyns@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: Thi N. Tran <thi@us.ibm.com> Tested-by: Thi N. Tran <thi@us.ibm.com> Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14173 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/tod_init')
-rw-r--r--src/usr/hwpf/hwp/tod_init/proc_tod_init/proc_tod_init.C58
-rw-r--r--src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.C48
-rw-r--r--src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.H9
3 files changed, 84 insertions, 31 deletions
diff --git a/src/usr/hwpf/hwp/tod_init/proc_tod_init/proc_tod_init.C b/src/usr/hwpf/hwp/tod_init/proc_tod_init/proc_tod_init.C
index 7fd18d588..820863315 100644
--- a/src/usr/hwpf/hwp/tod_init/proc_tod_init/proc_tod_init.C
+++ b/src/usr/hwpf/hwp/tod_init/proc_tod_init/proc_tod_init.C
@@ -22,7 +22,7 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: proc_tod_init.C,v 1.12 2014/10/03 18:44:41 thi Exp $
+// $Id: proc_tod_init.C,v 1.15 2014/10/23 18:56:17 jklazyns Exp $
//------------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2012
// *! All Rights Reserved -- Property of IBM
@@ -56,13 +56,13 @@ extern "C"
//------------------------------------------------------------------------------
// function: proc_tod_init
//
-// parameters:
+// parameters:
// i_tod_node Reference to TOD topology (FAPI targets included within)
//
-// i_failingTodProc, Porinter to the fapi target, the memory location
+// i_failingTodProc, Pointer to the fapi target, the memory location
// addressed by this parameter will be populated with processor target
// which is not able to recieve proper singals from OSC.
-// Caller needs to look at this parameter only when proc_tod_init fails
+// Caller needs to look at this parameter only when proc_tod_init fails
// and reason code indicates OSC failure. It is defaulted to NULL.
//
// returns: FAPI_RC_SUCCESS if TOD topology is successfully initialized
@@ -169,13 +169,13 @@ fapi::ReturnCode proc_tod_clear_error_reg(const tod_topology_node* i_tod_node)
//------------------------------------------------------------------------------
// function: init_tod_node
//
-// parameters:
+// parameters:
// i_tod_node Reference to TOD topology (FAPI targets included within)
//
-// i_failingTodProc, Porinter to the fapi target, the memory location
+// i_failingTodProc, Pointer to the fapi target, the memory location
// addressed by this parameter will be populated with processor target
// which is not able to recieve proper singals from OSC.
-// Caller needs to look at this parameter only when proc_tod_init fails
+// Caller needs to look at this parameter only when proc_tod_init fails
// and reason code indicates OSC failure. It is defaulted to NULL.
//
// returns: FAPI_RC_SUCCESS if TOD topology is successfully initialized
@@ -190,7 +190,7 @@ fapi::ReturnCode init_tod_node(const tod_topology_node* i_tod_node,
uint32_t tod_init_pending_count = 0; // Timeout counter for bits that are cleared by hardware
fapi::Target* target = i_tod_node->i_target;
- FAPI_INF("init_tod_node: Start: Configuring %s", target->toEcmdString());
+ FAPI_INF("init_tod_node: Start: Initializing %s", target->toEcmdString());
do
{
@@ -244,7 +244,7 @@ fapi::ReturnCode init_tod_node(const tod_topology_node* i_tod_node,
FAPI_ERR("init_tod_node: Master: Could not write TOD_TX_TTYPE_5_REG_00040016");
break;
}
-
+
FAPI_INF("init_tod_node: Master: Chip TOD load value (move TB to TOD)");
rc_ecmd |= data.flushTo0();
rc_ecmd |= data.setWord(0,0x00000000);
@@ -299,7 +299,7 @@ fapi::ReturnCode init_tod_node(const tod_topology_node* i_tod_node,
while (tod_init_pending_count < PROC_TOD_UTIL_TIMEOUT_COUNT)
{
FAPI_DBG("init_tod_node: Waiting for TOD to assert TOD_FSM_REG_TOD_IS_RUNNING...");
-
+
rc = fapiDelay(PROC_TOD_UTILS_HW_NS_DELAY,
PROC_TOD_UTILS_SIM_CYCLE_DELAY);
if (!rc.ok())
@@ -332,10 +332,11 @@ fapi::ReturnCode init_tod_node(const tod_topology_node* i_tod_node,
break;
}
- FAPI_INF("init_tod_node: clear TTYPE#2 and TTYPE#4 status");
+ FAPI_INF("init_tod_node: clear TTYPE#2, TTYPE#4, and TTYPE#5 status");
rc_ecmd |= data.flushTo0();
rc_ecmd |= data.setBit(TOD_ERROR_REG_RX_TTYPE_2);
rc_ecmd |= data.setBit(TOD_ERROR_REG_RX_TTYPE_4);
+ rc_ecmd |= data.setBit(TOD_ERROR_REG_RX_TTYPE_5);
if (rc_ecmd)
{
FAPI_ERR("init_tod_node: Error 0x%08X in ecmdDataBuffer setup for TOD_ERROR_REG_00040030.", rc_ecmd);
@@ -380,20 +381,35 @@ fapi::ReturnCode init_tod_node(const tod_topology_node* i_tod_node,
break;
}
- FAPI_INF("init_tod_node: set error mask to runtime configuration");
- rc_ecmd |= data.flushTo0();
- rc_ecmd |= data.setWord(1,0x03F00000); // Mask TTYPE received informational bits 38:43
- if (rc_ecmd)
+ // TOD_ERROR_MASK_STATUS_REG_00040032 is not writable on some chips
+ uint8_t chipHasTodErrorMaskBug = 0;
+ rc = FAPI_ATTR_GET(ATTR_CHIP_EC_FEATURE_HW_BUG_TOD_ERROR_MASK_NOT_WRITABLE, target, chipHasTodErrorMaskBug);
+ if(rc)
{
- FAPI_ERR("init_tod_node: Error 0x%08X in ecmdDataBuffer setup for TOD_ERROR_MASK_STATUS_REG_00040032 SCOM.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
+ FAPI_ERR("init_tod_node: Error querying Chip EC feature: ATTR_CHIP_EC_FEATURE_HW_BUG_TOD_ERROR_MASK_NOT_WRITABLE");
break;
}
- rc = fapiPutScom(*target, TOD_ERROR_MASK_STATUS_REG_00040032, data);
- if (!rc.ok())
+ if(!chipHasTodErrorMaskBug)
{
- FAPI_ERR("init_tod_node: Could not write TOD_ERROR_MASK_STATUS_REG_00040032");
- break;
+ FAPI_INF("init_tod_node: set error mask to runtime configuration");
+ rc_ecmd |= data.flushTo0();
+ rc_ecmd |= data.setWord(1,0x03F00000); // Mask TTYPE received informational bits 38:43
+ if (rc_ecmd)
+ {
+ FAPI_ERR("init_tod_node: Error 0x%08X in ecmdDataBuffer setup for TOD_ERROR_MASK_STATUS_REG_00040032 SCOM.", rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ rc = fapiPutScom(*target, TOD_ERROR_MASK_STATUS_REG_00040032, data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("init_tod_node: Could not write TOD_ERROR_MASK_STATUS_REG_00040032");
+ break;
+ }
+ }
+ else
+ {
+ FAPI_INF("init_tod_node: Skipping TOD error mask setup because of chip limitation.");
}
// Finish configuring downstream nodes
diff --git a/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.C b/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.C
index 39f5b4a28..2fcae0881 100644
--- a/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.C
+++ b/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.C
@@ -22,7 +22,7 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: proc_tod_setup.C,v 1.21 2014/09/09 16:13:20 jklazyns Exp $
+// $Id: proc_tod_setup.C,v 1.22 2014/10/22 17:11:05 jklazyns Exp $
//------------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2012
// *! All Rights Reserved -- Property of IBM
@@ -79,6 +79,7 @@ fapi::ReturnCode proc_tod_setup(tod_topology_node* i_tod_node,
const proc_tod_setup_osc_sel i_osc_sel)
{
fapi::ReturnCode rc;
+ fapi::ATTR_IS_MPIPL_Type is_mpipl = 0x00;
// Mark HWP entry
FAPI_INF("proc_tod_setup: Start");
@@ -112,8 +113,15 @@ fapi::ReturnCode proc_tod_setup(tod_topology_node* i_tod_node,
}
display_tod_nodes(i_tod_node,0);
+ rc = FAPI_ATTR_GET(ATTR_IS_MPIPL, NULL, is_mpipl);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_tod_setup: fapiGetAttribute of ATTR_IS_MPIPL failed!");
+ break;
+ }
+
// If there is a previous topology, it needs to be cleared
- rc = clear_tod_node(i_tod_node,i_tod_sel);
+ rc = clear_tod_node(i_tod_node, i_tod_sel, is_mpipl);
if (!rc.ok())
{
FAPI_ERR("proc_tod_setup: Failure clearing previous TOD configuration!");
@@ -139,14 +147,18 @@ fapi::ReturnCode proc_tod_setup(tod_topology_node* i_tod_node,
//
// parameters: i_tod_node Reference to TOD topology (FAPI targets included within)
// i_tod_sel Specifies the topology to clear
+// i_is_mpipl if this IPL is an MPIPL, additional setup is needed;
+// determined via an attribute
//
// returns: FAPI_RC_SUCCESS if TOD topology is successfully cleared
// else FAPI or ECMD error is sent through
//------------------------------------------------------------------------------
-fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
- const proc_tod_setup_tod_sel i_tod_sel)
+fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
+ const proc_tod_setup_tod_sel i_tod_sel,
+ const fapi::ATTR_IS_MPIPL_Type i_is_mpipl)
{
fapi::ReturnCode rc;
+ uint32_t rc_ecmd = 0;
ecmdDataBufferBase data(64);
fapi::Target* target = i_tod_node->i_target;
uint32_t port_ctrl_reg = 0;
@@ -169,7 +181,6 @@ fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
port_ctrl_reg = TOD_SEC_PORT_1_CTRL_REG_00040004;
port_ctrl_check_reg = TOD_PRI_PORT_1_CTRL_REG_00040002;
}
-
rc = fapiPutScom(*target,port_ctrl_reg,data);
if (!rc.ok())
{
@@ -182,14 +193,37 @@ fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
FAPI_ERR("clear_tod_node: fapiPutScom error for port_ctrl_check_reg SCOM.");
break;
}
-
+
+ if (i_is_mpipl)
+ {
+ FAPI_INF("clear_tod_node: MPIPL: switch TOD to 'Not Set' state");
+ rc_ecmd |= data.flushTo0();
+ rc_ecmd |= data.setBit(0);
+ if (rc_ecmd)
+ {
+ FAPI_ERR("clear_tod_node: Error 0x%08X in ecmdDataBuffer setup for TOD_TX_TTYPE_5_REG_00040016 SCOM.", rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ rc = fapiPutScom(*target, TOD_TX_TTYPE_5_REG_00040016, data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("clear_tod_node: Could not write TOD_TX_TTYPE_5_REG_00040016");
+ break;
+ }
+ }
+ else
+ {
+ FAPI_INF("clear_tod_node: Normal IPL: Bypass TTYPE#5");
+ }
+
// TOD is cleared for this node; if it has children, start clearing their registers
for (std::list<tod_topology_node*>::iterator child = (i_tod_node->i_children).begin();
child != (i_tod_node->i_children).end();
++child)
{
tod_topology_node* tod_node = *child;
- rc = clear_tod_node(tod_node,i_tod_sel);
+ rc = clear_tod_node(tod_node,i_tod_sel,i_is_mpipl);
if (!rc.ok())
{
FAPI_ERR("clear_tod_node: Failure clearing downstream TOD node!");
diff --git a/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.H b/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.H
index 593936fca..ee553ab1d 100644
--- a/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.H
+++ b/src/usr/hwpf/hwp/tod_init/proc_tod_setup/proc_tod_setup.H
@@ -22,7 +22,7 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: proc_tod_setup.H,v 1.8 2014/05/27 16:31:03 jklazyns Exp $
+// $Id: proc_tod_setup.H,v 1.9 2014/10/22 17:11:13 jklazyns Exp $
//------------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2012
// *! All Rights Reserved -- Property of IBM
@@ -107,12 +107,15 @@ fapi::ReturnCode configure_tod_node(tod_topology_node* i_tod_node,
*
* @param[in] i_tod_node Reference to TOD topology (FAPI targets included within)
* i_tod_sel Specifies the topology to clear
+ * i_is_mpipl if this IPL is an MPIPL, additional setup is needed;
+ * determined via an attribute
*
* @return FAPI_RC_SUCCESS if TOD topology is successfully cleared
* else FAPI or ECMD error is sent through
*/
-fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
- const proc_tod_setup_tod_sel i_tod_sel);
+fapi::ReturnCode clear_tod_node(tod_topology_node* i_tod_node,
+ const proc_tod_setup_tod_sel i_tod_sel,
+ const fapi::ATTR_IS_MPIPL_Type i_is_mpipl);
/**
* @brief Calculates TOD_CHIP_CTRL_REG_00040010 value; will be called
OpenPOWER on IntegriCloud