From 676eae6662bdde6195aeba1711bb2a8443ef087b Mon Sep 17 00:00:00 2001 From: Zane Shelley Date: Fri, 16 Jun 2017 17:26:22 -0500 Subject: PRD: Fetch NCE/TCE redesign NCEs and TCEs use the same error vector register, which stores the latest NCE/TCE. So it is possible that PRD could be handling one attention and the vector could be overwritten by a subsequent attention. Change-Id: Ia6955bc1f0a258e1450c426cec8c466a56b43432 CQ: SW392312 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42013 Tested-by: Jenkins Server Reviewed-by: Brian J. Stegmiller Reviewed-by: Benjamin J. Weisenbeck Reviewed-by: Caleb N. Palmer Reviewed-by: Zane C. Shelley Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42210 Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins --- src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C | 51 ++++++++--------------- 1 file changed, 18 insertions(+), 33 deletions(-) (limited to 'src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C') diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C index 3f5c51851..48118828b 100755 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemSymbol.C @@ -64,10 +64,10 @@ MemSymbol::MemSymbol( TARGETING::TargetHandle_t i_trgt, const MemRank & i_rank, iv_trgt(i_trgt), iv_rank(i_rank), iv_symbol(i_symbol), iv_pins(i_pins), iv_isDramSpared(false), iv_isEccSpared(false) { - PRDF_ASSERT( NULL != i_trgt ); + PRDF_ASSERT( nullptr != i_trgt ); PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) || TYPE_MCA == getTargetType(i_trgt) ); - PRDF_ASSERT( i_symbol < SYMBOLS_PER_RANK ); + // Allowing an invalid symbol. Use isValid() to check validity. PRDF_ASSERT( i_pins <= CEN_SYMBOL::BOTH_SYMBOL_DQS ); } @@ -87,8 +87,6 @@ MemSymbol MemSymbol::fromGalois( TargetHandle_t i_trgt, const MemRank & i_rank, } } - PRDF_ASSERT( symbol < SYMBOLS_PER_RANK ); - // Get pins from mask. uint8_t pins = NO_SYMBOL_DQS; if ( TYPE_MBA == getTargetType(i_trgt) ) @@ -160,7 +158,7 @@ uint8_t MemSymbol::getDramPins() const template<> uint32_t getMemReadSymbol( ExtensibleChip * i_chip, const MemRank & i_rank, - MemSymbol & o_symbol, bool i_isTce ) + MemSymbol & o_sym1, MemSymbol & o_sym2 ) { #define PRDF_FUNC "[getMemReadSymbol] " @@ -170,6 +168,8 @@ uint32_t getMemReadSymbol( ExtensibleChip * i_chip, uint32_t o_rc = SUCCESS; + o_sym1 = o_sym2 = MemSymbol(); // both initially invalid + do { // Get the NCE/TCE galois and mask from hardware. @@ -190,22 +190,15 @@ uint32_t getMemReadSymbol( ExtensibleChip * i_chip, 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 ); + uint32_t bitPos = mcaRelMcs * 32; + uint8_t g1 = reg->GetBitFieldJustified( bitPos, 8 ); + uint8_t m1 = reg->GetBitFieldJustified( bitPos + 8, 8 ); + uint8_t g2 = reg->GetBitFieldJustified( bitPos + 16, 8 ); + uint8_t m2 = reg->GetBitFieldJustified( bitPos + 24, 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; - } + o_sym1 = MemSymbol::fromGalois( i_chip->getTrgt(), i_rank, g1, m1 ); + o_sym2 = MemSymbol::fromGalois( i_chip->getTrgt(), i_rank, g2, m2 ); // TODO: RTC 157888 Check if the symbol is on a spare DRAM. @@ -221,17 +214,18 @@ uint32_t getMemReadSymbol( ExtensibleChip * i_chip, template<> uint32_t getMemReadSymbol( ExtensibleChip * i_chip, const MemRank & i_rank, - MemSymbol & o_symbol, bool i_isTce ) + MemSymbol & o_sym1, MemSymbol & o_sym2 ) { #define PRDF_FUNC "[getMemReadSymbol] " // 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; + o_sym1 = o_sym2 = MemSymbol(); // both initially invalid + do { // Get the NCE galois and mask from hardware. @@ -249,20 +243,11 @@ uint32_t getMemReadSymbol( ExtensibleChip * i_chip, break; } - uint8_t galois = reg->GetBitFieldJustified( 40, 8 ); - uint8_t mask = reg->GetBitFieldJustified( 32, 8 ); + uint8_t g1 = reg->GetBitFieldJustified( 40, 8 ); + uint8_t m1 = 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; - } + o_sym1 = MemSymbol::fromGalois( i_chip->getTrgt(), i_rank, g1, m1 ); // TODO: RTC 157888 Check if the symbol is on a spare DRAM. -- cgit v1.2.1