summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C')
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C94
1 files changed, 76 insertions, 18 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
index bb911847e..4cd596514 100755
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2018 */
+/* Contributors Listed Below - COPYRIGHT 2013,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -70,42 +70,78 @@ MemoryMru::MemoryMru( uint32_t i_memMru ) :
PRDF_ASSERT( false );
}
- // If our target is MBA, get the chnlPos from the membuf
- if ( 0 == iv_memMruMeld.s.isMca )
+ // If our target is MCA
+ if ( 1 == iv_memMruMeld.s.isMca )
{
- TargetHandle_t membuf = getConnectedChild( proc, TYPE_MEMBUF,
+ iv_target = getConnectedChild( proc, TYPE_MCA,
iv_memMruMeld.s.chnlPos );
- if ( NULL == membuf )
+ if ( NULL == iv_target )
{
- PRDF_ERR( PRDF_FUNC "Could not find functional membuf "
+ PRDF_ERR( PRDF_FUNC "Could not find functional mca "
"attached to proc 0x%08X at pos: %u", getHuid( proc ),
iv_memMruMeld.s.chnlPos );
PRDF_ASSERT( false );
}
+ }
+ // If our target is OCMB
+ else if ( 1 == iv_memMruMeld.s.isOcmb )
+ {
+ // chnlPos specifies the position of the MCC relative to the proc
+ TargetHandle_t mcc = getConnectedChild( proc, TYPE_MCC,
+ iv_memMruMeld.s.chnlPos );
+ if ( nullptr == mcc )
+ {
+ PRDF_ERR( PRDF_FUNC "Could not find functional mcc attached to "
+ "proc 0x%08x at pos: %u", getHuid(proc),
+ iv_memMruMeld.s.chnlPos );
+ PRDF_ASSERT( false );
+ }
- iv_target = getConnectedChild( membuf, TYPE_MBA,
- iv_memMruMeld.s.mbaPos );
- if ( NULL == iv_target )
+ // mbaPos specifies the position of the OMI relative to the MCC
+ TargetHandle_t omi = getConnectedChild( mcc, TYPE_OMI,
+ iv_memMruMeld.s.mbaPos );
+ if ( nullptr == omi )
{
- PRDF_ERR( PRDF_FUNC "Could not find functional mba attached "
- "to 0x%08X at pos: %u", getHuid( membuf ),
- iv_memMruMeld.s.mbaPos );
+ PRDF_ERR( PRDF_FUNC "Could not find functional omi attached to "
+ "mcc 0x%08x at pos: %u", getHuid(mcc),
+ iv_memMruMeld.s.mbaPos );
+ PRDF_ASSERT( false );
+ }
+
+ // There is only one OCMB attached per OMI
+ iv_target = getConnectedChild( omi, TYPE_OCMB_CHIP, 0 );
+ if ( nullptr == iv_target )
+ {
+ PRDF_ERR( PRDF_FUNC "Could not find functional ocmb attached to "
+ "omi 0x%08x", getHuid(mcc) );
PRDF_ASSERT( false );
}
+
+
}
+ // If our target is MBA, get the chnlPos from the membuf
else
{
- iv_target = getConnectedChild( proc, TYPE_MCA,
+ TargetHandle_t membuf = getConnectedChild( proc, TYPE_MEMBUF,
iv_memMruMeld.s.chnlPos );
- if ( NULL == iv_target )
+ if ( nullptr == membuf )
{
- PRDF_ERR( PRDF_FUNC "Could not find functional mca "
+ PRDF_ERR( PRDF_FUNC "Could not find functional membuf "
"attached to proc 0x%08X at pos: %u", getHuid( proc ),
iv_memMruMeld.s.chnlPos );
PRDF_ASSERT( false );
}
- }
+ iv_target = getConnectedChild( membuf, TYPE_MBA,
+ iv_memMruMeld.s.mbaPos );
+ if ( nullptr == iv_target )
+ {
+ PRDF_ERR( PRDF_FUNC "Could not find functional mba attached "
+ "to 0x%08X at pos: %u", getHuid( membuf ),
+ iv_memMruMeld.s.mbaPos );
+ PRDF_ASSERT( false );
+ }
+ }
// Get the rank
iv_rank = MemRank( iv_memMruMeld.s.mrank, iv_memMruMeld.s.srank );
@@ -247,7 +283,8 @@ TargetHandleList MemoryMru::getCalloutList() const
}
}
}
- else if ( TARGETING::TYPE_MCA == getTargetType(iv_target) )
+ else if ( TARGETING::TYPE_MCA == getTargetType(iv_target) ||
+ TARGETING::TYPE_OCMB_CHIP == getTargetType(iv_target) )
{
if ( CALLOUT_ALL_MEM == iv_special )
{
@@ -304,6 +341,11 @@ void MemoryMru::getCommonVars()
{
proc = getConnectedParent( iv_target, TYPE_PROC );
}
+ else if ( TYPE_OCMB_CHIP == trgtType )
+ {
+ TargetHandle_t mcc = getConnectedParent( iv_target, TYPE_MCC );
+ proc = getConnectedParent( mcc, TYPE_PROC );
+ }
else
{
PRDF_ERR( PRDF_FUNC "Invalid target type" );
@@ -323,11 +365,27 @@ void MemoryMru::getCommonVars()
}
// If our target is an MCA, then chnlPos will specify the MCA position
// and mbaPos will be an unused field
- else
+ else if ( TYPE_MCA == getTargetType(iv_target) )
{
iv_memMruMeld.s.isMca = 1;
iv_memMruMeld.s.chnlPos = getTargetPosition( iv_target );
}
+ // If our target is an OCMB, then chnlPos will specify the MCC position and
+ // mbaPos will specify the OMI position.
+ else if ( TYPE_OCMB_CHIP == getTargetType(iv_target) )
+ {
+ TargetHandle_t omi = getConnectedParent( iv_target, TYPE_OMI );
+ TargetHandle_t mcc = getConnectedParent( omi, TYPE_MCC );
+
+ iv_memMruMeld.s.isOcmb = 1;
+ iv_memMruMeld.s.chnlPos = getTargetPosition(mcc) % MAX_MCC_PER_PROC;
+ iv_memMruMeld.s.mbaPos = getTargetPosition(omi) % MAX_OMI_PER_MCC;
+ }
+ else
+ {
+ PRDF_ERR( PRDF_FUNC "Invalid target type" );
+ PRDF_ASSERT(false);
+ }
iv_memMruMeld.s.nodePos = getTargetPosition( node );
iv_memMruMeld.s.procPos = getTargetPosition( proc );
OpenPOWER on IntegriCloud