summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat/prdfTargetServices.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/common/plat/prdfTargetServices.C')
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.C200
1 files changed, 139 insertions, 61 deletions
diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
index 65f8b9cdc..d34c980ad 100755
--- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C
+++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
@@ -365,6 +365,20 @@ TARGETING::MODEL getChipModel( TARGETING::TargetHandle_t i_trgt )
//------------------------------------------------------------------------------
+#ifdef __HOSTBOOT_MODULE
+uint32_t getChipId( TARGETING::TargetHandle_t i_trgt )
+{
+ PRDF_ASSERT( NULL != i_trgt );
+
+ TargetHandle_t parent = getParentChip( i_trgt );
+ PRDF_ASSERT( NULL != parent );
+
+ return parent->getAttr<ATTR_CHIP_ID>();
+}
+#endif
+
+//------------------------------------------------------------------------------
+
uint8_t getChipLevel( TARGETING::TargetHandle_t i_trgt )
{
PRDF_ASSERT( NULL != i_trgt );
@@ -566,6 +580,7 @@ TargetService::ASSOCIATION_TYPE getAssociationType( TargetHandle_t i_target,
{ TYPE_MC, TYPE_PROC, TargetService::PARENT_BY_AFFINITY },
{ TYPE_MC, TYPE_MI, TargetService::CHILD_BY_AFFINITY },
{ TYPE_MC, TYPE_OMIC, TargetService::CHILD_BY_AFFINITY },
+ { TYPE_MC, TYPE_MCC, TargetService::CHILD_BY_AFFINITY },
{ TYPE_MC, TYPE_DMI, TargetService::CHILD_BY_AFFINITY },
{ TYPE_MC, TYPE_DIMM, TargetService::CHILD_BY_AFFINITY },
@@ -579,13 +594,16 @@ TargetService::ASSOCIATION_TYPE getAssociationType( TargetHandle_t i_target,
{ TYPE_OMIC, TYPE_OMI, TargetService::CHILD_BY_AFFINITY },
{ TYPE_MCC, TYPE_PROC, TargetService::PARENT_BY_AFFINITY },
+ { TYPE_MCC, TYPE_MC, TargetService::PARENT_BY_AFFINITY },
{ TYPE_MCC, TYPE_MI, TargetService::PARENT_BY_AFFINITY },
{ TYPE_MCC, TYPE_OMI, TargetService::CHILD_BY_AFFINITY },
+ { TYPE_MCC, TYPE_OCMB_CHIP, TargetService::CHILD_BY_AFFINITY },
{ TYPE_OMI, TYPE_OMIC, TargetService::PARENT_BY_AFFINITY },
{ TYPE_OMI, TYPE_MCC, TargetService::PARENT_BY_AFFINITY },
{ TYPE_OMI, TYPE_OCMB_CHIP, TargetService::CHILD_BY_AFFINITY },
+ { TYPE_OCMB_CHIP, TYPE_MCC, TargetService::PARENT_BY_AFFINITY },
{ TYPE_OCMB_CHIP, TYPE_OMI, TargetService::PARENT_BY_AFFINITY },
{ TYPE_OCMB_CHIP, TYPE_MEM_PORT,TargetService::CHILD_BY_AFFINITY },
{ TYPE_OCMB_CHIP, TYPE_DIMM, TargetService::CHILD_BY_AFFINITY },
@@ -648,14 +666,30 @@ TargetHandleList getConnAssoc( TargetHandle_t i_target, TYPE i_connType,
TargetHandleList o_list; // Default empty list
- // Match any class, specified type, and functional.
- PredicateCTM predType( CLASS_NA, i_connType );
- PredicateIsFunctional predFunc;
- PredicatePostfixExpr predAnd;
- predAnd.push(&predType).push(&predFunc).And();
+ TYPE trgtType = getTargetType( i_target );
- targetService().getAssociated( o_list, i_target, i_assocType,
- TargetService::ALL, &predAnd );
+ // OMIC -> OMI and vice versa require special handling.
+ if ( TYPE_OMIC == trgtType && TYPE_OMI == i_connType )
+ {
+ getChildOmiTargetsByState( o_list, i_target, CLASS_NA, TYPE_OMI,
+ UTIL_FILTER_FUNCTIONAL );
+ }
+ else if ( TYPE_OMI == trgtType && TYPE_OMIC == i_connType )
+ {
+ getParentOmicTargetsByState( o_list, i_target, CLASS_NA, TYPE_OMIC,
+ UTIL_FILTER_FUNCTIONAL );
+ }
+ else
+ {
+ // Match any class, specified type, and functional.
+ PredicateCTM predType( CLASS_NA, i_connType );
+ PredicateIsFunctional predFunc;
+ PredicatePostfixExpr predAnd;
+ predAnd.push(&predType).push(&predFunc).And();
+
+ targetService().getAssociated( o_list, i_target, i_assocType,
+ TargetService::ALL, &predAnd );
+ }
// Sort by target position.
std::sort( o_list.begin(), o_list.end(),
@@ -866,6 +900,17 @@ TargetHandle_t getConnectedChild( TargetHandle_t i_target, TYPE i_connType,
(i_connPos == (miPos % MAX_MI_PER_MC));
} );
}
+ else if ( TYPE_MC == trgtType && TYPE_MCC == i_connType )
+ {
+ // i_connPos is position relative to MC (0-3)
+ itr = std::find_if( list.begin(), list.end(),
+ [&](const TargetHandle_t & t)
+ {
+ uint32_t mccPos = getTargetPosition(t);
+ return (trgtPos == (mccPos / MAX_MCC_PER_MC)) &&
+ (i_connPos == (mccPos % MAX_MCC_PER_MC));
+ } );
+ }
else if ( TYPE_MC == trgtType && TYPE_DMI == i_connType )
{
// i_connPos is position relative to MC (0-3)
@@ -929,6 +974,17 @@ TargetHandle_t getConnectedChild( TargetHandle_t i_target, TYPE i_connType,
(i_connPos == (omiPos % MAX_OMI_PER_MCC));
} );
}
+ else if ( TYPE_MCC == trgtType && TYPE_OCMB_CHIP == i_connType )
+ {
+ // i_connPos is position relative to MCC (0-1)
+ itr = std::find_if( list.begin(), list.end(),
+ [&](const TargetHandle_t & t)
+ {
+ uint32_t ocmbPos = getTargetPosition(t);
+ return (trgtPos == (ocmbPos / MAX_OCMB_PER_MCC)) &&
+ (i_connPos == (ocmbPos % MAX_OCMB_PER_MCC));
+ } );
+ }
else if ( TYPE_MC == trgtType && TYPE_OMIC == i_connType )
{
// i_connPos is position relative to MC (0-2)
@@ -943,13 +999,17 @@ TargetHandle_t getConnectedChild( TargetHandle_t i_target, TYPE i_connType,
else if ( TYPE_OMIC == trgtType && TYPE_OMI == i_connType )
{
// i_connPos is position relative to OMIC (0-2)
- itr = std::find_if( list.begin(), list.end(),
- [&](const TargetHandle_t & t)
- {
- uint32_t omiPos = getTargetPosition(t);
- return (trgtPos == (omiPos / MAX_OMI_PER_OMIC)) &&
- (i_connPos == (omiPos % MAX_OMI_PER_OMIC));
- } );
+ for ( TargetHandleList::iterator trgtIt = list.begin();
+ trgtIt != list.end(); trgtIt++ )
+ {
+ uint8_t omiPos = 0;
+ if ( (*trgtIt)->tryGetAttr<ATTR_OMI_DL_GROUP_POS>(omiPos) &&
+ (i_connPos == omiPos) )
+ {
+ itr = trgtIt;
+ break;
+ }
+ }
}
else if ( TYPE_PROC == trgtType && TYPE_NPU == i_connType )
{
@@ -991,7 +1051,12 @@ ExtensibleChipList getConnected( ExtensibleChip * i_chip, TYPE i_connType )
TargetHandleList list = getConnected( i_chip->getTrgt(), i_connType );
for ( auto & trgt : list )
{
- o_list.push_back( (ExtensibleChip *)systemPtr->GetChip(trgt) );
+ // Check to make sure that if we have a non-null Target, we also
+ // get back a non-null ExtensibleChip.
+ ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip(trgt);
+ PRDF_ASSERT( nullptr != chip );
+
+ o_list.push_back( chip );
}
return o_list;
@@ -1007,7 +1072,12 @@ ExtensibleChip * getConnectedParent( ExtensibleChip * i_child,
TargetHandle_t trgt = getConnectedParent( i_child->getTrgt(),
i_parentType );
- return (ExtensibleChip *)systemPtr->GetChip( trgt );
+ // Check to make sure that if we have a non-null Target, we also
+ // get back a non-null ExtensibleChip.
+ ExtensibleChip * chip = (ExtensibleChip *)systemPtr->GetChip( trgt );
+ PRDF_ASSERT( nullptr != chip );
+
+ return chip;
}
//------------------------------------------------------------------------------
@@ -1026,6 +1096,10 @@ ExtensibleChip * getConnectedChild( ExtensibleChip * i_parent,
if ( nullptr != trgt )
{
o_child = (ExtensibleChip *)systemPtr->GetChip( trgt );
+
+ // Check to make sure that if we have a non-null Target, we also
+ // get back a non-null ExtensibleChip.
+ PRDF_ASSERT( nullptr != o_child );
}
return o_child;
@@ -1471,7 +1545,9 @@ bool isDramWidthX4( TargetHandle_t i_trgt )
bool o_dramWidthX4 = false;
PRDF_ASSERT( nullptr != i_trgt );
- //uint8_t dramWidths = 0;
+ uint8_t dramWidths[MAX_DIMM_PER_PORT];
+ uint8_t dimmSlct = 0;
+ TargetHandle_t memPort = nullptr;
switch ( getTargetType(i_trgt) )
{
@@ -1485,12 +1561,17 @@ bool isDramWidthX4( TargetHandle_t i_trgt )
break;
case TYPE_DIMM:
- // TODO RTC 207273 - attribute not in TARGETING code yet
- //TargetHandle_t memPort = getConnectedParent(i_trgt, TYPE_MEM_PORT);
- //dramWidths = memPort->getAttr<ATTR_MEM_EFF_DRAM_WIDTH>();
- //uint8_t dimmSlct = getDimmSlct( i_trgt );
- //o_dramWidthX4 =
- // (fapi2::ENUM_ATTR_MEM_EFF_DRAM_WIDTH_X4 == dramWidths[dimmSlct]);
+ memPort = getConnectedParent(i_trgt, TYPE_MEM_PORT);
+ if ( !memPort->tryGetAttr<ATTR_MEM_EFF_DRAM_WIDTH>(dramWidths) )
+ {
+ PRDF_ERR( "isDramWidthX4: Unable to access "
+ "ATTR_MEM_EFF_DRAM_WIDTH i_trgt=0x%08x.",
+ getHuid(memPort) );
+ PRDF_ASSERT( false );
+ }
+ dimmSlct = getDimmSlct( i_trgt );
+ o_dramWidthX4 =
+ (TARGETING::MEM_EFF_DRAM_WIDTH_X4 == dramWidths[dimmSlct]);
break;
default:
@@ -1538,15 +1619,12 @@ void __getMasterRanks( TargetHandle_t i_trgt, std::vector<MemRank> & o_ranks,
}
else if ( MODEL_AXONE == l_procModel )
{
- PRDF_ERR( PRDF_FUNC "Axone attribute not supported yet" );
- /* TODO RTC 207273 - no targeting support for attr yet
if ( !i_trgt->tryGetAttr<ATTR_MEM_EFF_DIMM_RANKS_CONFIGED>(info[0]) )
{
PRDF_ERR( PRDF_FUNC "tryGetAttr<ATTR_MEM_EFF_DIMM_RANKS_CONFIGED> "
"failed: i_trgt=0x%08x", getHuid(i_trgt) );
PRDF_ASSERT( false ); // attribute does not exist for target
}
- */
}
else
{
@@ -1605,17 +1683,21 @@ void getMasterRanks<TYPE_MBA>( TargetHandle_t i_trgt,
}
template<>
-void getMasterRanks<TYPE_MEM_PORT>( TargetHandle_t i_trgt,
- std::vector<MemRank> & o_ranks,
- uint8_t i_ds )
-{
- __getMasterRanks<TYPE_MEM_PORT>( i_trgt, o_ranks, 0, i_ds );
+void getMasterRanks<TYPE_OCMB_CHIP>( TargetHandle_t i_trgt,
+ std::vector<MemRank> & o_ranks,
+ uint8_t i_ds )
+{
+ // TODO RTC 210072 - Explorer only has one port, however, multiple ports
+ // will be supported in the future. Updates will need to be made here so we
+ // can get the relevant port.
+ TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 );
+ __getMasterRanks<TYPE_MEM_PORT>( memPort, o_ranks, 0, i_ds );
}
//------------------------------------------------------------------------------
template<TARGETING::TYPE T>
-void __getSlaveRanks( TargetHandle_t i_trgt, std::vector<MemRank> & o_ranks,
+void getSlaveRanks( TargetHandle_t i_trgt, std::vector<MemRank> & o_ranks,
uint8_t i_ds )
{
PRDF_ASSERT( nullptr != i_trgt );
@@ -1656,29 +1738,18 @@ void __getSlaveRanks( TargetHandle_t i_trgt, std::vector<MemRank> & o_ranks,
}
}
-template<>
+template
void getSlaveRanks<TYPE_MCA>( TargetHandle_t i_trgt,
std::vector<MemRank> & o_ranks,
- uint8_t i_ds )
-{
- __getSlaveRanks<TYPE_MCA>( i_trgt, o_ranks, i_ds );
-}
-
-template<>
+ uint8_t i_ds );
+template
void getSlaveRanks<TYPE_MBA>( TargetHandle_t i_trgt,
std::vector<MemRank> & o_ranks,
- uint8_t i_ds )
-{
- __getSlaveRanks<TYPE_MBA>( i_trgt, o_ranks, i_ds );
-}
-
-template<>
-void getSlaveRanks<TYPE_MEM_PORT>( TargetHandle_t i_trgt,
- std::vector<MemRank> & o_ranks,
- uint8_t i_ds )
-{
- __getSlaveRanks<TYPE_MEM_PORT>( i_trgt, o_ranks, i_ds );
-}
+ uint8_t i_ds );
+template
+void getSlaveRanks<TYPE_OCMB_CHIP>( TargetHandle_t i_trgt,
+ std::vector<MemRank> & o_ranks,
+ uint8_t i_ds );
//------------------------------------------------------------------------------
@@ -1774,12 +1845,15 @@ uint8_t getNumMasterRanksPerDimm<TYPE_MBA>( TargetHandle_t i_trgt,
}
template<>
-uint8_t getNumMasterRanksPerDimm<TYPE_MEM_PORT>( TargetHandle_t i_trgt,
- uint8_t i_ds )
-{
- return __getNumMasterRanksPerDimm<TYPE_MEM_PORT>( i_trgt, 0, i_ds );
+uint8_t getNumMasterRanksPerDimm<TYPE_OCMB_CHIP>( TargetHandle_t i_trgt,
+ uint8_t i_ds )
+{
+ // TODO RTC 210072 - Explorer only has one port, however, multiple ports
+ // will be supported in the future. Updates will need to be made here so we
+ // can get the relevant port.
+ TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 );
+ return __getNumMasterRanksPerDimm<TYPE_MEM_PORT>( memPort, 0, i_ds );
}
-
//------------------------------------------------------------------------------
template<TARGETING::TYPE T>
@@ -1822,10 +1896,10 @@ uint8_t __getNumRanksPerDimm( TargetHandle_t i_trgt,
}
else if ( MODEL_AXONE == l_procModel )
{
- ATTR_MEM_EFF_NUM_RANKS_PER_DIMM_type attr;
- if ( !i_trgt->tryGetAttr<ATTR_MEM_EFF_NUM_RANKS_PER_DIMM>(attr) )
+ ATTR_MEM_EFF_LOGICAL_RANKS_PER_DIMM_type attr;
+ if ( !i_trgt->tryGetAttr<ATTR_MEM_EFF_LOGICAL_RANKS_PER_DIMM>(attr) )
{
- PRDF_ERR( PRDF_FUNC "tryGetAttr<ATTR_MEM_EFF_NUM_RANKS_PER_DIMM> "
+ PRDF_ERR( PRDF_FUNC "tryGetAttr<ATTR_MEM_EFF_LOGICAL_RANKS_PER_DIMM> "
"failed: i_trgt=0x%08x", getHuid(i_trgt) );
PRDF_ASSERT( false ); // attribute does not exist for target
}
@@ -1869,9 +1943,13 @@ uint8_t getNumRanksPerDimm<TYPE_MBA>( TargetHandle_t i_trgt, uint8_t i_ds )
}
template<>
-uint8_t getNumRanksPerDimm<TYPE_MEM_PORT>( TargetHandle_t i_trgt, uint8_t i_ds )
+uint8_t getNumRanksPerDimm<TYPE_OCMB_CHIP>(TargetHandle_t i_trgt, uint8_t i_ds)
{
- return __getNumRanksPerDimm<TYPE_MEM_PORT>( i_trgt, 0, i_ds );
+ // TODO RTC 210072 - Explorer only has one port, however, multiple ports
+ // will be supported in the future. Updates will need to be made here so we
+ // can get the relevant port.
+ TargetHandle_t memPort = getConnectedChild( i_trgt, TYPE_MEM_PORT, 0 );
+ return __getNumRanksPerDimm<TYPE_MEM_PORT>( memPort, 0, i_ds );
}
//##############################################################################
OpenPOWER on IntegriCloud