diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2019-04-09 15:29:07 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2019-04-18 10:33:07 -0500 |
commit | 9d139bd7d99a87c6d11f6569482218badb49cc8b (patch) | |
tree | de94afe1294c8faa0acb828b21929746afa1482a /src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C | |
parent | 36a58f1f80473c1ee39e449c85f78ead269c0348 (diff) | |
download | talos-hostboot-9d139bd7d99a87c6d11f6569482218badb49cc8b.tar.gz talos-hostboot-9d139bd7d99a87c6d11f6569482218badb49cc8b.zip |
PRD: Axone/Explorer Misc Updates needed for TdCtlr/DataBundles
Change-Id: Ia769f949f984c810b998c19fd32c7c3af2e06244
RTC: 207388
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75791
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Paul Greenwood <paul.greenwood@ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/76086
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/plat/mem/prdfMemScrubUtils.C')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C index 9d8e00f50..5351b842a 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C @@ -188,6 +188,23 @@ uint32_t clearEccCounters<TYPE_MCA>( ExtensibleChip * i_chip ) } template<> +uint32_t clearEccCounters<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip ) +{ + return __clearEccCounters<TYPE_OCMB_CHIP>( i_chip, "MCB_CNTL", 7 ); +} + +template<> +uint32_t clearEccCounters<TYPE_MEM_PORT>( ExtensibleChip * i_chip ) +{ + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MEM_PORT == i_chip->getType() ); + + ExtensibleChip * ocmbChip = getConnectedParent( i_chip, TYPE_OCMB_CHIP ); + + return clearEccCounters<TYPE_OCMB_CHIP>( ocmbChip ); +} + +template<> uint32_t clearEccCounters<TYPE_MBA>( ExtensibleChip * i_chip ) { PRDF_ASSERT( nullptr != i_chip ); @@ -253,6 +270,53 @@ uint32_t clearEccFirs<TYPE_MCA>( ExtensibleChip * i_chip ) } template<> +uint32_t clearEccFirs<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip ) +{ + uint32_t o_rc = SUCCESS; + + do + { + // Clear MCBISTFIR[5:9] + o_rc = __clearFir<TYPE_OCMB_CHIP>( i_chip, "MCBISTFIR_AND", + 0xf83fffffffffffffull ); + if ( SUCCESS != o_rc ) break; + + // Maintenance AUEs/IAUEs will be reported as system checkstops. + // Maintenance IMPEs will be reported as recoverable attentions at + // all times. Maintence IUEs will be masked during Memory + // Diagnostics and handled in the Targeted diagnostics code. After + // Memory Diagnostics, maintenance IUEs will be reported as + // recoverable in the field (no stop-on-error), but will remain + // masked if MNFG thresholds are enabled. In this case, the command + // will stop on RCE ETE in order to get a more accuracy callout. So + // clear RDFFIR[20:32,34:35,38] always and RDFFIR[37] in MNFG + // mode or during Memory Diagnostics. + uint64_t mask = 0xfffff0004dffffffull; + if ( mfgMode() ) mask &= 0xfffffffffbffffffull; + #ifndef __HOSTBOOT_RUNTIME + if ( isInMdiaMode() ) mask &= 0xfffffffffbffffffull; + #endif + + o_rc = __clearFir<TYPE_OCMB_CHIP>( i_chip, "RDFFIR_AND", mask ); + if ( SUCCESS != o_rc ) break; + + } while(0); + + return o_rc; +} + +template<> +uint32_t clearEccFirs<TYPE_MEM_PORT>( ExtensibleChip * i_chip ) +{ + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MEM_PORT == i_chip->getType() ); + + ExtensibleChip * ocmbChip = getConnectedParent( i_chip, TYPE_OCMB_CHIP ); + + return clearEccFirs<TYPE_OCMB_CHIP>( ocmbChip ); +} + +template<> uint32_t clearEccFirs<TYPE_MBA>( ExtensibleChip * i_chip ) { uint32_t o_rc = SUCCESS; @@ -345,6 +409,69 @@ uint32_t checkEccFirs<TYPE_MCA>( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ template<> +uint32_t checkEccFirs<TYPE_MEM_PORT>( ExtensibleChip * i_chip, + uint32_t & o_eccAttns ) +{ + #define PRDF_FUNC "[checkEccFirs<TYPE_MEM_PORT>] " + + uint32_t o_rc = SUCCESS; + + o_eccAttns = MAINT_NO_ERROR; + + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MEM_PORT == i_chip->getType() ); + + ExtensibleChip * ocmbChip = getConnectedParent( i_chip, TYPE_OCMB_CHIP ); + + SCAN_COMM_REGISTER_CLASS * rdffir = ocmbChip->getRegister( "RDFFIR" ); + SCAN_COMM_REGISTER_CLASS * mcbistfir = ocmbChip->getRegister( "MCBISTFIR" ); + + do + { + o_rc = rdffir->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() failed on MCAECCFIR: i_chip=0x%08x", + i_chip->getHuid() ); + break; + } + + // We can assume that any chip mark placed by a maintenance command was + // done on the rank in which the command stopped. So we can blindly + // check all bits to determine if there was an MPE on the stopped rank. + if ( 0 != rdffir->GetBitFieldJustified(20,8) ) o_eccAttns |= MAINT_MPE; + + if ( rdffir->IsBitSet(28) ) o_eccAttns |= MAINT_NCE; + if ( rdffir->IsBitSet(29) ) o_eccAttns |= MAINT_TCE; + if ( rdffir->IsBitSet(30) ) o_eccAttns |= MAINT_SCE; + if ( rdffir->IsBitSet(31) ) o_eccAttns |= MAINT_MCE; + if ( rdffir->IsBitSet(34) ) o_eccAttns |= MAINT_UE; + if ( rdffir->IsBitSet(37) ) o_eccAttns |= MAINT_IUE; + if ( rdffir->IsBitSet(39) ) o_eccAttns |= MAINT_IMPE; + + o_rc = mcbistfir->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() failed on MCBISTFIR: mcbChip=0x%08x", + ocmbChip->getHuid() ); + break; + } + + if ( mcbistfir->IsBitSet(5) ) o_eccAttns |= MAINT_HARD_NCE_ETE; + if ( mcbistfir->IsBitSet(6) ) o_eccAttns |= MAINT_SOFT_NCE_ETE; + if ( mcbistfir->IsBitSet(7) ) o_eccAttns |= MAINT_INT_NCE_ETE; + if ( mcbistfir->IsBitSet(8) ) o_eccAttns |= MAINT_RCE_ETE; + + } while(0); + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +template<> uint32_t checkEccFirs<TYPE_MBA>( ExtensibleChip * i_chip, uint32_t & o_eccAttns ) { |