diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2015-02-05 16:13:56 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-03-01 16:46:48 -0600 |
commit | 8d8a1ea5d113eb0760f764e391f6c9f1856244ac (patch) | |
tree | 5d5dc10db90d79af2c00e7794e655409c58bd193 /src/usr | |
parent | daf669b47a3ebf6fe8f116a25cd026b11ba9e2c6 (diff) | |
download | talos-hostboot-8d8a1ea5d113eb0760f764e391f6c9f1856244ac.tar.gz talos-hostboot-8d8a1ea5d113eb0760f764e391f6c9f1856244ac.zip |
PRD: no Dynamic Memory Deallocation on checkstop attns
Change-Id: If9323bbf3ec407f8385fce5811473d966be38527
CQ: SW293858
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/15574
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Tested-by: Jenkins Server
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16075
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr')
6 files changed, 131 insertions, 30 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C index d4a3b5cae..9cd272c53 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C @@ -49,13 +49,20 @@ #include <iipSystem.h> //For RemoveStoppedChips #ifdef __HOSTBOOT_MODULE + #include <stdio.h> + + #ifdef __HOSTBOOT_RUNTIME + #include <prdfCenMbaDynMemDealloc_rt.H> + #endif + #else #include <srcisrc.H> #include <utilreg.H> //For registry functions #include <evenmgt.H> #include <rmgrBaseClientLib.H> //for rmgrSyncFile #include <prdfSdcFileControl.H> + #include <prdfCenMbaDynMemDealloc_rt.H> #endif using namespace TARGETING; @@ -1010,6 +1017,80 @@ bool ErrDataService::SdcRetrieve(sdcSaveFlagsEnum i_saveFlag, void * o_buffer) #endif // if not __HOSTBOOT_MODULE //------------------------------------------------------------------------------ + +void ErrDataService::deallocateDimms( const SDC_MRU_LIST & i_mruList ) +{ + #define PRDF_FUNC "[ErrDataService::deallocateDimms] " + + #if !defined(__HOSTBOOT_MODULE) || defined(__HOSTBOOT_RUNTIME) // RT only + + do + { + // First check if Dynamic Memory Deallocation is supported. Then check + // if it is enabled for predictive callouts. + if ( !DEALLOC::isEnabled() || !isPredDynDeallocEnabled() ) break; + + TargetHandleList dimmList; + for ( SDC_MRU_LIST::const_iterator it = i_mruList.begin(); + it != i_mruList.end(); ++it ) + { + PRDcallout thiscallout = it->callout; + if ( PRDcalloutData::TYPE_TARGET == thiscallout.getType() ) + { + TargetHandle_t calloutTgt = thiscallout.getTarget(); + TYPE tgtType = getTargetType( calloutTgt ); + + if ( TYPE_L4 == tgtType ) + { + calloutTgt = getConnectedParent( calloutTgt, TYPE_MEMBUF ); + tgtType = TYPE_MEMBUF; + } + + if ( (TYPE_MEMBUF == tgtType) || + (TYPE_MBA == tgtType) || + (TYPE_MCS == tgtType) ) + { + TargetHandleList dimms = getConnected( calloutTgt, + TYPE_DIMM ); + dimmList.insert( dimmList.end(), dimms.begin(), + dimms.end() ); + } + else if ( TYPE_DIMM == tgtType ) + { + dimmList.push_back( calloutTgt ); + } + } + else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() ) + { + MemoryMru memMru (thiscallout.flatten()); + + TargetHandleList dimms = memMru.getCalloutList(); + for ( TargetHandleList::iterator dimm = dimms.begin(); + dimm != dimms.end(); ++dimm ) + { + if ( TYPE_DIMM == getTargetType(*dimm) ) + dimmList.push_back(*dimm); + } + } + } + + if( 0 == dimmList.size() ) break; + + int32_t rc = DEALLOC::dimmListGard( dimmList ); + if ( SUCCESS != rc ) + { + PRDF_ERR( PRDF_FUNC"dimmListGard failed" ); + break; + } + + } while(0); + + #endif + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ // RasServices class //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C index dff8a9bbf..69946f6ac 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C @@ -819,29 +819,32 @@ int32_t AnalyzeFetchUe( ExtensibleChip * i_membChip, MemoryMruData::CALLOUT_RANK ); i_sc.service_data->SetCallout( memmru ); - // Add a TPS request to the TD queue and ban any further TPS requests - // for this rank. - l_rc = mbadb->iv_tdCtlr.handleTdEvent( i_sc, rank, - CenMbaTdCtlrCommon::TPS_EVENT, - true ); - if ( SUCCESS != l_rc ) + if ( CHECK_STOP != i_sc.service_data->GetAttentionType() ) { - PRDF_ERR( PRDF_FUNC"handleTdEvent() failed: rank=m%ds%d", - rank.getMaster(), rank.getSlave() ); - // We are not adding break here as we still want to do lmbGard - // If you want to add any code after this which depends on result - // of handleTdEvent result, add the code judicially. - } + // Add a TPS request to the TD queue and ban any further TPS + // requests for this rank. + l_rc = mbadb->iv_tdCtlr.handleTdEvent( i_sc, rank, + CenMbaTdCtlrCommon::TPS_EVENT, + true ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"handleTdEvent() failed: rank=m%ds%d", + rank.getMaster(), rank.getSlave() ); + // We are not adding break here as we still want to do lmbGard + // If you want to add any code after this which depends on + // result of handleTdEvent result, add the code judicially. + } - #if !defined(__HOSTBOOT_MODULE) || defined(__HOSTBOOT_RUNTIME) - // Send lmb gard message to hypervisor. - int32_t lmbRc = DEALLOC::lmbGard( mbaChip, addr ); - if ( SUCCESS != lmbRc ) - { - PRDF_ERR( PRDF_FUNC"lmbGard() failed" ); - l_rc = lmbRc; break; + #if !defined(__HOSTBOOT_MODULE) || defined(__HOSTBOOT_RUNTIME) + // Send lmb gard message to hypervisor. + int32_t lmbRc = DEALLOC::lmbGard( mbaChip, addr ); + if ( SUCCESS != lmbRc ) + { + PRDF_ERR( PRDF_FUNC"lmbGard() failed" ); + l_rc = lmbRc; break; + } + #endif } - #endif } while (0); diff --git a/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.C b/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.C index a2b941fb8..113e255dc 100755 --- a/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.C +++ b/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.C @@ -391,6 +391,14 @@ int32_t rankGard( ExtensibleChip * i_mbaChip, CenRank i_rank ) //------------------------------------------------------------------------------ +bool isEnabled() +{ + return ( isHyprRunning() && (isHyprConfigPhyp() || isHyprConfigOpal()) && + !isMfgAvpEnabled() && !isMfgHdatAvpEnabled() ); +} + +//------------------------------------------------------------------------------ + int32_t pageGard( ExtensibleChip * i_mbaChip, CenAddr i_addr ) { #define PRDF_FUNC "[DEALLOC::pageGard] " @@ -399,6 +407,8 @@ int32_t pageGard( ExtensibleChip * i_mbaChip, CenAddr i_addr ) int32_t o_rc = SUCCESS; do { + if ( !isEnabled() ) break; // nothing to do + o_rc = getSystemAddr( i_mbaChip, i_addr, sysAddr); if( SUCCESS != o_rc ) { @@ -426,6 +436,8 @@ int32_t lmbGard( ExtensibleChip * i_mbaChip, CenAddr i_addr, bool i_isFetch ) int32_t o_rc = SUCCESS; do { + if ( !isEnabled() ) break; // nothing to do + if( isHyprConfigOpal() ) { o_rc = rankGard( i_mbaChip, i_addr.getRank() ); @@ -465,6 +477,8 @@ int32_t mbaGard( ExtensibleChip * i_mbaChip ) do { + if ( !isEnabled() ) break; // nothing to do + CenAddr startAddr, endAddr; TargetHandle_t mba = i_mbaChip->GetChipHandle(); o_rc = getMemAddrRange( mba, startAddr, endAddr ); @@ -507,6 +521,8 @@ int32_t dimmSlctGard( TargetHandle_t i_dimm ) do { + if ( !isEnabled() ) break; // nothing to do + TargetHandle_t mba = getConnectedParent( i_dimm, TYPE_MBA ); ExtensibleChip * mbaChip = (ExtensibleChip *)systemPtr->GetChip( mba ); diff --git a/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.H b/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.H index 862f9b1eb..f02f13860 100755 --- a/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.H +++ b/src/usr/diag/prdf/common/runtime/prdfCenMbaDynMemDealloc_rt.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -40,6 +40,11 @@ namespace DEALLOC { /** + * @return True, if Dynamic Memory Deallocation is enabled. False, otherwise. + */ +bool isEnabled(); + +/** * @brief Sends a page gard message to PHYP. * @param i_mbaChip MBA chip * @param i_addr The address to page gard. diff --git a/src/usr/diag/prdf/common/runtime/prdfPlatServices_rt.H b/src/usr/diag/prdf/common/runtime/prdfPlatServices_rt.H index e2cbb6a4b..5699d327e 100644 --- a/src/usr/diag/prdf/common/runtime/prdfPlatServices_rt.H +++ b/src/usr/diag/prdf/common/runtime/prdfPlatServices_rt.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014 */ +/* Contributors Listed Below - COPYRIGHT 2014,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -36,6 +36,9 @@ namespace PlatServices //## Memory specific functions //############################################################################## +// TODO: RTC 124850 need to add support for this. +inline bool isPredDynDeallocEnabled() { return false; } + /** * @brief Communicates a page gard request to the hypervisor. * @param i_systemAddress Any address in the target page. diff --git a/src/usr/diag/prdf/framework/service/prdfRasServices.C b/src/usr/diag/prdf/framework/service/prdfRasServices.C index 7099df6b8..747042550 100644 --- a/src/usr/diag/prdf/framework/service/prdfRasServices.C +++ b/src/usr/diag/prdf/framework/service/prdfRasServices.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -71,13 +71,6 @@ void ErrDataService::MnfgTrace( ErrorSignature * i_esig, //------------------------------------------------------------------------------ -void ErrDataService::deallocateDimms( const SDC_MRU_LIST & i_mruList ) -{ - //No OP for HB -} - -//------------------------------------------------------------------------------ - void ErrDataService::updateSrc( uint32_t i_user1, uint32_t i_user2, uint32_t i_user3, uint32_t i_user4, uint16_t i_rc ) |