summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2018-04-10 11:40:58 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-04-12 22:18:29 -0400
commit18dba5172c7d022d5b5b119d758fe167868cb00d (patch)
tree2bd065d8242d8f520841ac3ef2e74542e8d0a7bb
parent0fbaeccfec9bfc60e37dad4a7660040862b1e2ac (diff)
downloadtalos-hostboot-18dba5172c7d022d5b5b119d758fe167868cb00d.tar.gz
talos-hostboot-18dba5172c7d022d5b5b119d758fe167868cb00d.zip
PRD: getConnectedDimm support for MBA/MCA
Change-Id: I174e1222217645db5c98d5d88b71dff1f822759f RTC: 180690 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57011 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57036 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.C141
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.H32
2 files changed, 131 insertions, 42 deletions
diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
index 26d78f911..275b774c9 100755
--- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C
+++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C
@@ -859,14 +859,6 @@ TargetHandle_t getConnectedChild( TargetHandle_t i_target, TYPE i_connType,
PRDF_ASSERT( 1 == list.size() ); // just in case
itr = list.begin();
}
- else if ( TYPE_MBA == trgtType && TYPE_DIMM == i_connType )
- {
- // TODO: RTC180690 This really wasn't supported in P8 because there
- // are two ports and two DIMM selects per port and there
- // wasn't a clean way to get the correct DIMM. MCA doesn't
- // have this issue, but it would be nice to get a clean
- // interface for both MCA and MBA.
- }
else
{
// default, i_connPos should match the unit position within the chip
@@ -1009,6 +1001,112 @@ TargetHandle_t getConnectedPeerProc( TargetHandle_t i_procTarget,
//------------------------------------------------------------------------------
+template<>
+uint8_t getDimmPort<TYPE_MBA>( TARGETING::TargetHandle_t i_dimmTrgt )
+{
+ PRDF_ASSERT( nullptr != i_dimmTrgt );
+ PRDF_ASSERT( TYPE_DIMM == getTargetType(i_dimmTrgt) );
+
+ return i_dimmTrgt->getAttr<ATTR_MBA_PORT>();
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+uint8_t getDimmSlct<TYPE_MBA>( TargetHandle_t i_trgt )
+{
+ PRDF_ASSERT( nullptr != i_trgt );
+ PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );
+
+ return i_trgt->getAttr<ATTR_MBA_DIMM>();
+}
+
+template<>
+uint8_t getDimmSlct<TYPE_MCA>( TargetHandle_t i_trgt )
+{
+ PRDF_ASSERT( nullptr != i_trgt );
+ PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );
+
+ return getTargetPosition(i_trgt) % MAX_DIMM_PER_PORT;
+}
+
+//------------------------------------------------------------------------------
+
+TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_trgt,
+ const MemRank & i_rank )
+{
+ #define PRDF_FUNC "[PlatServices::getConnectedDimms] "
+
+ TargetHandleList o_list;
+ TYPE l_trgtType = getTargetType( i_trgt );
+
+ if ( TYPE_MCA == l_trgtType )
+ {
+ o_list.push_back(
+ getConnectedChild(i_trgt, TYPE_DIMM, i_rank.getDimmSlct()) );
+ }
+ else if ( TYPE_MBA == l_trgtType )
+ {
+ TargetHandleList l_dimmList = getConnected( i_trgt, TYPE_DIMM );
+ for ( auto & dimm : l_dimmList )
+ {
+ uint8_t l_dimmSlct = getDimmSlct<TYPE_MBA>( dimm );
+ if ( l_dimmSlct == i_rank.getDimmSlct() )
+ {
+ o_list.push_back( dimm );
+ }
+ }
+ }
+ else
+ {
+ PRDF_ERR(PRDF_FUNC "Invalid target type: HUID=0x%08x", getHuid(i_trgt));
+ PRDF_ASSERT( false );
+ }
+
+ return o_list;
+
+ #undef PRDF_FUNC
+}
+
+TARGETING::TargetHandle_t getConnectedDimm( TARGETING::TargetHandle_t i_trgt,
+ const MemRank & i_rank,
+ uint8_t i_port )
+{
+ #define PRDF_FUNC "[PlatServices::getConnectedDimm] "
+
+ TargetHandle_t o_dimm = nullptr;
+ TYPE l_trgtType = getTargetType( i_trgt );
+
+ if ( TYPE_MCA == l_trgtType )
+ {
+ o_dimm = getConnectedChild( i_trgt, TYPE_DIMM, i_rank.getDimmSlct() );
+ }
+ else if ( TYPE_MBA == l_trgtType )
+ {
+ TargetHandleList l_dimmList = getConnectedDimms( i_trgt, i_rank );
+ for ( auto & dimm : l_dimmList )
+ {
+ uint8_t l_portSlct = getDimmPort<TYPE_MBA>( dimm );
+ if ( l_portSlct == i_port )
+ {
+ o_dimm = dimm;
+ break;
+ }
+ }
+ }
+ else
+ {
+ PRDF_ERR(PRDF_FUNC "Invalid target type: HUID=0x%08x", getHuid(i_trgt));
+ PRDF_ASSERT( false );
+ }
+
+ return o_dimm;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
TARGETING::TargetHandle_t getSystemTarget()
{
TargetHandle_t sysTarget = nullptr;
@@ -1260,33 +1358,6 @@ int32_t isMembufOnDimm( TARGETING::TargetHandle_t i_memTarget,
//------------------------------------------------------------------------------
-int32_t getMbaPort( TARGETING::TargetHandle_t i_dimmTarget, uint8_t & o_port )
-{
- return i_dimmTarget->tryGetAttr<ATTR_MBA_PORT>(o_port) ? SUCCESS : FAIL;
-}
-
-//------------------------------------------------------------------------------
-
-template<>
-uint32_t getDimmSlct<TYPE_MBA>( TargetHandle_t i_trgt )
-{
- PRDF_ASSERT( nullptr != i_trgt );
- PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );
-
- return i_trgt->getAttr<ATTR_MBA_DIMM>();
-}
-
-template<>
-uint32_t getDimmSlct<TYPE_MCA>( TargetHandle_t i_trgt )
-{
- PRDF_ASSERT( nullptr != i_trgt );
- PRDF_ASSERT( TYPE_DIMM == getTargetType(i_trgt) );
-
- return getTargetPosition(i_trgt) % MAX_DIMM_PER_PORT;
-}
-
-//------------------------------------------------------------------------------
-
int32_t getDramGen( TARGETING::TargetHandle_t i_mba, uint8_t & o_dramGen )
{
#define PRDF_FUNC "[PlatServices::getDramGen] "
diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.H b/src/usr/diag/prdf/common/plat/prdfTargetServices.H
index 7b412c3af..48aa0d1c6 100755
--- a/src/usr/diag/prdf/common/plat/prdfTargetServices.H
+++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.H
@@ -286,6 +286,24 @@ TARGETING::TargetHandle_t getConnectedPeerTarget(
TARGETING::TargetHandle_t i_tgt);
/**
+ * @param i_trgt The target MBA or MCA.
+ * @param i_rank The target rank.
+ * @return A list of DIMMs connected to the target and rank.
+ */
+TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_trgt,
+ const MemRank & i_rank );
+
+/**
+ * @param i_trgt The target MBA or MCA.
+ * @param i_rank The target rank.
+ * @param i_port Port select.
+ * @return The DIMM connected to the target and rank on a port.
+ */
+TARGETING::TargetHandle_t getConnectedDimm( TARGETING::TargetHandle_t i_trgt,
+ const MemRank & i_rank,
+ uint8_t i_port );
+
+/**
* @brief Returns the system target.
* @return The system target.
*/
@@ -363,20 +381,20 @@ uint32_t getMemChnl( TARGETING::TargetHandle_t i_memTarget );
int32_t isMembufOnDimm( TARGETING::TargetHandle_t i_memTarget, bool &o_memBuf);
/**
- * @brief Obtain the MBA port select for the given Dimm.
- * @param i_dimmTarget Dimm.
- * @param o_port MBA port select.
- * @return Non-SUCCESS if internal functions fail, SUCCESS otherwise.
+ * @brief Obtain the port select for the given Dimm.
+ * @param i_dimmTrgt Dimm.
+ * @return port select
*/
-int32_t getMbaPort( TARGETING::TargetHandle_t i_dimmTarget, uint8_t & o_port );
+template<TARGETING::TYPE T>
+uint8_t getDimmPort( TARGETING::TargetHandle_t i_dimmTrgt );
/**
* @brief Obtain the Dimm select for the given Dimm.
- * @param i_dimmTarget Dimm.
+ * @param i_trgt Dimm.
* @return The DIMM select
*/
template<TARGETING::TYPE T>
-uint32_t getDimmSlct( TARGETING::TargetHandle_t i_dimmTarget );
+uint8_t getDimmSlct( TARGETING::TargetHandle_t i_trgt );
/**
* @brief checks dram widh ( x4 ) for mba
OpenPOWER on IntegriCloud