summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2015-03-25 11:03:28 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-04-13 12:24:40 -0500
commit2fbacf08527ec4f6cd954103ba334b368dc3859a (patch)
treeca238f294c29c89cf323e66d239a44ac8cf72fa1 /src
parent72880e579b4cca99df8877c80ba078c82acd79ca (diff)
downloadtalos-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')
-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