diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2017-02-15 09:23:20 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-02-27 10:41:03 -0500 |
commit | ee946e0c40f8274fab76da7db28a5807c1c99239 (patch) | |
tree | bc1dc5a501671a257ff8a539d71f42238e44c7f8 /src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C | |
parent | 0de839164574599231f207f073803222a313d3d7 (diff) | |
download | talos-hostboot-ee946e0c40f8274fab76da7db28a5807c1c99239.tar.gz talos-hostboot-ee946e0c40f8274fab76da7db28a5807c1c99239.zip |
PRD: add support to read memory NCE/TCE symbols from hardware
Change-Id: I156229b4f40b73e1b36e2849ecdc6e37dd232abe
RTC: 165382
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36751
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: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/37013
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/diag/prdf/common/plat/mem/prdfMemSymbol.C')
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C index 6c8226af3..43e797b5b 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C @@ -24,7 +24,12 @@ /* IBM_PROLOG_END_TAG */ #include <prdfMemSymbol.H> + +// Framework includes +#include <prdfExtensibleChip.H> #include <prdfTrace.H> + +// Parser includes #include <prdfParserUtils.H> using namespace TARGETING; @@ -147,5 +152,125 @@ uint8_t MemSymbol::getDramPins() const } //------------------------------------------------------------------------------ +// Symbol Accessor Functions +//------------------------------------------------------------------------------ + +template<> +uint32_t getMemReadSymbol<TYPE_MCA>( ExtensibleChip * i_chip, + const MemRank & i_rank, + MemSymbol & o_symbol, bool i_isTce ) +{ + #define PRDF_FUNC "[getMemReadSymbol<TYPE_MBA>] " + + // Check parameters + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + + uint32_t o_rc = SUCCESS; + + do + { + // Get the NCE/TCE galois and mask from hardware. + ExtensibleChip * mcbChip = getConnectedParent( i_chip, TYPE_MCBIST ); + + uint8_t port = i_chip->getPos() % MAX_MCA_PER_MCBIST; // 0,1,2,3 + uint8_t mcsRelMcb = port / MAX_MCA_PER_MCS; // 0,1 + uint8_t mcaRelMcs = port % MAX_MCA_PER_MCS; // 0,1 + + const char * reg_str = (0 == mcsRelMcb) ? "MBSEVR0" : "MBSEVR1"; + + SCAN_COMM_REGISTER_CLASS * reg = mcbChip->getRegister(reg_str); + o_rc = reg->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() failed on %s: mcbChip=0x%08x", reg_str, + mcbChip->getHuid() ); + break; + } + + uint32_t bitPos = (mcaRelMcs * 32) + (i_isTce ? 16 : 0); + + uint8_t galois = reg->GetBitFieldJustified( bitPos, 8 ); + uint8_t mask = reg->GetBitFieldJustified( bitPos + 8, 8 ); + + // Get the NCE/TCE symbol. + o_symbol = MemSymbol::fromGalois( i_chip->getTrgt(), i_rank, galois, + mask ); + if ( !o_symbol.isValid() ) + { + PRDF_ERR( PRDF_FUNC "fromGalois(0x%08x,m%ds%d,0x%02x,0x%02x) " + "failed", i_chip->getHuid(), i_rank.getMaster(), + i_rank.getSlave(), galois, mask ); + o_rc = FAIL; + break; + } + + // TODO: RTC 157888 Check if the symbol is on a spare DRAM. + + } while (0); + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +template<> +uint32_t getMemReadSymbol<TYPE_MBA>( ExtensibleChip * i_chip, + const MemRank & i_rank, + MemSymbol & o_symbol, bool i_isTce ) +{ + #define PRDF_FUNC "[getMemReadSymbol<TYPE_MBA>] " + + // Check parameters + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MBA == i_chip->getType() ); + PRDF_ASSERT( !i_isTce ); // TCEs do not exist on Centaur + + uint32_t o_rc = SUCCESS; + + do + { + // Get the NCE galois and mask from hardware. + ExtensibleChip * membChip = getConnectedParent( i_chip, TYPE_MEMBUF ); + + const char * reg_str = (0 == i_chip->getPos()) ? "MBA0_MBSEVR" + : "MBA1_MBSEVR"; + + SCAN_COMM_REGISTER_CLASS * reg = membChip->getRegister(reg_str); + o_rc = reg->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() failed on %s: membChip=0x%08x", reg_str, + membChip->getHuid() ); + break; + } + + uint8_t galois = reg->GetBitFieldJustified( 40, 8 ); + uint8_t mask = reg->GetBitFieldJustified( 32, 8 ); + + // Get the NCE symbol. + o_symbol = MemSymbol::fromGalois( i_chip->getTrgt(), i_rank, galois, + mask ); + if ( !o_symbol.isValid() ) + { + PRDF_ERR( PRDF_FUNC "fromGalois(0x%08x,m%ds%d,0x%02x,0x%02x) " + "failed", i_chip->getHuid(), i_rank.getMaster(), + i_rank.getSlave(), galois, mask ); + o_rc = FAIL; + break; + } + + // TODO: RTC 157888 Check if the symbol is on a spare DRAM. + + } while (0); + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ } // end namespace PRDF |