diff options
15 files changed, 722 insertions, 257 deletions
diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C index 935cfee23..a1248bc4f 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C @@ -117,12 +117,10 @@ int32_t CalloutResolution::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) reduce memory utilization. */ - if( PRDcallout::TYPE_TARGET == xMruCallout.getType( ) ) + if ( PRDcalloutData::TYPE_TARGET == xMruCallout.getType() ) { - PRDcallout l_targetCallout( - ServiceDataCollector::getTargetAnalyzed( ) ); - - io_serviceData.service_data->SetCallout( l_targetCallout ,xPriority ); + PRDcallout l_targetCallout( ServiceDataCollector::getTargetAnalyzed() ); + io_serviceData.service_data->SetCallout( l_targetCallout, xPriority ); } else { diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H b/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H index 1a21a324f..00914dd1c 100755 --- a/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H +++ b/src/usr/diag/prdf/common/framework/resolution/prdfCallouts.H @@ -28,21 +28,11 @@ // Includes //------------------------------------------------------------------------------ -#ifndef __HOSTBOOT_MODULE - -#include <srci.H> - -#endif - #include <prdfCalloutMap.H> +#include <prdfCalloutsData.H> #include <prdfEnums.H> #include <prdfMemoryMru.H> - -#ifdef PRDF_ERRL_PARSER - #include <prdfTargetFwdRef.H> -#else - #include <prdfPlatServices.H> -#endif +#include <prdfPlatServices.H> namespace PRDF { @@ -63,62 +53,53 @@ class PRDcallout { public: - enum MruType - { - TYPE_NONE, - TYPE_TARGET, - TYPE_MEMMRU, - TYPE_SYMFRU, - }; - /** @brief Constructor */ - PRDcallout() : iv_type(TYPE_NONE) + PRDcallout() : iv_type(PRDcalloutData::TYPE_NONE) { iv_meldValue.u32 = 0; } /** @brief Constructor from TargetHandle_t */ - PRDcallout( TARGETING::TargetHandle_t i_target ) : iv_type(TYPE_TARGET) + PRDcallout( TARGETING::TargetHandle_t i_target ) : + iv_type(PRDcalloutData::TYPE_TARGET) { iv_meldValue.target = i_target; } - /** @brief Constructor from PrdfMemoryMru */ - PRDcallout( const PrdfMemoryMru & i_memmru ) : iv_type(TYPE_MEMMRU) + /** @brief Constructor from MemoryMru */ + PRDcallout( const MemoryMru & i_memmru ) : + iv_type(PRDcalloutData::TYPE_MEMMRU) { iv_meldValue.u32 = i_memmru.toUint32(); } /** @brief Constructor from SymbolicFru */ - PRDcallout( SymbolicFru i_symfru ) : iv_type(TYPE_SYMFRU) + PRDcallout( SymbolicFru i_symfru ) : iv_type(PRDcalloutData::TYPE_SYMFRU) { iv_meldValue.symfru = i_symfru; } -#ifndef PRDF_ERRL_PARSER - /** @brief Constructor from raw data */ - PRDcallout( uint32_t i_val, MruType i_type ) : iv_type(i_type) + PRDcallout( uint32_t i_val, PRDcalloutData::MruType i_type ) : + iv_type(i_type) { switch ( iv_type ) { - case TYPE_TARGET: + case PRDcalloutData::TYPE_TARGET: iv_meldValue.target = PlatServices::getTarget(i_val); break; - case TYPE_MEMMRU: - case TYPE_SYMFRU: + case PRDcalloutData::TYPE_MEMMRU: + case PRDcalloutData::TYPE_SYMFRU: iv_meldValue.u32 = i_val; break; default: - iv_type = TYPE_NONE; + iv_type = PRDcalloutData::TYPE_NONE; iv_meldValue.u32 = 0; } } -#endif - /** @brief Assignment from TargetHandle_t */ PRDcallout & operator=( TARGETING::TargetHandle_t i_target ) { - iv_type = TYPE_TARGET; + iv_type = PRDcalloutData::TYPE_TARGET; iv_meldValue.target = i_target; return *this; } - /** @brief Assignment from PrdfMemoryMru */ - PRDcallout & operator=( const PrdfMemoryMru & i_memmru ) + /** @brief Assignment from MemoryMru */ + PRDcallout & operator=( const MemoryMru & i_memmru ) { - iv_type = TYPE_MEMMRU; + iv_type = PRDcalloutData::TYPE_MEMMRU; iv_meldValue.u32 = i_memmru.toUint32(); return *this; } @@ -126,7 +107,7 @@ class PRDcallout /** @brief Assignment from SymbolicFru */ PRDcallout & operator=( SymbolicFru i_symfru ) { - iv_type = TYPE_SYMFRU; + iv_type = PRDcalloutData::TYPE_SYMFRU; iv_meldValue.symfru = i_symfru; return *this; } @@ -139,7 +120,7 @@ class PRDcallout // Otherwise, the single-argument constructors listed above will do // automatic type conversion, which will allow code like this: // - // TargetHandle_t t; PrdfMemoryMru m; + // TargetHandle_t t; MemoryMru m; // if ( t == m ) ... // // The safest way to prevent this is to make all of the single-argument @@ -153,7 +134,7 @@ class PRDcallout { if ( iv_type == r.iv_type ) { - return ( TYPE_TARGET == iv_type ) + return ( PRDcalloutData::TYPE_TARGET == iv_type ) ? iv_meldValue.target == r.iv_meldValue.target : iv_meldValue.u32 == r.iv_meldValue.u32; } @@ -162,36 +143,32 @@ class PRDcallout } /** @brief Returns the callout type. */ - MruType getType() const { return iv_type; } + PRDcalloutData::MruType getType() const { return iv_type; } /** @returns Returns the TargetHandle_t. */ TARGETING::TargetHandle_t getTarget() const { return iv_meldValue.target; } - /** @returns Returns the PrdfMemoryMru. */ - PrdfMemoryMru getMemMru() const { return PrdfMemoryMru(iv_meldValue.u32); } - -#ifndef PRDF_ERRL_PARSER + /** @returns Returns the MemoryMru. */ + MemoryMru getMemMru() const { return MemoryMru(iv_meldValue.u32); } /** @brief Returns a uint32_t representation of the callout */ uint32_t flatten() const { switch ( iv_type ) { - case TYPE_TARGET: + case PRDcalloutData::TYPE_TARGET: return PlatServices::getHuid(iv_meldValue.target); break; - case TYPE_MEMMRU: - case TYPE_SYMFRU: + case PRDcalloutData::TYPE_MEMMRU: + case PRDcalloutData::TYPE_SYMFRU: return iv_meldValue.u32; break; default: return 0; } } -#endif - private: - MruType iv_type; + PRDcalloutData::MruType iv_type; union { diff --git a/src/usr/diag/prdf/common/plat/prdfMemoryMru.C b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H index 77ead6ca4..f85f6eb3d 100755..100644 --- a/src/usr/diag/prdf/common/plat/prdfMemoryMru.C +++ b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/usr/diag/prdf/common/plat/prdfMemoryMru.C $ */ +/* $Source: src/usr/diag/prdf/common/framework/resolution/prdfCalloutsData.H $ */ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2008,2013 */ +/* COPYRIGHT International Business Machines Corp. 2013 */ /* */ /* p1 */ /* */ @@ -21,18 +21,32 @@ /* */ /* IBM_PROLOG_END_TAG */ -#include <prdfMemoryMru.H> +/** @file prdfCalloutsData.H + * @brief This is specifically designed to be included in both functional and + * error log parsing code (i.e. must be able to compile in PPC and + * x86.nfp contexts). + */ -//------------------------------------------------------------------------------ +#ifndef __prdfCalloutsData_H +#define __prdfCalloutsData_H -#ifndef PRDF_ERRL_PARSER +namespace PRDF +{ + +namespace PRDcalloutData +{ -TARGETING::TargetHandleList PrdfMemoryMru::getCalloutList() const +enum MruType { - TARGETING::TargetHandleList o_dimmList; + TYPE_NONE, + TYPE_TARGET, + TYPE_MEMMRU, + TYPE_SYMFRU, +}; + +} // end namespace PRDcalloutData - return o_dimmList; -} +} // end namespace PRDF -#endif +#endif // __prdfCalloutsData_H diff --git a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C index 6890a5537..74fb4f752 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C +++ b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C @@ -136,7 +136,7 @@ void ServiceDataCollector::SetCallout( PRDcallout mru, { bool found = false; - if ( PRDcallout::TYPE_TARGET == mru.getType() ) + if ( PRDcalloutData::TYPE_TARGET == mru.getType() ) { // Ensuring target is not NULL if ( NULL == mru.getTarget() ) @@ -296,6 +296,8 @@ uint32_t ServiceDataCollector::Flatten(uint8_t * i_buffer, uint32_t & io_size) c ServiceDataCollector & ServiceDataCollector::operator=( const uint8_t * i_flatdata ) { + using namespace PRDcalloutData; + error_signature.setChipId( buffer_get32(i_flatdata) ); error_signature.setSigId( buffer_get32(i_flatdata) ); @@ -303,9 +305,9 @@ ServiceDataCollector & ServiceDataCollector::operator=( uint32_t value = buffer_get32(i_flatdata); // number of callouts for ( uint32_t i = 0; i < value; ++i ) { - PRDcallout::MruType mt = (PRDcallout::MruType) buffer_get32(i_flatdata); - uint32_t mru = buffer_get32(i_flatdata); - PRDpriority priority = (PRDpriority) buffer_get32(i_flatdata); + MruType mt = (MruType) buffer_get32(i_flatdata); + uint32_t mru = buffer_get32(i_flatdata); + PRDpriority priority = (PRDpriority) buffer_get32(i_flatdata); PRDcallout callout( mru, mt ); xMruList.push_back( SdcCallout(callout, priority) ); diff --git a/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C b/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C index 7138010de..467717fe1 100755 --- a/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C +++ b/src/usr/diag/prdf/common/framework/service/prdf_ras_services.C @@ -572,7 +572,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, for (SDC_MRU_LIST::iterator i = fspmrulist.begin(); i < fspmrulist.end(); ++i) { thiscallout = i->callout; - if ( PRDcallout::TYPE_SYMFRU == thiscallout.getType() ) + if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() ) { if ( (EPUB_PRC_SP_CODE == thiscallout.flatten()) || (EPUB_PRC_PHYP_CODE == thiscallout.flatten()) ) @@ -588,13 +588,11 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, SecondLevel = true; } } - else if ( PRDcallout::TYPE_MEMMRU == thiscallout.getType() ) + else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() ) { - PrdfMemoryMru memMru = thiscallout.getMemMru(); + MemoryMru memMru (thiscallout.flatten()); SrcWord9 = memMru.toUint32(); // Get MemMru value -/* FIXME: RTC 47288 Add support after refactoring PrdfMemoryMru - TargetHandleList partList = memMru.getCalloutList(); uint32_t partCount = partList.size(); @@ -604,7 +602,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, // If we are in Concurrent Maintenance Mode, we will need to disable // the Deferred Deconfig, if the callouts are not HOM_CM_FUNCTIONAL. - // FIXME PlatServices::inCMMode() not available yet + /* FIXME: RTC 50063 PlatServices::inCMMode() not available yet if (PlatServices::inCMMode()) { if (partCount < 1) @@ -628,9 +626,9 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, } } } -*/ + */ } - else // PRDcallout::TYPE_TARGET + else // PRDcalloutData::TYPE_TARGET { HW = true; // Hardware callout @@ -741,7 +739,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, //************************************************************** // Add SDC Capture data to Error Log User Data here only if // there are 4 or more callouts, - // (including Dimm callouts in the PrdfMemoryMru). + // (including Dimm callouts in the MemoryMru). //************************************************************** bool capDataAdded = false; if (calloutsPlusDimms > 3) @@ -763,11 +761,12 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, //************************************************************** fspmrulist = sdc.GetMruList(); uint32_t calloutcount = fspmrulist.size(); - for (SDC_MRU_LIST::iterator i = fspmrulist.begin(); i < fspmrulist.end(); ++i) + for ( SDC_MRU_LIST::iterator i = fspmrulist.begin(); + i < fspmrulist.end(); ++i ) { thispriority = (*i).priority; thiscallout = (*i).callout; - if ( PRDcallout::TYPE_TARGET == thiscallout.getType() ) + if ( PRDcalloutData::TYPE_TARGET == thiscallout.getType() ) { TargetHandle_t target = thiscallout.getTarget(); // Don't deconfig a Memory Controller for Bus Errors (Mc and SuperNova @@ -801,23 +800,27 @@ errlHndl_t ErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, hcdbUpdate); } - else if ( PRDcallout::TYPE_MEMMRU == thiscallout.getType() ) + else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() ) { - // FIXME: RTC 47288 PrdfMemoryMru will need refactor later - PrdfMemoryMru memMru = thiscallout.getMemMru(); - - PRDF_HW_ADD_MEMMRU_CALLOUT(ForceTerminate, - memMru, - thispriority, - deconfigState, - gardState, - errLog, - writeVPD, - gardErrType, - severityParm, - hcdbUpdate); + MemoryMru memMru (thiscallout.flatten()); + + TargetHandleList partList = memMru.getCalloutList(); + for ( TargetHandleList::iterator it = partList.begin(); + it != partList.end(); it++ ) + { + PRDF_HW_ADD_CALLOUT( ForceTerminate, + *it, + thispriority, + deconfigState, + gardState, + errLog, + writeVPD, + gardErrType, + severityParm, + hcdbUpdate ); + } } - else if ( PRDcallout::TYPE_SYMFRU == thiscallout.getType() ) + else if ( PRDcalloutData::TYPE_SYMFRU == thiscallout.getType() ) { thisProcedureID = epubProcedureID(thiscallout.flatten()); diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C index e501bb7be..39917a826 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C @@ -26,9 +26,17 @@ #include <prdfCalloutUtil.H> #include <iipServiceDataCollector.h> +#include <prdfCenAddress.H> +#include <prdfPlatServices.H> +#include <prdfTrace.H> + +using namespace TARGETING; namespace PRDF { + +using namespace PlatServices; + namespace CalloutUtil { @@ -39,6 +47,99 @@ void defaultError( STEP_CODE_DATA_STRUCT & i_sc ) i_sc.service_data->SetServiceCall(); } +//------------------------------------------------------------------------------ + +TargetHandleList getConnectedDimms( TargetHandle_t i_mba, + const CenRank & i_rank ) +{ + #define PRDF_FUNC "[CalloutUtil::getConnectedDimms] " + + TargetHandleList o_list; + + if ( TYPE_MBA != getTargetType(i_mba) ) + { + PRDF_ERR( PRDF_FUNC"Invalid target type: HUID=0x%08x", getHuid(i_mba) ); + } + else + { + TargetHandleList dimmList = getConnected( i_mba, TYPE_DIMM ); + for ( TargetHandleList::iterator dimmIt = dimmList.begin(); + dimmIt != dimmList.end(); dimmIt++) + { + uint8_t dimmSlct; + int32_t l_rc = getMbaDimm( *dimmIt, dimmSlct ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"getMbaDimm(0x%08x) failed", + getHuid(*dimmIt) ); + continue; + } + + if ( dimmSlct == i_rank.getDimmSlct() ) + { + o_list.push_back( *dimmIt ); + } + } + } + + return o_list; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +TargetHandleList getConnectedDimms( TargetHandle_t i_mba ) +{ + TargetHandleList o_list; + + if ( TYPE_MBA != getTargetType(i_mba) ) + { + PRDF_ERR( "[CalloutUtil::getConnectedDimms] Invalid target type: " + "HUID=0x%08x", getHuid(i_mba) ); + } + else + o_list = getConnected( i_mba, TYPE_DIMM ); + + return o_list; +} + +//------------------------------------------------------------------------------ + +TargetHandleList getConnectedDimms( TargetHandle_t i_mba, + const CenRank & i_rank, + uint8_t i_port ) +{ + #define PRDF_FUNC "[CalloutUtil::getConnectedDimms] " + + TargetHandleList o_list; + + TargetHandleList dimmList = getConnectedDimms( i_mba, i_rank ); + + for ( TargetHandleList::iterator dimmIt = dimmList.begin(); + dimmIt != dimmList.end(); dimmIt++) + { + uint8_t portSlct; + int32_t l_rc = getMbaPort( *dimmIt, portSlct ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"getMbaPort(0x%08x) failed", + getHuid(*dimmIt) ); + continue; + } + + if ( portSlct == i_port ) + { + o_list.push_back( *dimmIt ); + } + } + + return o_list; + + #undef PRDF_FUNC +} + } // end namespace CalloutUtil + } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H index e364d5fbb..ff4f97baf 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H @@ -24,6 +24,8 @@ #ifndef prdfCalloutUtil_H #define prdfCalloutUtil_H +#include <prdfPlatServices.H> + /** @file prdfCalloutUtil.H * @brief Utility functions for common, non-trivial callouts. */ @@ -31,6 +33,7 @@ namespace PRDF { +class CenRank; struct STEP_CODE_DATA_STRUCT; namespace CalloutUtil @@ -44,7 +47,32 @@ namespace CalloutUtil */ void defaultError( STEP_CODE_DATA_STRUCT & i_sc ); +/** + * @param i_mba The target MBA. + * @param i_rank The target rank. + * @return A list of DIMMs connected to the MBA and rank. + */ +TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank ); + +/** + * @param i_mba The target MBA. + * @return A list of DIMMs connected to the MBA. + */ +TARGETING::TargetHandleList getConnectedDimms(TARGETING::TargetHandle_t i_mba); + +/** + * @param i_mba The target MBA. + * @param i_rank The target rank. + * @param i_port MBA port. + * @return A list of DIMMs connected to the MBA and rank on a port. + */ +TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank, + uint8_t i_port ); + } // end namespace CalloutUtil + } // end namespace PRDF #endif // prdfCalloutUtil_H diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C new file mode 100755 index 000000000..3f9c3d3dc --- /dev/null +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C @@ -0,0 +1,262 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2008,2013 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ + +/** @file prdfMemoryMru.C */ + +#include <prdfMemoryMru.H> + +#include <prdfCalloutUtil.H> +#include <prdfTrace.H> + +using namespace TARGETING; + +namespace PRDF +{ + +using namespace MemoryMruData; +using namespace PlatServices; + +MemoryMru::MemoryMru() : + iv_mbaTarget(NULL), iv_rank(), iv_special(NO_SPECIAL_CALLOUT) +{ + iv_memMruMeld.u = 0; +} + +//------------------------------------------------------------------------------ + +MemoryMru::MemoryMru( uint32_t i_memMru ) : + iv_mbaTarget(NULL), iv_rank(), iv_special(NO_SPECIAL_CALLOUT) +{ + #define PRDF_FUNC "[MemoryMru::MemoryMru] " + + iv_memMruMeld.u = i_memMru; + + iv_memMruMeld.s.valid = 0; // initially invalidated + + do + { + // Get MBA target + TargetHandleList nodeList = getFunctionalTargetList( TYPE_NODE ); + for ( TargetHandleList::iterator nodeIt = nodeList.begin(); + nodeIt != nodeList.end(); nodeIt++ ) + { + if ( iv_memMruMeld.s.nodePos != getTargetPosition(*nodeIt) ) + continue; + + TargetHandleList mbaList = getConnected( *nodeIt, TYPE_MBA ); + for ( TargetHandleList::iterator mbaIt = mbaList.begin(); + mbaIt != mbaList.end(); mbaIt++ ) + { + if ( iv_memMruMeld.s.mbaPos == getTargetPosition(*mbaIt) ) + { + iv_mbaTarget = *mbaIt; + break; + } + } + if ( NULL != iv_mbaTarget ) break; + } + if ( NULL == iv_mbaTarget ) + { + PRDF_ERR( PRDF_FUNC"Could not find functional MBA target: " + "nodePos=%d mbaPos=%d", iv_memMruMeld.s.nodePos, + iv_memMruMeld.s.mbaPos ); + break; + } + + // Get the rank + iv_rank = CenRank( iv_memMruMeld.s.rank ); + + // Get the symbol or special callout + if ( (FIRST_SPECIAL_CALLOUT <= iv_memMruMeld.s.symbol) && + (iv_memMruMeld.s.symbol <= LAST_SPECIAL_CALLOUT) ) + { + iv_special = (MemoryMruData::Callout)iv_memMruMeld.s.symbol; + } + else + { + if ( SYMBOLS_PER_RANK <= iv_memMruMeld.s.symbol) + { + PRDF_ERR( PRDF_FUNC"Invalid symbol value :%u", + iv_memMruMeld.s.symbol); + break; + } + + int32_t rc = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank, + iv_memMruMeld.s.symbol, + iv_memMruMeld.s.pins, + iv_symbol ); + + if ( SUCCESS != rc) + { + PRDF_ERR( PRDF_FUNC"Can not create symbol from symbol value" + " :%u, pins:%u, rank:%u", + iv_memMruMeld.s.symbol, + iv_memMruMeld.s.pins, + iv_memMruMeld.s.rank ); + break; + } + + // Validation checks + CenSymbol::WiringType type = iv_symbol.getWiringType(); + + if ( type != CenSymbol::WiringType (iv_memMruMeld.s.wiringType)) + { + PRDF_ERR( PRDF_FUNC"Wiring Type does not match type:%u " + "iv_memMruMeld.s.wiringType :%u", + type, iv_memMruMeld.s.wiringType); + break; + } + + } + + // If the code gets to this point the MemoryMru is valid. + iv_memMruMeld.s.valid = 1; + + } while (0); + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +MemoryMru::MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, + const CenRank & i_rank, const CenSymbol & i_symbol ) : + iv_mbaTarget(i_mbaTarget), iv_rank(i_rank), + iv_special(NO_SPECIAL_CALLOUT), iv_symbol( i_symbol ) +{ + #define PRDF_FUNC "[MemoryMru::MemoryMru] " + + iv_memMruMeld.u = 0; + + do + { + TargetHandleList nodeList = getConnected( iv_mbaTarget, TYPE_NODE ); + if ( 1 != nodeList.size() ) + { + PRDF_ERR( PRDF_FUNC"Could not find node attached to MBA 0x%08x", + getHuid(iv_mbaTarget) ); + break; + } + + iv_memMruMeld.s.nodePos = getTargetPosition( nodeList[0] ); + iv_memMruMeld.s.mbaPos = getTargetPosition( iv_mbaTarget ); + iv_memMruMeld.s.rank = iv_rank.flatten(); + iv_memMruMeld.s.symbol = iv_symbol.getSymbol(); + iv_memMruMeld.s.pins = iv_symbol.getPins(); + //TODO: RTC 68096 Add support for DRAM spare + iv_memMruMeld.s.dramSpared = 0; + iv_memMruMeld.s.wiringType = iv_symbol.getWiringType(); + + // If the code gets to this point the MemoryMru is valid. + iv_memMruMeld.s.valid = 1; + + } while (0); + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +MemoryMru::MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, + const CenRank & i_rank, + MemoryMruData::Callout i_specialCallout ) : + iv_mbaTarget(i_mbaTarget), iv_rank(i_rank), iv_special(i_specialCallout) +{ + #define PRDF_FUNC "[MemoryMru::MemoryMru] " + + iv_memMruMeld.u = 0; + + do + { + TargetHandleList nodeList = getConnected( iv_mbaTarget, TYPE_NODE ); + if ( 1 != nodeList.size() ) + { + PRDF_ERR( PRDF_FUNC"Could not find node attached to MBA 0x%08x", + getHuid(iv_mbaTarget) ); + break; + } + + iv_memMruMeld.s.nodePos = getTargetPosition( nodeList[0] ); + iv_memMruMeld.s.mbaPos = getTargetPosition( iv_mbaTarget ); + iv_memMruMeld.s.rank = iv_rank.flatten(); + iv_memMruMeld.s.symbol = iv_special; + + // If the code gets to this point the MemoryMru is valid. + iv_memMruMeld.s.valid = 1; + + } while (0); + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +TargetHandleList MemoryMru::getCalloutList() const +{ + #define PRDF_FUNC "[MemoryMru::getCalloutList] " + + TargetHandleList o_list; + + if ( 0 == iv_memMruMeld.s.valid ) + { + PRDF_ERR( PRDF_FUNC"MemoryMru 0x%08x not valid.", iv_memMruMeld.u ); + } + else + { + if ( NO_SPECIAL_CALLOUT != iv_special ) + { + switch ( iv_special ) + { + case CALLOUT_RANK: + o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget, + iv_rank ); + break; + case CALLOUT_RANK_AND_MBA: + o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget, + iv_rank ); + o_list.push_back( iv_mbaTarget ); + break; + case CALLOUT_ALL_MEM: + o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget ); + break; + default: + PRDF_ERR( PRDF_FUNC"MemoryMruData::Callout 0x%02x not " + "supported", iv_special ); + } + } + else + { + // Add DIMM represented by symbol + uint8_t ps = iv_symbol.getPortSlct(); + o_list = CalloutUtil::getConnectedDimms( iv_mbaTarget, + iv_rank, ps ); + } + } + + return o_list; + + #undef PRDF_FUNC +} + +} // end namespace PRDF + diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H new file mode 100755 index 000000000..a1cb63ab0 --- /dev/null +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H @@ -0,0 +1,95 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2008,2013 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ + +/** @file prdfMemoryMru.H */ + +#ifndef __prdfMemoryMru_H +#define __prdfMemoryMru_H + +#include <prdfCenAddress.H> +#include <prdfMemoryMruData.H> +#include <prdfPlatServices.H> +#include <prdfCenSymbol.H> + +namespace PRDF +{ + +/** + * @brief This is a container object that assists with callouts and FFDC for the + * mainstore memory subsystem. The intent is that it can show with the + * smallest possible granularity what part is failing (i.e. DIMM, rank, + * DRAM, a single pin on a DRAM, etc.). + */ +class MemoryMru +{ + public: // Constructors + + /** @brief Default contructor. */ + MemoryMru(); + + /** + * @brief Constructor from 32-bit representation of a memory MRU. + * @param i_memMru A 32-bit representation of a memory MRU. + */ + explicit MemoryMru( uint32_t i_memMru ); + + /** + * @brief Constructor for single DIMM callouts. + * @param i_mbaTarget The MBA in which the error occurred. + * @param i_rank The rank in which the error occurred. + * @param i_symbol The symbol in which the error occurred. + */ + MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, const CenRank & i_rank, + const CenSymbol & i_symbol ); + + /** + * @brief Constructor for special callouts. + * @param i_mbaTarget The MBA in which error has occured + * @param i_rank The rank in which the error occurred. + * @param i_specialCallout See enum MemoryMruData::Callout. + */ + MemoryMru( TARGETING::TargetHandle_t i_mbaTarget, const CenRank & i_rank, + MemoryMruData::Callout i_specialCallout ); + + public: // functions + + /** @return The 32-bit representation of this MemoryMru. */ + uint32_t toUint32() const { return iv_memMruMeld.u; } + + /** @return A list of targets that are represented by this MemoryMru. */ + TARGETING::TargetHandleList getCalloutList() const; + + private: // instance variables + + MemoryMruData::MemMruMeld iv_memMruMeld; + + TARGETING::TargetHandle_t iv_mbaTarget; ///< Target MBA. + CenRank iv_rank; ///< Target rank + MemoryMruData::Callout iv_special; ///< See enum MemoryMruData::Callout + CenSymbol iv_symbol; ///< Target symbol +}; + +} // end namespace PRDF + +#endif // __prdfMemoryMru_H + diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H new file mode 100644 index 000000000..ee24f331a --- /dev/null +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H @@ -0,0 +1,103 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMruData.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2013 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ + +/** @file prdfMemoryMruData.H + * @brief This is specifically designed to be included in both functional and + * error log parsing code (i.e. must be able to compile in PPC and + * x86.nfp contexts). + */ + +#ifndef __prdfMemoryMruData_H +#define __prdfMemoryMruData_H + +#include <stdint.h> + +namespace PRDF +{ + +namespace MemoryMruData +{ + +/** Typically a MemoryMru callout is associated with a symbol (single DIMM + * callout), however, there are times were we cannot isolate down that far and + * instead need to callout a rank (pair of DIMMs) and the assoicated MBA. + * This enums will be used to indicate if any special callouts are needed. + */ +enum Callout +{ + // NOTE: These values will be stored in the symbol field of the uint32_t + // version of the MemoryMru so the values must fit within the + // 7-bits field and not collide with a valid symbol value. + NO_SPECIAL_CALLOUT = 0x6f, + FIRST_SPECIAL_CALLOUT = 0x70, + + CALLOUT_RANK = FIRST_SPECIAL_CALLOUT, + CALLOUT_RANK_AND_MBA, + CALLOUT_ALL_MEM, + + LAST_SPECIAL_CALLOUT = CALLOUT_ALL_MEM, // Absolute last value is 0x7f +}; + +union MemMruMeld +{ + uint32_t u; ///< The 32-bit version of the MemoryMru + + struct + { + // NOTE: The combined total of all bits in this struct must add up to + // 32 bits. + // NOTE: There are some unused bits that can be used for future needs + // such as version number or wiring type. + // NOTE: The arrangement of bits should not change. This struct will be + // used for parsing the MemoryMru in the error log parser, which + // wil be used in multiple releases. You should be able to add a + // field using the unused bits depending on the usage of the + // field, however, if the structure changes, you must add a + // version field so that the error log parser know which format to + // used. + + uint32_t valid : 1; ///< Used to indicate nothing failed while + ///< building the object (1=valid, 0=not valid) + uint32_t mbaPos : 7; ///< MBA position within node (0-127) + + uint32_t pins : 2; ///< Even and/or Odd symbol pins + uint32_t nodePos : 3; ///< Node position (0-7) + uint32_t rank : 3; ///< Rank (0-7) + + uint32_t dramSpared : 1; ///< True if symbol is on spared DRAM + uint32_t symbol : 7; ///< Symbol or SpecialCallout + + // TODO: RTC 67376 Check if width for wiring type is enough + uint32_t wiringType : 5; ///< Wiring type + + uint32_t unused : 3; ///< Reserved for future use + + } s; ///< A struct defining the 32-bit version of the MemoryMru +}; + +} // end namespace MemoryMruData + +} // end namespace PRDF + +#endif // __prdfMemoryMruData_H + diff --git a/src/usr/diag/prdf/common/plat/prdfMemoryMru.H b/src/usr/diag/prdf/common/plat/prdfMemoryMru.H deleted file mode 100755 index 282f7197a..000000000 --- a/src/usr/diag/prdf/common/plat/prdfMemoryMru.H +++ /dev/null @@ -1,114 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/common/plat/prdfMemoryMru.H $ */ -/* */ -/* IBM CONFIDENTIAL */ -/* */ -/* COPYRIGHT International Business Machines Corp. 2008,2013 */ -/* */ -/* p1 */ -/* */ -/* Object Code Only (OCO) source materials */ -/* Licensed Internal Code Source Materials */ -/* IBM HostBoot Licensed Internal Code */ -/* */ -/* The source code for this program is not published or otherwise */ -/* divested of its trade secrets, irrespective of what has been */ -/* deposited with the U.S. Copyright Office. */ -/* */ -/* Origin: 30 */ -/* */ -/* IBM_PROLOG_END_TAG */ - -#ifndef prdfMemoryMru_H -#define prdfMemoryMru_H - -/** @file prdfMemoryMru.H - */ - -#include <stdint.h> - -#ifndef PRDF_ERRL_PARSER - #include <prdfPlatServices.H> -#endif - -// FIXME: RTC 47288 Will need to wrap this in PRDF namespace once external -// interfaces are removed/modified. - -class PrdfMemoryMru -{ - public: - - /** - * @brief Used to specify the PrdfMemoryMru type. - * - * One requirement for all memory MRUs is that it must be able to be - * converted into a 32-bit representation of the object. This number is then - * passed around is different places, one in particular is word 9 of the - * SRC. Eventually, data will need to be retrieved from the number. Since - * the structure of each memory MRU may change, bits[0:2] of the 32-bit - * number is reserved for the version type of the memory MRU. Based on the - * version a new memory MRU can be constructed. - * - * NOTE: The reason MEMMRU_ECLIPZ starts with 3 is because in the original - * P6 memory MRU there was a 4-bit field for the version type in which - * the value was 6 (for P6). To save as much space as possible the - * version field was reduced to 3 bits and the P6 version as changed - * to 3. Thus, saving a bit of space without compromising the value of - * that field. - */ - enum PrdfMemMruVersion - { - MEMMRU_INVALID = 0, ///< An invalid memory MRU - MEMMRU_ECLIPZ = 3, ///< A P6 MC memory MRU - MEMMRU_APOLLO = 5, ///< A P7 MC memory MRU - }; - - public: - - /** - * @brief Default contructor. - */ - PrdfMemoryMru() : iv_memMruUint32( 0 ) {} - - /** - * @brief Constructor from 32-bit representation of a memory MRU. - * @param i_memMruUint32 A 32-bit representation of a memory MRU. - */ - explicit PrdfMemoryMru( uint32_t i_memMruUint32 ) : - iv_memMruUint32( i_memMruUint32 ) - {} - - /** - * @brief Default destructor. - */ - virtual ~PrdfMemoryMru() {} - - /** - * @brief Returns the 32-bit representation of this memory MRU. - * @return The 32-bit representation of this memory MRU. - */ - virtual uint32_t toUint32() const - { return iv_memMruUint32; } - -#ifndef PRDF_ERRL_PARSER - - /** - * @brief Returns a list of targets that are represented by this - * memory MRU. - * @return The number of targets in the callout list is returned. - */ - virtual TARGETING::TargetHandleList getCalloutList() const; - -#endif - - private: - - /** The 32-bit representation of this memory MRU. */ - uint32_t iv_memMruUint32; - -}; - -#endif /* prdfMemoryMru_H */ - diff --git a/src/usr/diag/prdf/common/prd_framework.mk b/src/usr/diag/prdf/common/prd_framework.mk index c17cc2dcb..4bbc5194b 100755 --- a/src/usr/diag/prdf/common/prd_framework.mk +++ b/src/usr/diag/prdf/common/prd_framework.mk @@ -57,9 +57,6 @@ prd_service = \ prdfTargetServices.o \ xspprdsdbug.o -prd_ss = \ - prdfMemoryMru.o - prd_resolution = \ iipResolution.o \ iipResolutionFactory.o \ @@ -87,7 +84,6 @@ prd_object_files = \ ${prd_util} \ ${prd_config} \ ${prd_service} \ - ${prd_ss} \ ${prd_resolution} \ ${prd_register} \ diff --git a/src/usr/diag/prdf/common/prd_pegasus.mk b/src/usr/diag/prdf/common/prd_pegasus.mk index 6d384b44a..97259971d 100755 --- a/src/usr/diag/prdf/common/prd_pegasus.mk +++ b/src/usr/diag/prdf/common/prd_pegasus.mk @@ -43,5 +43,6 @@ prd_pegasus_specific = \ prdfLineDelete.o \ prdfPegasusConfigurator.o \ prdfCenMbaCaptureData.o \ + prdfMemoryMru.o \ prdfRegisterData.o diff --git a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C index de5c4d840..ba229628b 100644 --- a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C +++ b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C @@ -31,7 +31,8 @@ #include <prdfErrlUtil.H> #include "common/prdfEnums.H" #include "common/plat/pegasus/prdfCenMbaCaptureData.H" -#include "common/plat/prdfMemoryMru.H" +#include "common/plat/pegasus/prdfCenSymbol.H" +#include "common/plat/pegasus/prdfMemoryMru.H" #include "framework/service/prdfPlatServices.H" using namespace HWAS; @@ -104,17 +105,27 @@ bool addMemMruCallout(errlHndl_t & io_log, void * i_memMru) bool o_term = false; - PRDF_HW_ADD_MEMMRU_CALLOUT( - o_term, - *static_cast<PrdfMemoryMru *>(i_memMru), - SRCI_PRIORITY_HIGH, - HWSV::HOM_DECONFIG, - HWSV::HOM_DECONFIG_GARD, - io_log, - false, // don't write src to vpd - GARD_Predictive, - ERRL_SEV_PREDICTIVE, - false); // don't update hcdb + if ( NULL != i_memMru ) + { + MemoryMru *memMru = static_cast<MemoryMru *>(i_memMru); + + TargetHandleList partList = memMru->getCalloutList(); + for ( TargetHandleList::iterator it = partList.begin(); + it != partList.end(); it++ ) + { + PRDF_HW_ADD_CALLOUT( + o_term, + *it, + SRCI_PRIORITY_HIGH, + HWSV::HOM_DECONFIG, + HWSV::HOM_DECONFIG_GARD, + io_log, + false, // don't write src to vpd + GARD_Predictive, + ERRL_SEV_PREDICTIVE, + false); // don't update hcdb + } + } return o_term; } @@ -140,9 +151,7 @@ bool addDimmCallout(errlHndl_t & io_log, void * i_dimm) return o_term; } -bool processRepairedRanks( - TargetHandle_t i_mba, - uint8_t i_repairedRankMask) +bool processRepairedRanks( TargetHandle_t i_mba, uint8_t i_repairedRankMask ) { PRDF_DENTER("processRepairedRanks: %p, 0x%02x", i_mba, i_repairedRankMask); @@ -194,29 +203,29 @@ bool processRepairedRanks( continue; } - if((validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp)) - && validSymbol(cm)) + if ( (validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp)) && + validSymbol(cm) ) { - // this rank has both a steer - // and a chip mark + // This rank has both a steer and a chip mark. Call out the DIMM + // with the chip mark. - // FIXME replace with a real memory mru + CenRank rank ( rankNumber ); - struct GetMemoryMru + CenSymbol symbol; + int32_t rc = CenSymbol::fromSymbol( i_mba, rank, cm, + CenSymbol::BOTH_SYMBOL_DQS, + symbol ); + if ( SUCCESS != rc ) { - PrdfMemoryMru * operator()( - TargetHandle_t i_mba, - uint8_t i_rank, - uint8_t i_symbol) - { - return NULL; - } - - } getMemoryMru; + PRDF_ERR( "[processRepairedRanks] CenSymbol::fromSymbol() " + "failed: HUID=0x%08x rank=%d symbol=%d", + PlatServices::getHuid(i_mba), rank.flatten(), cm ); + continue; + } - PrdfMemoryMru * memoryMru = getMemoryMru(i_mba, rankNumber, cm); + MemoryMru memoryMru( i_mba, rank, symbol ); - commitRestoreCallout( &addMemMruCallout, memoryMru, i_mba ); + commitRestoreCallout( &addMemMruCallout, &memoryMru, i_mba ); calloutMade = true; } diff --git a/src/usr/diag/prdf/prdfErrlUtil.H b/src/usr/diag/prdf/prdfErrlUtil.H index 22dd8d3c6..997906475 100644 --- a/src/usr/diag/prdf/prdfErrlUtil.H +++ b/src/usr/diag/prdf/prdfErrlUtil.H @@ -209,16 +209,6 @@ (const HWAS::GARD_ErrorType)i_gardErrType) /** - * @brief Error log interface to add a HW callout to an existing error log. - */ -// FIXME:RTC: 65609 will address this issue. -// will need to implement later -#define PRDF_HW_ADD_MEMMRU_CALLOUT(io_sysTerm, i_memMRU, i_priority, \ - i_deconfigState, i_gardState, \ - io_errl, i_writeVpd, \ - i_gardErrType, i_severity, i_hcdb_update) - -/** * @brief Process's pending deconfig and GARD service actions * and thencommits and deletes the error log. */ |