diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2018-04-10 11:40:58 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-04-12 22:18:29 -0400 |
commit | 18dba5172c7d022d5b5b119d758fe167868cb00d (patch) | |
tree | 2bd065d8242d8f520841ac3ef2e74542e8d0a7bb | |
parent | 0fbaeccfec9bfc60e37dad4a7660040862b1e2ac (diff) | |
download | talos-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-x | src/usr/diag/prdf/common/plat/prdfTargetServices.C | 141 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/prdfTargetServices.H | 32 |
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 |