diff options
Diffstat (limited to 'src/usr/diag/prdf')
-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 ) |