summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/register/prdfErrorRegister.C47
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/resolution/prdfResolutionMap.C8
-rwxr-xr-xsrc/usr/diag/prdf/common/util/prdfFilters.C17
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.
OpenPOWER on IntegriCloud