summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/attn/common/attnprd.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/attn/common/attnprd.C')
-rw-r--r--src/usr/diag/attn/common/attnprd.C54
1 files changed, 51 insertions, 3 deletions
diff --git a/src/usr/diag/attn/common/attnprd.C b/src/usr/diag/attn/common/attnprd.C
index 1111c14ed..cf0019b03 100644
--- a/src/usr/diag/attn/common/attnprd.C
+++ b/src/usr/diag/attn/common/attnprd.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2014,2015 */
+/* Contributors Listed Below - COPYRIGHT 2014,2016 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -96,8 +96,56 @@ errlHndl_t PrdImpl::callPrd(const AttentionList & i_attentions)
#endif
{
err = PRDF::main(attnList.front().attnType, attnList);
- }
- }
+
+ // For the initial NIMBUS chip, there is a HW issue
+ // which requires us to clear the "Combined Global
+ // interrupt register" on recoverable errors.
+ // This also affects Checkstop/Special Attns, but
+ // the FSP handles those and already clears the reg.
+ // The issue does not apply to host/unit cs attns.
+ uint8_t l_ecLevel = 0;
+ AttnList::iterator l_attnIter = attnList.begin();
+
+ // Shouldn't be mixing NIMBUS with CUMULUS,etc...
+ // so probably don't need to repeat this call per chip.
+ bool l_isNimbus = ( (*l_attnIter).targetHndl->
+ getAttr<ATTR_MODEL>() == MODEL_NIMBUS );
+
+ // Iterate thru all chips in case PRD handled
+ // a chip other than the first one.
+ while(l_attnIter != attnList.end())
+ {
+ l_ecLevel = (*l_attnIter).targetHndl->getAttr<ATTR_EC>();
+
+
+ if ( (RECOVERABLE == (*l_attnIter).attnType) &&
+ (true == l_isNimbus) && (l_ecLevel < 0x11)
+ )
+ {
+ errlHndl_t l_scomErr = NULL;
+ uint64_t l_clrAllBits = 0;
+
+ l_scomErr = putScom( (*l_attnIter).targetHndl,
+ PIB_INTR_TYPE_REG,
+ l_clrAllBits
+ );
+
+ if (NULL != l_scomErr)
+ {
+ ATTN_ERR("Clear PibIntrReg failed, HUID:0X%08X",
+ get_huid( (*l_attnIter).targetHndl) );
+ errlCommit(l_scomErr, ATTN_COMP_ID);
+ } // failed to clear PIB intr reg
+
+ } // if recoverable attn
+
+ ++l_attnIter;
+
+ } // end while looping thru attn list
+
+ } // end else NOT checkstop
+
+ } // if attn list is not empty
return err;
}
OpenPOWER on IntegriCloud