diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2017-07-26 12:59:22 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-07-28 11:33:35 -0400 |
commit | f72905787eb3f1bc4d3b5ee0ea45d3051c4f48d2 (patch) | |
tree | 40195d7b1a7b38e660288903b3521c2e3bab672e | |
parent | 8bbfc6d5127458cf3c9614460d87e6588cf97e2a (diff) | |
download | talos-hostboot-f72905787eb3f1bc4d3b5ee0ea45d3051c4f48d2.tar.gz talos-hostboot-f72905787eb3f1bc4d3b5ee0ea45d3051c4f48d2.zip |
PRD: address mismatch in UE table
Change-Id: I1842dc304e83d8c130c6c5d421ac989b05f0b54a
CQ: SW394475
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43693
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43799
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>
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C | 6 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H | 13 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C | 15 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C | 14 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C | 28 |
5 files changed, 52 insertions, 24 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C index 29b9815d8..8abd09515 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C @@ -50,7 +50,7 @@ MemAddr MemAddr::fromReadAddr<TYPE_MCBIST>( uint64_t i_addr ) { uint64_t mrnk = (i_addr >> 59) & 0x7; // 2: 4 uint64_t srnk = (i_addr >> 56) & 0x7; // 5: 7 - uint64_t row = (i_addr >> 38) & 0x1ffff; // 8:25 + uint64_t row = (i_addr >> 38) & 0x3ffff; // 8:25 uint64_t col = (i_addr >> 31) & 0x7f; // 26:32 uint64_t bnk = (i_addr >> 26) & 0x1f; // 33:37 @@ -75,9 +75,9 @@ MemAddr MemAddr::fromReadAddr<TYPE_MEMBUF>( uint64_t i_addr ) template<> MemAddr MemAddr::fromMaintAddr<TYPE_MCBIST>( uint64_t i_addr ) { - uint64_t rslct = (i_addr >> 59) & 0x7; // 3: 4 + uint64_t rslct = (i_addr >> 59) & 0x3; // 3: 4 uint64_t srnk = (i_addr >> 56) & 0x7; // 5: 7 - uint64_t row = (i_addr >> 38) & 0x1ffff; // 8:25 + uint64_t row = (i_addr >> 38) & 0x3ffff; // 8:25 uint64_t col = (i_addr >> 31) & 0x7f; // 26:32 uint64_t bnk = (i_addr >> 26) & 0x1f; // 33:37 uint64_t dslct = (i_addr >> 23) & 0x1; // 40 diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H index 07808a990..4d4e0ee2b 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H @@ -86,19 +86,6 @@ class MemAddr template<TARGETING::TYPE T> static MemAddr fromMaintAddr( uint64_t i_addr ); - /** - * @brief Occassionally we will need a MemAddr, but all we have is a - * MemRank. This mostly happens when adding FFDC during Targeted - * Diagnostics procedures. In this case, we will input a valid rank - * and this function will add invalid bank, row, and column - * addresses. - * @param i_rank A valid rank for this address. - */ - static MemAddr fromRank( const MemRank & i_rank ) - { - return MemAddr( i_rank, 0xff, 0xffff, 0xffff ); - } - /** @return This address's rank. */ const MemRank& getRank() const { return iv_rnk; } diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C index 8525c47f2..339d3ac0a 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C @@ -123,9 +123,20 @@ uint32_t TpsEvent<TYPE_MCA>::nextStep( STEP_CODE_DATA_STRUCT & io_sc, PRDFSIG_MaintIUE ); } + // At this point we don't actually have an address for the UE. + // The best we can do is get the address in which the command + // stopped. + MemAddr addr; + o_rc = getMemMaintAddr<TYPE_MCA>( iv_chip, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + iv_chip->getHuid() ); + break; + } + // Do memory UE handling. - o_rc = MemEcc::handleMemUe<TYPE_MCA>(iv_chip, - MemAddr::fromRank(iv_rank), + o_rc = MemEcc::handleMemUe<TYPE_MCA>(iv_chip, addr, UE_TABLE::SCRUB_UE, io_sc); if ( SUCCESS != o_rc ) { diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C index 730a2f687..e331d736c 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C @@ -115,8 +115,18 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, ? PRDFSIG_MaintUE : PRDFSIG_MaintIUE ); - o_rc = MemEcc::handleMemUe<TYPE_MCA>( iv_chip, - MemAddr::fromRank(iv_rank), + // At this point we don't actually have an address for the UE. The + // best we can do is get the address in which the command stopped. + MemAddr addr; + o_rc = getMemMaintAddr<TYPE_MCA>( iv_chip, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + iv_chip->getHuid() ); + break; + } + + o_rc = MemEcc::handleMemUe<TYPE_MCA>( iv_chip, addr, UE_TABLE::SCRUB_UE, io_sc ); if ( SUCCESS != o_rc ) { diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C index 34d78d37e..835a54cfe 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C @@ -139,8 +139,18 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns, io_sc.service_data->setSignature( iv_chip->getHuid(), PRDFSIG_MaintUE ); - o_rc = MemEcc::handleMemUe<TYPE_MCA>( iv_chip, - MemAddr::fromRank(iv_rank), + // At this point we don't actually have an address for the UE. The + // best we can do is get the address in which the command stopped. + MemAddr addr; + o_rc = getMemMaintAddr<TYPE_MCA>( iv_chip, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + iv_chip->getHuid() ); + break; + } + + o_rc = MemEcc::handleMemUe<TYPE_MCA>( iv_chip, addr, UE_TABLE::SCRUB_UE, io_sc ); if ( SUCCESS != o_rc ) { @@ -217,9 +227,19 @@ uint32_t VcmEvent<TYPE_MBA>::checkEcc( const uint32_t & i_eccAttns, io_sc.service_data->setSignature( iv_chip->getHuid(), PRDFSIG_MaintUE ); + // At this point we don't actually have an address for the UE. The + // best we can do is get the address in which the command stopped. + MemAddr addr; + o_rc = getMemMaintAddr<TYPE_MBA>( iv_chip, addr ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "getMemMaintAddr(0x%08x) failed", + iv_chip->getHuid() ); + break; + } + /* TODO: RTC 157888 - o_rc = MemEcc::handleMemUe<TYPE_MBA>( iv_chip, - MemAddr::fromRank(iv_rank), + o_rc = MemEcc::handleMemUe<TYPE_MBA>( iv_chip, addr, UE_TABLE::SCRUB_UE, io_sc ); */ if ( SUCCESS != o_rc ) |