diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2019-01-08 08:41:57 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2019-01-16 16:30:59 -0600 |
commit | fba889a1a092467ff83e8540b399c6a7f0d3e748 (patch) | |
tree | ee77c1f571ecbb3db0376a440c13d09488273303 /src/usr/diag/prdf/common/plat | |
parent | e3ceaa63602bec06a5f4f1a7744a0d72ab529902 (diff) | |
download | talos-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.C | 49 |
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. |