summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2017-03-21 10:02:57 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2017-03-24 18:00:31 -0400
commit27b904723a78d27dcf4b39030b9649e9519669ac (patch)
tree79f375622b83c84bef171b1701239ea9c32a9817 /src/usr
parent82c7782756df58c99a0979777250c5f0987980fa (diff)
downloadtalos-hostboot-27b904723a78d27dcf4b39030b9649e9519669ac.tar.gz
talos-hostboot-27b904723a78d27dcf4b39030b9649e9519669ac.zip
PRD: fixed TPS action in MNFG for memory CEs.
Change-Id: Ie72e5c8feafbcf8cb0ffb0316df2c1072e5fe5a8 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/38219 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/38413 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H3
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C24
2 files changed, 22 insertions, 5 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
index 18a9fa12f..0f21ff457 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
@@ -65,6 +65,9 @@ class MemCeTable
MNFG_TH_DRAM = 0x08, ///< MNFG DRAM threshold reached.
MNFG_TH_RANK = 0x10, ///< MNFG rank threshold reached.
MNFG_TH_DIMM = 0x20, ///< MNFG DIMM threshold reached.
+
+ FIELD_TH_ALL = ENTRY_TH_REACHED | RANK_TH_REACHED | TABLE_FULL,
+ MNFG_TH_ALL = MNFG_TH_DRAM | MNFG_TH_RANK | MNFG_TH_DIMM,
};
private: // constants, enums
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
index 7036888fe..a43f50131 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
@@ -257,6 +257,7 @@ uint32_t __analyzeFetchNceTce( ExtensibleChip * i_chip, const MemAddr & i_addr,
// Add data to the CE table.
D db = static_cast<D>(i_chip->getDataBundle());
uint32_t ceTableRc = db->iv_ceTable.addEntry( i_addr, i_symbol );
+ bool doTps = false;
// Check MNFG thresholds, if needed.
if ( mfgMode() )
@@ -265,16 +266,19 @@ uint32_t __analyzeFetchNceTce( ExtensibleChip * i_chip, const MemAddr & i_addr,
{
io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MnfgDramCte );
io_sc.service_data->setServiceCall();
+ doTps = true;
}
else if ( 0 != (MemCeTable<T>::MNFG_TH_RANK & ceTableRc) )
{
io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MnfgRankCte );
io_sc.service_data->setServiceCall();
+ doTps = true;
}
else if ( 0 != (MemCeTable<T>::MNFG_TH_DIMM & ceTableRc) )
{
io_sc.service_data->AddSignatureList( trgt, PRDFSIG_MnfgDimmCte );
io_sc.service_data->setServiceCall();
+ doTps = true;
}
else if ( 0 != (MemCeTable<T>::TABLE_FULL & ceTableRc) )
{
@@ -289,6 +293,7 @@ uint32_t __analyzeFetchNceTce( ExtensibleChip * i_chip, const MemAddr & i_addr,
io_sc.service_data->SetCallout( all_mm, MRU_MEDA );
io_sc.service_data->SetCallout( trgt, MRU_MEDA );
io_sc.service_data->setServiceCall();
+ doTps = true;
}
else if ( 0 != (MemCeTable<T>::ENTRY_TH_REACHED & ceTableRc) )
{
@@ -298,14 +303,23 @@ uint32_t __analyzeFetchNceTce( ExtensibleChip * i_chip, const MemAddr & i_addr,
// has been met. This is a potential flooding issue. So make
// the DIMM callout predictive.
io_sc.service_data->setServiceCall();
+ doTps = true;
}
}
-
- #ifdef __HOSTBOOT_RUNTIME
+ else // field thresholds
+ {
+ // It is possible that the MNFG thresholds are higher than the field
+ // thresholds because of the scaling due to DRAM side. Therefore, we
+ // cannot simply trigger TPS on any threshold. The field and MNFG
+ // thresholds must be handled separately.
+ doTps = ( 0 != (MemCeTable<T>::FIELD_TH_ALL & ceTableRc) );
+ }
// Initiate a TPS procedure, if needed.
- if ( MemCeTable<T>::NO_TH_REACHED != ceTableRc )
+ if ( doTps )
{
+ #ifdef __HOSTBOOT_RUNTIME
+
// If a MNFG threshold has been reached (predictive callout), we
// will still try to start TPS just in case MNFG disables the
// termination policy.
@@ -316,9 +330,9 @@ uint32_t __analyzeFetchNceTce( ExtensibleChip * i_chip, const MemAddr & i_addr,
PRDF_ERR( PRDF_FUNC "addTpsEvent(0x%08x, m%ds%d) failed",
i_chip->getHuid(), rank.getMaster(), rank.getSlave() );
}
- }
- #endif
+ #endif
+ }
return o_rc;
OpenPOWER on IntegriCloud