summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C6
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H13
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps_ipl.C15
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C14
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C28
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 )
OpenPOWER on IntegriCloud