diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2015-03-25 11:03:28 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-04-13 12:24:40 -0500 |
commit | 2fbacf08527ec4f6cd954103ba334b368dc3859a (patch) | |
tree | ca238f294c29c89cf323e66d239a44ac8cf72fa1 /src/usr/diag | |
parent | 72880e579b4cca99df8877c80ba078c82acd79ca (diff) | |
download | talos-hostboot-2fbacf08527ec4f6cd954103ba334b368dc3859a.tar.gz talos-hostboot-2fbacf08527ec4f6cd954103ba334b368dc3859a.zip |
PRD: RE filter issues for CS attns
Change-Id: Ie0665b7d59155c486e4d3fa5a5a3baac674000de
CQ: SW297998
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16629
Tested-by: Jenkins Server
Reviewed-by: BENJAMIN J. WEISENBECK <bweisenb@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Squashed: I1d32ed0a76407198ddad6d1ff22f5a28de13c924
Squashed: Idde678204d7e76376283367b1e979f765694f51e
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17026
Diffstat (limited to 'src/usr/diag')
3 files changed, 54 insertions, 18 deletions
diff --git a/src/usr/diag/prdf/common/framework/register/prdfErrorRegister.C b/src/usr/diag/prdf/common/framework/register/prdfErrorRegister.C index 848d3f56d..be4e8195e 100755 --- a/src/usr/diag/prdf/common/framework/register/prdfErrorRegister.C +++ b/src/usr/diag/prdf/common/framework/register/prdfErrorRegister.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -126,12 +126,12 @@ ErrorRegister::ErrorRegister( SCAN_COMM_REGISTER_CLASS & r, ResolutionMap & rm, /*---------------------------------------------------------------------*/ -int32_t ErrorRegister::Analyze(STEP_CODE_DATA_STRUCT & error) +int32_t ErrorRegister::Analyze( STEP_CODE_DATA_STRUCT & io_sdc ) { int32_t rc = SUCCESS; uint32_t l_savedErrSig = 0; - ErrorSignature * esig = error.service_data->GetErrorSignature(); + ErrorSignature * esig = io_sdc.service_data->GetErrorSignature(); if(xScrId == 0x0fff) { @@ -144,21 +144,50 @@ int32_t ErrorRegister::Analyze(STEP_CODE_DATA_STRUCT & error) // Get Data from hardware const BIT_STRING_CLASS &bs = - Read( error.service_data->GetCauseAttentionType() ); + Read( io_sdc.service_data->GetCauseAttentionType() ); BitKey bl; // null bit list has length 0 if ( scr_rc == SUCCESS ) { bl = Filter( bs ); - rc = SetErrorSignature( error,bl ); + rc = SetErrorSignature( io_sdc, bl ); // Save signature to determine if it changes during resolution // execution. l_savedErrSig = esig->getSigId(); } - uint32_t res_rc = Lookup(error, bl); // lookup and execute the resolutions - if(SUCCESS == rc) rc = res_rc; // previous rc has prioity over res_rc + // This loop will iterate through all bits in the bit list until an active + // attention is found. This is useful in the cases where a global or chiplet + // level FIR has multiple bits set, but the associated local FIRs may not + // have an active attention because of a filter or hardware bug. + uint32_t res_rc = SUCCESS; + BitKey analyzed_bl; // Keep track of bits that have been analyzed. + BitKey remaining_bl = bl; // Keep track of bits that need to be analyzed. + do + { + BitKey res_bl = remaining_bl; + BitKey tmp_bl = remaining_bl; + + // lookup and execute the resolutions + res_rc = Lookup( io_sdc, res_bl ); + + // Add the resolved bits to the analyzed list. + // TODO: RTC 126267 Should modify BitKey to have a more efficient way of + // adding bits to a list. + for ( uint32_t i = 0; i < res_bl.size(); i++ ) + analyzed_bl.setBit(res_bl.getListValue(i)); + + // Remove the resolved bits from the remaining list. + remaining_bl.removeBits(res_bl); + + // Make sure forward progress is made. + if ( tmp_bl == remaining_bl ) break; + + } while ( (PRD_SCAN_COMM_REGISTER_ZERO == res_rc) && + (0 != remaining_bl.size()) ); + + if ( SUCCESS == rc ) rc = res_rc; // previous rc has prioity over res_rc // If we had a DD02 and the signature changes, ignore DD02. if ( rc == PRD_SCAN_COMM_REGISTER_ZERO ) @@ -173,7 +202,7 @@ int32_t ErrorRegister::Analyze(STEP_CODE_DATA_STRUCT & error) if( scr_rc == SUCCESS ) { - FilterUndo( bl ); + FilterUndo( analyzed_bl ); // NOTE: This is an unusual work-a-round for NOT clearing // particular FIR bits in a register because they are cleared // in another part of the plugin code. @@ -185,7 +214,7 @@ int32_t ErrorRegister::Analyze(STEP_CODE_DATA_STRUCT & error) else { int32_t reset_rc; - reset_rc = Reset(bl,error); + reset_rc = Reset( analyzed_bl, io_sdc ); if( rc == SUCCESS ) rc = reset_rc; } } diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfResolutionMap.C b/src/usr/diag/prdf/common/framework/resolution/prdfResolutionMap.C index 597fceb37..e78384d03 100755 --- a/src/usr/diag/prdf/common/framework/resolution/prdfResolutionMap.C +++ b/src/usr/diag/prdf/common/framework/resolution/prdfResolutionMap.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -306,7 +306,11 @@ int32_t ResolutionMap::LookUp( ResolutionList & o_list, // secondary pass. In secondary pass, bits set shall be identified and // associated resolution shall be executed. - if( !scd.service_data->isPrimaryPass() ) o_list.push_back( defaultRes ); + if ( !(scd.service_data->isPrimaryPass() && + scd.service_data->isSecondaryErrFound()) ) + { + o_list.push_back( defaultRes ); + } } if( iv_filter != NULL ) diff --git a/src/usr/diag/prdf/common/util/prdfFilters.C b/src/usr/diag/prdf/common/util/prdfFilters.C index b0b503b86..a62205fec 100755 --- a/src/usr/diag/prdf/common/util/prdfFilters.C +++ b/src/usr/diag/prdf/common/util/prdfFilters.C @@ -191,13 +191,16 @@ bool SecondaryBitsFilter::Apply( BitKey & io_bitList, bool l_modified = false; do { - // if it is not a primary pass then we need not apply this filter. - // so continuing with usual flow. - if( !( io_sdc.service_data )->isPrimaryPass( ) || - CHECK_STOP != io_sdc.service_data->GetAttentionType( ) ) - { - break; - } + // This filter should only be applied on the primary passs. + if ( !io_sdc.service_data->isPrimaryPass() ) break; + + // This filter should only be applied if the primary attention type is + // CHECK_STOP. + if ( CHECK_STOP != io_sdc.service_data->GetAttentionType() ) break; + + // This filter should only be applied if the the secondary attention + // type is RECOVERABLE. + if ( RECOVERABLE != io_sdc.service_data->GetCauseAttentionType()) break; //if there is no secondary bit position to flip or if no bit is set in //bit key then let us skip this apply. |