diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2017-03-21 10:02:57 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-03-24 18:00:31 -0400 |
commit | 27b904723a78d27dcf4b39030b9649e9519669ac (patch) | |
tree | 79f375622b83c84bef171b1701239ea9c32a9817 /src/usr | |
parent | 82c7782756df58c99a0979777250c5f0987980fa (diff) | |
download | talos-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.H | 3 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C | 24 |
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; |