summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2015-07-07 08:46:07 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-07-13 14:47:44 -0500
commita7887a2542003ac1a37cece591f7cd83c59a58e1 (patch)
tree57055cc476b2cea29927efb02881213f50a127ec /src/usr/diag/prdf/common
parentf4f2b24186bf0c22aa02fcfc5bb036446dac0e0d (diff)
downloadblackbird-hostboot-a7887a2542003ac1a37cece591f7cd83c59a58e1.tar.gz
blackbird-hostboot-a7887a2542003ac1a37cece591f7cd83c59a58e1.zip
PRD: Check RCD parity error instead of side-effects
Change-Id: I182294a6b7426ddf193fce0fee2d2633862d7d3d CQ: SW312850 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/18967 Tested-by: Jenkins Server Reviewed-by: BENJAMIN J. WEISENBECK <bweisenb@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/19067
Diffstat (limited to 'src/usr/diag/prdf/common')
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Mba.rule23
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule8
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C77
3 files changed, 98 insertions, 10 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
index 84b292818..3666142aa 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
+++ b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule
@@ -418,37 +418,39 @@ rule tmpMbaDdrPhyFir
group gMBA attntype CHECK_STOP, RECOVERABLE, UNIT_CS filter singlebit
{
- (tmpMbaFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+ # MbaCalFir analyzed first to check for RCD parity error before potential
+ # side effects in MbaFir
+ (tmpMbaCalFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
10|11|12|13|14|15|16|17|18|19|
20|21|22|23|24|25|26|27|28|29|
30|31|32|33|34|35|36|37|38|39|
40|41|42|43|44|45|46|47|48|49|
50|51|52|53|54|55|56|57|58|59|
- 60|61|62|63 )) ? analyze(gMbaFir);
+ 60|61|62|63 )) ? analyze(gMbaCalFir);
- (tmpMbaSecureFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+ (tmpMbaFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
10|11|12|13|14|15|16|17|18|19|
20|21|22|23|24|25|26|27|28|29|
30|31|32|33|34|35|36|37|38|39|
40|41|42|43|44|45|46|47|48|49|
50|51|52|53|54|55|56|57|58|59|
- 60|61|62|63 )) ? analyze(gMbaSecureFir);
+ 60|61|62|63 )) ? analyze(gMbaFir);
- (tmpMbaDdrPhyFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+ (tmpMbaSecureFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
10|11|12|13|14|15|16|17|18|19|
20|21|22|23|24|25|26|27|28|29|
30|31|32|33|34|35|36|37|38|39|
40|41|42|43|44|45|46|47|48|49|
50|51|52|53|54|55|56|57|58|59|
- 60|61|62|63 )) ? analyze(gMbaDdrPhyFir);
+ 60|61|62|63 )) ? analyze(gMbaSecureFir);
- (tmpMbaCalFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
+ (tmpMbaDdrPhyFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
10|11|12|13|14|15|16|17|18|19|
20|21|22|23|24|25|26|27|28|29|
30|31|32|33|34|35|36|37|38|39|
40|41|42|43|44|45|46|47|48|49|
50|51|52|53|54|55|56|57|58|59|
- 60|61|62|63 )) ? analyze(gMbaCalFir);
+ 60|61|62|63 )) ? analyze(gMbaDdrPhyFir);
};
################################################################################
@@ -663,7 +665,10 @@ rule MbaCalFir
RECOVERABLE: MBACALFIR & ~MBACALFIR_MASK & ~MBACALFIR_ACT0 & MBACALFIR_ACT1;
};
-group gMbaCalFir filter singlebit, secondarybits( 10, 14, 19, 20, 21, 24, 25 )
+# bits 4 and 7 given priority to check for RCD parity error before potential
+# side effects in bits 2 and 17
+group gMbaCalFir filter priority( 4, 7 ),
+ secondarybits( 10, 14, 19, 20, 21, 24, 25 )
{
/** MBACALFIR[0]
* MBACALFIRQ_MBA_RECOVERABLE_ERROR
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule b/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule
index 2ce8efa93..3e42220e3 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule
+++ b/src/usr/diag/prdf/common/plat/pegasus/Membuf_acts_NEST.rule
@@ -594,7 +594,7 @@ group gMbsFir filter singlebit, secondarybits( 3, 9, 12, 26, 29, 33, 34 )
/** MBSFIR[4]
* MBS_FIR_REG_INTERNAL_TIMEOUT
*/
- (MbsFir, bit(4)) ? SelfMedThr1;
+ (MbsFir, bit(4)) ? internalTimeout;
/** MBSFIR[3,4]
* MBS_FIR_REG_EXTERNAL_TIMEOUT
@@ -1270,6 +1270,12 @@ actionclass replayTimeOutError
try( funccall("handleMcsChnlCs"), clearSecMbsBitsCalloutDmiBusTh1UE );
};
+/** Handles MBACAL parity err if present, else handles MBS Internal Timeout */
+actionclass internalTimeout
+{
+ try( funccall("handleMbaCalParityErr"), SelfMedThr1);
+};
+
/** Clear MBS SecondaryBits and calloutDmiBusTh1UE */
actionclass clearSecMbsBitsCalloutDmiBusTh1UE
{
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
index 5a51c225d..3e1ede9ac 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
@@ -1172,6 +1172,83 @@ int32_t handleMcsChnlCs( ExtensibleChip * i_membChip,
//------------------------------------------------------------------------------
/**
+ * @brief Handles MBACALFIR RCD Parity error bits, if they exist.
+ *
+ * @param i_membChip The Centaur chip.
+ * @param i_sc ServiceDataCollector.
+ *
+ * @return SUCCESS if MBACALFIR Parity error is present and properly
+ * handled, FAIL otherwise.
+ */
+int32_t handleMbaCalParityErr( ExtensibleChip * i_membChip,
+ STEP_CODE_DATA_STRUCT & i_sc )
+{
+ #define PRDF_FUNC "[handleMbaCalParityErr] "
+
+ // We will return FAIL from this function if MBACALFIR parity error bits are
+ // not set. If MBACALFIR parity error bits are set, we will try to analyze
+ // the MBACALFIR. If MBACALFIR is not analyzed properly, we will return
+ // FAIL. This will trigger rule code to execute alternate resolution.
+
+ int32_t l_rc;
+
+ CenMembufDataBundle * mbdb = getMembufDataBundle( i_membChip );
+
+ // We will loop through to check all MBA if necessary until one is found
+ // with parity error bits set
+ for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++)
+ {
+ l_rc = SUCCESS;
+
+ ExtensibleChip * mbaChip = mbdb->getMbaChip(i);
+ if ( NULL == mbaChip )
+ {
+ l_rc = FAIL;
+ continue;
+ }
+
+ SCAN_COMM_REGISTER_CLASS * mbaCalFir =
+ mbaChip->getRegister("MBACALFIR");
+ SCAN_COMM_REGISTER_CLASS * mbaCalMask =
+ mbaChip->getRegister("MBACALFIR_MASK");
+
+ l_rc = mbaCalFir->Read();
+ l_rc |= mbaCalMask->Read();
+
+ if ( SUCCESS != l_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "MBACALFIR/MBACALFIR_MASK read failed for"
+ "0x%08x", mbaChip->GetId());
+ continue;
+ }
+
+ // If any of the MBACALFIR parity error bits are set, we will
+ // analyze the MBA.
+ // bits 4 and 7 are parity error bits
+ bool bit4 = mbaCalFir->IsBitSet(4);
+ bool mask4 = mbaCalMask->IsBitSet(4);
+
+ bool bit7 = mbaCalFir->IsBitSet(7);
+ bool mask7 = mbaCalMask->IsBitSet(7);
+
+ if ( ( bit4 && !mask4 ) || ( bit7 && !mask7 ) )
+ {
+ l_rc = mbaChip->Analyze( i_sc,
+ i_sc.service_data->getSecondaryAttnType() );
+ if ( SUCCESS == l_rc ) break;
+ }
+
+ l_rc = FAIL;
+ }
+
+ return l_rc;
+ #undef PRDF_FUNC
+
+} PRDF_PLUGIN_DEFINE( Membuf, handleMbaCalParityErr );
+
+//------------------------------------------------------------------------------
+
+/**
* @brief When not in MNFG mode, clear the service call flag so that
* thresholding will still be done, but no visible error log committed.
* @param i_chip Centaur chip
OpenPOWER on IntegriCloud