diff options
author | Thi Tran <thi@us.ibm.com> | 2014-10-24 07:50:34 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-10-31 10:54:11 -0500 |
commit | 9d72dd315b1a1633cb2992afaed6d9f55e9e4274 (patch) | |
tree | e34d41e12e23cd6f1985e4aea1f5cbf33396ea10 /src/usr/hwpf/hwp/tod_init | |
parent | 420044aa017b534e92e3043d6bda85eeff3c7a59 (diff) | |
download | talos-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')
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 |