summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2013-10-02 16:17:18 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-10-09 21:32:42 -0500
commit9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a (patch)
tree892615d6d97072e37cd2cafe30dee8c360dfb8ae /src
parenta4e6f46e545a6a8071975a827af1a442454963dd (diff)
downloadblackbird-hostboot-9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a.tar.gz
blackbird-hostboot-9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a.zip
PRD: Fixed MBA SCOM error during step 11
Change-Id: I98a69a5e9e6abf29e46439ce833274ad2ece3310 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6451 Tested-by: Jenkins Server Reviewed-by: Christopher T. Phan <cphan@us.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6587
Diffstat (limited to 'src')
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C86
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H13
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C10
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C25
4 files changed, 108 insertions, 26 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
index 371ea99a7..caf5e6aeb 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C
@@ -37,9 +37,10 @@
#include <UtilHash.H>
// Pegasus includes
-#include <prdfCenMbaDataBundle.H>
-#include <prdfCenMarkstore.H>
#include <prdfCenDqBitmap.H>
+#include <prdfCenMarkstore.H>
+#include <prdfCenMbaDataBundle.H>
+#include <prdfCenMembufDataBundle.H>
using namespace TARGETING;
@@ -53,6 +54,87 @@ namespace CenMbaCaptureData
//------------------------------------------------------------------------------
+void addMbaFirRegs( ExtensibleChip * i_membChip, CaptureData & io_cd )
+{
+ #define PRDF_FUNC "[CenMbaCaptureData::addMbaFirRegs] "
+
+ int32_t l_rc = SUCCESS;
+
+ do
+ {
+ if ( NULL == i_membChip )
+ {
+ PRDF_ERR( PRDF_FUNC"Given target is NULL" );
+ break;
+ }
+
+ if ( TYPE_MEMBUF != getTargetType(i_membChip->GetChipHandle()) )
+ {
+ PRDF_ERR( PRDF_FUNC"Invalid target type: i_membChip=0x%08x",
+ i_membChip->GetId() );
+ break;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * cs_reg, * re_reg, * firmsk_reg;
+ cs_reg = i_membChip->getRegister("MEM_CHIPLET_CS_FIR");
+ re_reg = i_membChip->getRegister("MEM_CHIPLET_RE_FIR");
+ firmsk_reg = i_membChip->getRegister("MEM_CHIPLET_FIR_MASK");
+
+ SCAN_COMM_REGISTER_CLASS * spa_reg, * spamsk_reg;
+ spa_reg = i_membChip->getRegister("MEM_CHIPLET_SPA");
+ spamsk_reg = i_membChip->getRegister("MEM_CHIPLET_SPA_MASK");
+
+ l_rc = cs_reg->Read() | re_reg->Read() | firmsk_reg->Read();
+ l_rc |= spa_reg->Read() | spamsk_reg->Read();
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC"Failed to read a MEM_CHIPLET register on "
+ "0x%08x", i_membChip->GetId() );
+ break;
+ }
+
+ uint16_t cs_tmp = cs_reg->GetBitFieldJustified(0,16);
+ uint16_t re_tmp = re_reg->GetBitFieldJustified(0,16) >> 2;
+ uint16_t msk_tmp = firmsk_reg->GetBitFieldJustified(0,16);
+
+ uint16_t csre_attns = (cs_tmp | re_tmp) & ~msk_tmp;
+
+ uint16_t spa_attns = spa_reg->GetBitFieldJustified(0,16) &
+ ~spamsk_reg->GetBitFieldJustified(0,16);
+
+ uint16_t mba_csre_msk[] = { 0x0648, // bits 5, 6, 9, 12
+ 0x01a4 }; // bits 7, 8, 10, 13
+ uint16_t mba_spa_msk[] = { 0x8000, // bit 0
+ 0x4000 }; // bit 1
+
+ CenMembufDataBundle * membdb = getMembufDataBundle( i_membChip );
+
+ for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ )
+ {
+ if ( (0 != (csre_attns & mba_csre_msk[i])) ||
+ (0 != (spa_attns & mba_spa_msk[i] )) )
+ {
+ ExtensibleChip * mbaChip = membdb->getMbaChip(i);
+ if ( NULL == mbaChip )
+ {
+ PRDF_ERR( PRDF_FUNC"MEM_CHIPLET registers indicated an "
+ "attention but no chip found: i_membChip=0x%08x "
+ "i=%d", i_membChip->GetId(), i );
+ continue;
+ }
+
+ mbaChip->CaptureErrorData(io_cd, Util::hashString("FirRegs") );
+ mbaChip->CaptureErrorData(io_cd, Util::hashString("CerrRegs"));
+ }
+ }
+
+ } while (0);
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
void addMemEccData( TargetHandle_t i_mbaTrgt, errlHndl_t io_errl )
{
CaptureData cd;
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
index bc0cdb1a4..4185dc2f3 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H
@@ -43,6 +43,19 @@ namespace CenMbaCaptureData
{
/**
+ * @brief Adds all MBA FirRegs and CerrRegs to the capture data for any MBA
+ * reporting an active attention via the MEM_CHIPLET_FIRs.
+ * @note This is only intended to be called in the MCS or MEMBUF PreAnalysis()
+ * plugins to capture the required FIR registers for FFDC.
+ * @note We are required to do the active attention check because there is a
+ * small window during the IPL where we may get an MCS or MEMBUF
+ * attention and the MBAs are not SCOMable at the time.
+ * @param i_membChip A MEMBUF chip.
+ * @param io_cd Capture data struct.
+ */
+void addMbaFirRegs( ExtensibleChip * i_membChip, CaptureData & io_cd );
+
+/**
* @brief Adds Memory ECC FFDC to an error log.
* @note This is intended to be used in non-normal analysis paths that do not
* have an SDC (i.e. Restore DRAM Repairs, IPL MNFG CE Isolation).
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
index 1b1373168..f0f0c9835 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
@@ -220,15 +220,7 @@ int32_t PreAnalysis( ExtensibleChip * i_mbChip, STEP_CODE_DATA_STRUCT & i_sc,
mcsChip->CaptureErrorData( cd, Util::hashString("FirRegs") );
mcsChip->CaptureErrorData( cd, Util::hashString("CerrRegs") );
- for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ )
- {
- ExtensibleChip * mbaChip = mbdb->getMbaChip(i);
- if ( NULL != mbaChip )
- {
- mbaChip->CaptureErrorData( cd, Util::hashString("FirRegs") );
- mbaChip->CaptureErrorData( cd, Util::hashString("CerrRegs") );
- }
- }
+ CenMbaCaptureData::addMbaFirRegs( i_mbChip, cd );
}
// Check for a Centaur Checkstop
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C
index 5a3747b94..02af45f66 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C
@@ -25,15 +25,19 @@
* @brief Contains all the plugin code for the PRD P8 MCS
*/
+// Framework includes
#include <iipServiceDataCollector.h>
+#include <iipSystem.h>
#include <prdfExtensibleChip.H>
+#include <prdfGlobal.H>
#include <prdfPluginMap.H>
#include <UtilHash.H>
-#include <prdfGlobal.H>
-#include <iipSystem.h>
-#include <prdfP8McsDataBundle.H>
+
+// Pegasus includes
+#include <prdfCenMbaCaptureData.H>
#include <prdfCenMembufDataBundle.H>
#include <prdfLaneRepair.H>
+#include <prdfP8McsDataBundle.H>
//##############################################################################
//
@@ -108,8 +112,8 @@ int32_t CheckCentaurCheckstop( ExtensibleChip * i_mcsChip,
* @param o_analyzed TRUE if analysis has been done on this chip
* @return failure or success
*/
-int32_t PreAnalysis ( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc,
- bool & o_analyzed )
+int32_t PreAnalysis( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc,
+ bool & o_analyzed )
{
o_analyzed = false;
@@ -122,16 +126,7 @@ int32_t PreAnalysis ( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc,
membChip->CaptureErrorData( cd, Util::hashString("FirRegs") );
membChip->CaptureErrorData( cd, Util::hashString("CerrRegs") );
- CenMembufDataBundle * mbdb = getMembufDataBundle( membChip );
- for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ )
- {
- ExtensibleChip * mbaChip = mbdb->getMbaChip(i);
- if ( NULL != mbaChip )
- {
- mbaChip->CaptureErrorData( cd, Util::hashString("FirRegs") );
- mbaChip->CaptureErrorData( cd, Util::hashString("CerrRegs") );
- }
- }
+ CenMbaCaptureData::addMbaFirRegs( membChip, cd );
}
// Check for a Centaur Checkstop
OpenPOWER on IntegriCloud