summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2019-01-08 08:41:57 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2019-01-16 16:30:59 -0600
commitfba889a1a092467ff83e8540b399c6a7f0d3e748 (patch)
treeee77c1f571ecbb3db0376a440c13d09488273303 /src/usr/diag/prdf/common/plat
parente3ceaa63602bec06a5f4f1a7744a0d72ab529902 (diff)
downloadtalos-hostboot-fba889a1a092467ff83e8540b399c6a7f0d3e748.tar.gz
talos-hostboot-fba889a1a092467ff83e8540b399c6a7f0d3e748.zip
PRD: Callout row repairs when all repairs used
Change-Id: I518c1dc83727d7df71805e268ae71fea04adb799 CQ: SW453829 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/70195 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/70295 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/common/plat')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemMark.C49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
index a4ace9175..83bff1876 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.C
@@ -958,6 +958,45 @@ void __addCallout( ExtensibleChip * i_chip, const MemRank & i_rank,
//------------------------------------------------------------------------------
template<TARGETING::TYPE T>
+uint32_t __addRowRepairCallout( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ STEP_CODE_DATA_STRUCT & io_sc )
+{
+ #define PRDF_FUNC "[__addRowRepairCallout] "
+
+ uint32_t o_rc = SUCCESS;
+
+ // Get the dimms on this rank on either port.
+ TargetHandleList dimmList = getConnectedDimms( i_chip->getTrgt(), i_rank );
+
+ // Check for row repairs on each dimm.
+ for ( auto const & dimm : dimmList )
+ {
+ MemRowRepair rowRepair;
+ o_rc = getRowRepairData<T>( dimm, i_rank, rowRepair );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getRowRepairData(0x%08x, 0x%02x)",
+ PlatServices::getHuid(dimm), i_rank.getKey() );
+ break;
+ }
+
+ // If the row repair is valid, add it to the callout list.
+ if ( rowRepair.isValid() )
+ {
+ io_sc.service_data->SetCallout( dimm );
+ }
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+
+}
+
+//------------------------------------------------------------------------------
+
+template<TARGETING::TYPE T>
uint32_t __applyRasPolicies( ExtensibleChip * i_chip, const MemRank & i_rank,
STEP_CODE_DATA_STRUCT & io_sc,
const MemMark & i_chipMark,
@@ -1033,6 +1072,16 @@ uint32_t __applyRasPolicies<TYPE_MBA>( ExtensibleChip * i_chip,
__addCallout( i_chip, i_rank, sp1, io_sc );
__addCallout( i_chip, i_rank, ecc, io_sc );
+ // Add the row repairs to the callout list if they exist
+ o_rc = __addRowRepairCallout<TARGETING::TYPE_MBA>( i_chip, i_rank,
+ io_sc );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "__addRowRepairCallout(0x%08x,0x%02x) "
+ "failed.", i_chip->getHuid(), i_rank.getKey() );
+ break;
+ }
+
// If the chip mark is on a spare then the spare is bad and hardware
// can not steer it to another DRAM even if one is available (e.g.
// the ECC spare). In this this case, make error log predictive.
OpenPOWER on IntegriCloud