summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup
diff options
context:
space:
mode:
authorThi Tran <thi@us.ibm.com>2013-01-22 16:08:50 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-01-24 13:09:29 -0600
commitaa4c3a92aa1e17358c0ebbcc818f3b3aa9753a90 (patch)
treed32659bfbc1a49c894b23bf2b9628130d7b51509 /src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup
parentd8360fb69e6f8993e8be2f6899a20c61bbedbb03 (diff)
downloadtalos-hostboot-aa4c3a92aa1e17358c0ebbcc818f3b3aa9753a90.tar.gz
talos-hostboot-aa4c3a92aa1e17358c0ebbcc818f3b3aa9753a90.zip
PON - Proc HW procedure update
Change-Id: I7168e7b02d9c7795ad16b76027e8a46edf24b161 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2984 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup')
-rw-r--r--src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.C129
-rw-r--r--src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H8
2 files changed, 103 insertions, 34 deletions
diff --git a/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.C b/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.C
index 88ed00f97..a981d8c5a 100644
--- a/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.C
+++ b/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012 */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
/* */
/* p1 */
/* */
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: proc_revert_sbe_mcs_setup.C,v 1.5 2012/11/16 04:48:35 jmcgill Exp $
+// $Id: proc_revert_sbe_mcs_setup.C,v 1.6 2013/01/20 15:55:42 jmcgill Exp $
// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_revert_sbe_mcs_setup.C,v $
//------------------------------------------------------------------------------
// *|
@@ -51,14 +51,32 @@ extern "C"
//------------------------------------------------------------------------------
+// function: translate base SCOM address to chiplet specific offset
+// parameters: i_input_addr => input SCOM address
+// i_mcs_unit_num => chip unit number
+// returns: translated SCOM address
+//------------------------------------------------------------------------------
+uint64_t proc_revert_sbe_mcs_setup_xlate_address(
+ const uint64_t i_input_addr,
+ const uint8_t i_mcs_unit_num)
+{
+ return(i_input_addr +
+ (0x400 * (i_mcs_unit_num / 4)) +
+ (0x80 * (i_mcs_unit_num % 4)));
+}
+
+
+//------------------------------------------------------------------------------
// function: reset MCFGP BAR valid bit, base address and size fields to restore
// register flush state
-// parameters: i_target => MCS chiplet target
+// parameters: i_target => chip target
+// i_mcs_unit_num => chip unit number
// returns: FAPI_RC_SUCCESS if register write is successful,
// else failing return code
//------------------------------------------------------------------------------
fapi::ReturnCode proc_revert_sbe_mcs_setup_reset_mcfgp(
- const fapi::Target& i_target)
+ const fapi::Target& i_target,
+ const uint8_t i_mcs_unit_num)
{
fapi::ReturnCode rc;
uint32_t rc_ecmd = 0x0;
@@ -100,13 +118,17 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup_reset_mcfgp(
}
// write register
- rc = fapiPutScomUnderMask(i_target,
- MCS_MCFGP_0x02011800,
- mcfgp_data,
- mcfgp_mask);
+ rc = fapiPutScomUnderMask(
+ i_target,
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCFGP_0x02011800,
+ i_mcs_unit_num),
+ mcfgp_data,
+ mcfgp_mask);
if (!rc.ok())
{
- FAPI_ERR("proc_revert_sbe_mcs_setup_reset_mcfgp: fapiPutScomUnderMask error (MCS_MCFGP_0x02011800)");
+ FAPI_ERR("proc_revert_sbe_mcs_setup_reset_mcfgp: fapiPutScomUnderMask error (MCS_MCFGP_0x%08llX)",
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCFGP_0x02011800,
+ i_mcs_unit_num));
break;
}
} while(0);
@@ -120,12 +142,14 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup_reset_mcfgp(
//------------------------------------------------------------------------------
// function: set MCI FIR Mask channel timeout bit, to restore register flush
// state
-// parameters: i_target => MCS chiplet target
+// parameters: i_target => chip target
+// i_mcs_unit_num => chip unit number
// returns: FAPI_RC_SUCCESS if register write is successful,
// else failing return code
//------------------------------------------------------------------------------
fapi::ReturnCode proc_revert_sbe_mcs_setup_reset_mcifirmask(
- const fapi::Target& i_target)
+ const fapi::Target& i_target,
+ const uint8_t i_mcs_unit_num)
{
fapi::ReturnCode rc;
uint32_t rc_ecmd = 0x0;
@@ -150,12 +174,16 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup_reset_mcifirmask(
}
// write register
- rc = fapiPutScom(i_target,
- MCS_MCIFIRMASK_OR_0x02011845,
- mcifirmask_or_data);
+ rc = fapiPutScom(
+ i_target,
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCIFIRMASK_OR_0x02011845,
+ i_mcs_unit_num),
+ mcifirmask_or_data);
if (!rc.ok())
{
- FAPI_ERR("proc_revert_sbe_mcs_setup_reset_mcifirmask: fapiPutScom error (MCS_MCIFIRMASK_OR_0x02011845)");
+ FAPI_ERR("proc_revert_sbe_mcs_setup_reset_mcifirmask: fapiPutScom error (MCS_MCIFIRMASK_OR_0x%08llX)",
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCIFIRMASK_OR_0x02011845,
+ i_mcs_unit_num));
break;
}
} while(0);
@@ -174,7 +202,10 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup(
const fapi::Target& i_target)
{
fapi::ReturnCode rc;
+ ecmdDataBufferBase gp0_data(64);
ecmdDataBufferBase mcsmode1_reset_data(64);
+ bool mc_fenced[2] = { true, true };
+ uint8_t mcs_unit_id = 0x0;
// vector to hold MCS chiplet targets
std::vector<fapi::Target> mcs_chiplets;
@@ -184,12 +215,24 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup(
do
{
- // loop over all functional MCS chiplets, revert SBE configuration
+ // read GP0 to determine MCL/MCR partial good state
+ rc = fapiGetScom(i_target, NEST_GP0_0x02000000, gp0_data);
+
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_revert_sbe_mcs_setup: fapiGetScom error (NEST_GP0_0x02000000)");
+ break;
+ }
+
+ mc_fenced[0] = gp0_data.isBitClear(NEST_GP0_MCL_FENCE_B_BIT);
+ mc_fenced[1] = gp0_data.isBitClear(NEST_GP0_MCR_FENCE_B_BIT);
+
+ // loop over all present MCS chiplets, revert SBE configuration
// of BAR/FIR mask registers back to flush state
rc = fapiGetChildChiplets(i_target,
fapi::TARGET_TYPE_MCS_CHIPLET,
mcs_chiplets,
- fapi::TARGET_STATE_FUNCTIONAL);
+ fapi::TARGET_STATE_PRESENT);
if (!rc.ok())
{
FAPI_ERR("proc_revert_sbe_mcs_setup: Error from fapiGetChildChiplets");
@@ -200,28 +243,50 @@ fapi::ReturnCode proc_revert_sbe_mcs_setup(
i != mcs_chiplets.end();
i++)
{
- rc = proc_revert_sbe_mcs_setup_reset_mcfgp(*i);
- if (!rc.ok())
- {
- FAPI_ERR("proc_revert_sbe_mcs_setup: Error from proc_revert_sbe_mcs_setup_reset_mcfgp");
- break;
- }
+ // read chip unit number
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &(*i),
+ mcs_unit_id);
- FAPI_DBG("proc_revert_sbe_mcs_setup: reset MCSMODE1");
- rc = fapiPutScom(*i,
- MCS_MCSMODE1_0x02011808,
- mcsmode1_reset_data);
if (!rc.ok())
{
- FAPI_ERR("proc_revert_sbe_mcs_setup: fapiPutScom error (MCS_MCSMODE1_0x02011808)");
+ FAPI_ERR("proc_revert_sbe_mcs_setup: Error from FAPI_ATTR_GET (ATTR_CHIP_UNIT_POS)");
break;
}
- rc = proc_revert_sbe_mcs_setup_reset_mcifirmask(*i);
- if (!rc.ok())
+ // reset all chiplets which are present (based on GP0 partial good data)
+ // this handles the case of reverting configuration which was written
+ // by SBE code for chiplets which are not considered functional by platform
+ if (!mc_fenced[mcs_unit_id / 4])
{
- FAPI_ERR("proc_revert_sbe_mcs_setup: Error from proc_revert_sbe_mcs_setup_reset_mcfgp");
- break;
+ rc = proc_revert_sbe_mcs_setup_reset_mcfgp(i_target,
+ mcs_unit_id);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_revert_sbe_mcs_setup: Error from proc_revert_sbe_mcs_setup_reset_mcfgp");
+ break;
+ }
+
+ FAPI_DBG("proc_revert_sbe_mcs_setup: reset MCSMODE1");
+ rc = fapiPutScom(
+ i_target,
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCSMODE1_0x02011808,
+ mcs_unit_id),
+ mcsmode1_reset_data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_revert_sbe_mcs_setup: fapiPutScom error (MCS_MCSMODE1_0x%08llX)",
+ proc_revert_sbe_mcs_setup_xlate_address(MCS_MCSMODE1_0x02011808, mcs_unit_id));
+ break;
+ }
+
+ rc = proc_revert_sbe_mcs_setup_reset_mcifirmask(i_target,
+ mcs_unit_id);
+ if (!rc.ok())
+ {
+ FAPI_ERR("proc_revert_sbe_mcs_setup: Error from proc_revert_sbe_mcs_setup_reset_mcfgp");
+ break;
+ }
}
}
} while(0);
diff --git a/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H b/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H
index f52ed6400..90719e5ba 100644
--- a/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H
+++ b/src/usr/hwpf/hwp/slave_sbe/proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012 */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
/* */
/* p1 */
/* */
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: proc_revert_sbe_mcs_setup.H,v 1.2 2012/07/23 14:16:07 jmcgill Exp $
+// $Id: proc_revert_sbe_mcs_setup.H,v 1.3 2013/01/20 15:55:45 jmcgill Exp $
// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_revert_sbe_mcs_setup.H,v $
//------------------------------------------------------------------------------
// *|
@@ -56,6 +56,10 @@
// Constant definitions
//------------------------------------------------------------------------------
+// Nest GP0 register constants
+const uint32_t NEST_GP0_MCL_FENCE_B_BIT = 51;
+const uint32_t NEST_GP0_MCR_FENCE_B_BIT = 52;
+
// MCFGP register constants
const uint32_t MCFGP_VALID_BIT = 0;
const uint32_t MCFGP_UNITS_PER_GROUP_START_BIT = 1;
OpenPOWER on IntegriCloud