diff options
Diffstat (limited to 'src/usr/diag/attn/common/attnprd.C')
-rw-r--r-- | src/usr/diag/attn/common/attnprd.C | 54 |
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; } |