diff options
Diffstat (limited to 'src')
9 files changed, 179 insertions, 53 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H index 5b0f4f1e5..57a455751 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H +++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H @@ -141,6 +141,17 @@ bool isSmpCoherent(); */ bool isSapphireRunning( ); +/** + * @brief Initiate hwudump. + * @param i_target target handle. + * @param i_errl error handle + * @param i_errlActions error action flags + */ +void initiateUnitDump( TARGETING::TargetHandle_t i_target, + errlHndl_t i_errl, + uint32_t i_errlActions); + + //############################################################################## //## Processor specific functions //############################################################################## 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 598ffd80d..99dd14325 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C @@ -172,16 +172,28 @@ void RasServices::SaveRcForSrc(int32_t the_rc) //------------------------------------------------------------------------------ errlHndl_t RasServices::GenerateSrcPfa( ATTENTION_TYPE i_attnType, - ServiceDataCollector & i_sdc ) + ServiceDataCollector & i_sdc, + bool & o_initiateHwudump, + TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions) { - return iv_ErrDataService->GenerateSrcPfa( i_attnType, i_sdc ); + return iv_ErrDataService->GenerateSrcPfa( i_attnType, i_sdc, + o_initiateHwudump, + o_dumpTrgt, + o_dumpErrl, + o_dumpErrlActions); } //------------------------------------------------------------------------------ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, - ServiceDataCollector & i_sdc ) + ServiceDataCollector & i_sdc, + bool & o_initiateHwudump, + TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions) { #define PRDF_FUNC "[ErrDataService::GenerateSrcPfa] " @@ -708,6 +720,9 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, initPfaData( sdc, i_attnType, deferDeconfig, actionFlag, severityParm, prdGardErrType, pfaData, dumpTrgt ); + // set returned dump target + o_dumpTrgt = dumpTrgt; + //************************************************************** // Check for Terminating the system for non mnfg conditions. //************************************************************** @@ -793,7 +808,7 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // deconfiguration, dump/FFDC collection, etc. if ( sdc.IsUnitCS() && !sdc.IsUsingSavedSdc() ) { - handleUnitCS( dumpTrgt ); + handleUnitCS( dumpTrgt, o_initiateHwudump ); } // Commit the Error log @@ -802,24 +817,38 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, // for FSP specific SRC handling in the future MnfgTrace( esig, pfaData ); - PRDF_HW_COMMIT_ERRL( iv_errl, actionFlag ); - if ( NULL != iv_errl ) + if ( true == o_initiateHwudump ) + { + // the dump log will be deleted later in PRDF::main + // after the hwudump is initiated there. + o_dumpErrl = iv_errl; + iv_errl = NULL; + o_dumpErrlActions = actionFlag; + PRDF_TRAC( PRDF_FUNC"for target: 0x%08x, i_errl: 0x%08x, " + "i_errlActions: 0x%08x", getHuid(o_dumpTrgt), + ERRL_GETRC_SAFE(o_dumpErrl), o_dumpErrlActions ); + } + else { - // Just commit the log. - uint32_t dumpPlid = 0; - PRDF_GET_PLID(iv_errl, dumpPlid); + PRDF_HW_COMMIT_ERRL( iv_errl, actionFlag ); + if ( NULL != iv_errl ) + { + // Just commit the log. + uint32_t dumpPlid = 0; + PRDF_GET_PLID(iv_errl, dumpPlid); - uint32_t l_rc = 0; - PRDF_GET_RC(iv_errl, l_rc); + uint32_t l_rc = 0; + PRDF_GET_RC(iv_errl, l_rc); - uint16_t l_reasonCode = 0; - PRDF_GET_REASONCODE(iv_errl, l_reasonCode); + uint16_t l_reasonCode = 0; + PRDF_GET_REASONCODE(iv_errl, l_reasonCode); - PRDF_INF( PRDF_FUNC"Committing error log: PLID=%.8X, " - "ReasonCode=%.8X, RC=%.8X, actions=%.4X", - dumpPlid, l_reasonCode, l_rc, actionFlag ); + PRDF_INF( PRDF_FUNC"Committing error log: PLID=%.8X, " + "ReasonCode=%.8X, RC=%.8X, actions=%.4X", + dumpPlid, l_reasonCode, l_rc, actionFlag ); - PRDF_COMMIT_ERRL(iv_errl, actionFlag); + PRDF_COMMIT_ERRL(iv_errl, actionFlag); + } } } // If the Error Log is not committed (as due to a Terminate condtion), diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H index a5051f82d..919fe8804 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.H @@ -82,13 +82,22 @@ class ErrDataService @brief Create an SRC, PFA data, and Error log for the ServiceData provided @param[in] attn_type (see iipsdbug.h) @param[in,out] sdc (see iipServiceData.h) + @param[out] o_initiateHwudump whether or not to initiate hwudump + @param[out] o_dumpTrgt The DUMP target + @param[out] o_dumpErrl The DUMP error handle + @param[out] o_dumpErrlActions DUMP error action flags @return Error Log - Null if successfully committed @pre SetErrorTod()? @post Error log(s) build and logged, SRC built, etc. @exception None. @note */ - virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc); + virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, + ServiceDataCollector & sdc, + bool & o_initiateHwudump, + TARGETING::TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions ); /** @brief Set the TOD of the current error @@ -250,8 +259,10 @@ class ErrDataService /** * @brief Handles unit checkstops. * @param i_unitCsTarget chip(let) target. + * @param o_initiateHwudump whether or not to initiate hwudump */ - void handleUnitCS( TARGETING::TargetHandle_t i_unitCsTarget ); + void handleUnitCS( TARGETING::TargetHandle_t i_unitCsTarget, + bool & o_initiateHwudump ); /** * @brief Handles Centaur checkstop. @@ -262,8 +273,10 @@ class ErrDataService /** * @brief Handles Core checkstop. * @param i_exTarget EX target. + * @param o_initiateHwudump whether or not to initiate hwudump */ - void handleCoreUnitCS( TARGETING::TargetHandle_t i_exTarget ); + void handleCoreUnitCS( TARGETING::TargetHandle_t i_exTarget, + bool & o_initiateHwudump ); /** * @brief Handles NX checkstops. @@ -348,13 +361,21 @@ public: @brief Create an SRC, PFA data, and Error log for the ServiceData provided @param[in] attn_type (see iipsdbug.h) @param[in,out] sdc (see iipServiceData.h) + @param[out] o_initiateHwudump whether or not to initiate hwudump + @param[out] o_dumpTrgt The DUMP target. + @param[out] o_dumpErrl The DUMP error handle + @param[out] o_dumpErrlActions DUMP error action flags @return Error Log - Null if successfully committed @pre SetErrorTod()? @post Error log(s) build and logged, SRC built, etc. @exception None. */ virtual errlHndl_t GenerateSrcPfa( ATTENTION_TYPE attn_type, - ServiceDataCollector & sdc ); + ServiceDataCollector & sdc, + bool & o_initiateHwudump, + TARGETING::TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions ); static void SetTerminateOnCheckstop(bool setting) { diff --git a/src/usr/diag/prdf/common/framework/service/xspprdService.h b/src/usr/diag/prdf/common/framework/service/xspprdService.h index f0fac81f7..b2119f378 100755 --- a/src/usr/diag/prdf/common/framework/service/xspprdService.h +++ b/src/usr/diag/prdf/common/framework/service/xspprdService.h @@ -163,19 +163,24 @@ public: virtual void SaveRcForSrc(int32_t the_rc)=0; /** - Create an SRC, PFA data, and Error log for the ServiceData provided - <ul> - <br><b>Parameter: </b> attn_type (see iipsdbug.h) - <br><b>Parameter: </b> sdc (see iipServiceData.h) - <br><b>Returns: </b> Error Log - Null if successfully committed - <br><b>Requirements:</b> SetErrorTod()? - <br><b>Promises: </b> Error log(s) build and logged, SRC built, etc. - <br><b>Exceptions: </b> None. - <br><b>Notes: </b> - </ul><br> + @brief Create an SRC, PFA data, and Error log for the ServiceData provided + @param[in] attn_type (see iipsdbug.h) + @param[in,out] sdc (see iipServiceData.h) + @param[out] o_initiateHwudump whether or not to initiate hwudump + @param[out] o_dumpTrgt The DUMP target. + @param[out] o_dumpErrl The DUMP error handle + @param[out] o_dumpErrlActions DUMP error action flags + @return Error Log - Null if successfully committed + @pre SetErrorTod()? + @post Error log(s) build and logged, SRC built, etc. + @exception None. */ - - virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc)=0; // mp01 c + virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, + ServiceDataCollector & sdc, + bool & o_initiateHwudump, + TARGETING::TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions )=0; /** * @brief Create initial error log for analyze( attn analysis) code flow. diff --git a/src/usr/diag/prdf/common/prdfMain_common.C b/src/usr/diag/prdf/common/prdfMain_common.C index f7a1d40be..1546316af 100755 --- a/src/usr/diag/prdf/common/prdfMain_common.C +++ b/src/usr/diag/prdf/common/prdfMain_common.C @@ -174,6 +174,15 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, { PRDF_ENTER( "PRDF::main() Global attnType=%04X", i_attentionType ); + // These have to be outside of system scope lock + errlHndl_t retErrl = NULL; + bool initiateHwudump = false; + TARGETING::TargetHandle_t dumpTrgt = NULL; + errlHndl_t dumpErrl = NULL; + uint32_t dumpErrlActions = 0; + + { // system scope lock starts ------------------------------------------ + // will unlock when going out of scope PRDF_SYSTEM_SCOPELOCK; @@ -282,7 +291,11 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, } g_prd_errlHndl = serviceGenerator.GenerateSrcPfa( i_attentionType, - serviceData ); + serviceData, + initiateHwudump, + dumpTrgt, + dumpErrl, + dumpErrlActions); // Sleep for 20msec to let attention lines settle if we are at threshold. if ( (g_prd_errlHndl == NULL) && serviceData.IsAtThreshold() ) @@ -292,9 +305,19 @@ errlHndl_t main( ATTENTION_VALUE_TYPE i_attentionType, RasServices::SetTerminateOnCheckstop(true); + retErrl = g_prd_errlHndl.release(); + + } // system scope lock ends ------------------------------------------ + + + if ( true == initiateHwudump ) + { + PlatServices::initiateUnitDump( dumpTrgt, dumpErrl, dumpErrlActions ); + } + PRDF_EXIT( "PRDF::main()" ); - return(g_prd_errlHndl.release()); + return retErrl; } //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/framework/service/prdfPlatServices.C b/src/usr/diag/prdf/framework/service/prdfPlatServices.C index d5f3aa88e..1c7eddc76 100644 --- a/src/usr/diag/prdf/framework/service/prdfPlatServices.C +++ b/src/usr/diag/prdf/framework/service/prdfPlatServices.C @@ -103,6 +103,20 @@ void milliSleep( uint32_t i_seconds, uint32_t i_milliseconds ) nanosleep( i_seconds, i_milliseconds * 1000000 ); } +//------------------------------------------------------------------------------ + +void initiateUnitDump( TargetHandle_t i_target, + errlHndl_t i_errl, + uint32_t i_errlActions ) +{ + // no-op in Hostboot but just go ahead and commit + // the errorlog in case it's not null. + if ( NULL != i_errl ) + { + PRDF_COMMIT_ERRL(i_errl, i_errlActions); + } +} + //############################################################################## //## Processor specific functions //############################################################################## diff --git a/src/usr/diag/prdf/framework/service/prdfRasServices.C b/src/usr/diag/prdf/framework/service/prdfRasServices.C index 7beee6baa..9830aae77 100644 --- a/src/usr/diag/prdf/framework/service/prdfRasServices.C +++ b/src/usr/diag/prdf/framework/service/prdfRasServices.C @@ -110,9 +110,11 @@ bool ErrDataService::checkForceTerm( ServiceDataCollector & i_sdc, //------------------------------------------------------------------------------ -void ErrDataService::handleUnitCS( TargetHandle_t i_unitCsTarget ) +void ErrDataService::handleUnitCS( TargetHandle_t i_unitCsTarget, + bool & o_initiateHwudump) { // No-op in Hostboot + o_initiateHwudump = false; // default to not initiate hwudump } //------------------------------------------------------------------------------ @@ -124,9 +126,11 @@ void ErrDataService::handleChannelFail( TargetHandle_t i_memTarget ) //------------------------------------------------------------------------------ -void ErrDataService::handleCoreUnitCS( TargetHandle_t i_exTarget ) +void ErrDataService::handleCoreUnitCS( TargetHandle_t i_exTarget, + bool & o_initiateHwudump) { // No-op in Hostboot + o_initiateHwudump = false; // default to not initiate hwudump } //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/test/prdfsimRasServices.C b/src/usr/diag/prdf/test/prdfsimRasServices.C index c096561ff..11472859b 100755 --- a/src/usr/diag/prdf/test/prdfsimRasServices.C +++ b/src/usr/diag/prdf/test/prdfsimRasServices.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* [+] International Business Machines Corp. */ +/* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ @@ -26,11 +28,17 @@ #include "stdio.h" #include <targeting/common/targetservice.H> +using namespace TARGETING; + namespace PRDF { errlHndl_t SimErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, - ServiceDataCollector & i_sdc) + ServiceDataCollector & i_sdc, + bool & o_initiateHwudump, + TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions ) { using namespace TARGETING; @@ -40,7 +48,11 @@ errlHndl_t SimErrDataService::GenerateSrcPfa(ATTENTION_TYPE attn_type, errlHndl_t errLog = NULL; // call the actual ras services function - errLog = ErrDataService::GenerateSrcPfa(attn_type, i_sdc); + errLog = ErrDataService::GenerateSrcPfa(attn_type, i_sdc, + o_initiateHwudump, + o_dumpTrgt, + o_dumpErrl, + o_dumpErrlActions); ErrorSignature * esig = i_sdc.GetErrorSignature(); diff --git a/src/usr/diag/prdf/test/prdfsimRasServices.H b/src/usr/diag/prdf/test/prdfsimRasServices.H index eaaa2ed53..7de593985 100755 --- a/src/usr/diag/prdf/test/prdfsimRasServices.H +++ b/src/usr/diag/prdf/test/prdfsimRasServices.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* [+] International Business Machines Corp. */ +/* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ @@ -50,19 +52,24 @@ class SimErrDataService: public ErrDataService inline virtual ~SimErrDataService() {} /** - Create an SRC, PFA data, and Error log for the ServiceData provided - <ul> - <br><b>Parameter: </b> attn_type (see iipsdbug.h) - <br><b>Parameter: </b> sdc (see iipServiceData.h) - <br><b>Returns: </b> Error Log - Null if successfully committed - <br><b>Requirements:</b> SetErrorTod()? - <br><b>Promises: </b> Error log(s) build and logged, SRC built, etc. - <br><b>Exceptions: </b> None. - <br><b>Notes: </b> - </ul><br> + @brief Create an SRC, PFA data, and Error log for the ServiceData provided + @param[in] attn_type (see iipsdbug.h) + @param[in,out] sdc (see iipServiceData.h) + @param[out] o_initiateHwudump whether or not to initiate hwudump + @param[out] o_dumpTrgt The DUMP target. + @param[out] o_dumpErrl The DUMP error handle + @param[out] o_dumpErrlActions DUMP error action flags + @return Error Log - Null if successfully committed + @pre SetErrorTod()? + @post Error log(s) build and logged, SRC built, etc. + @exception None. */ - virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, ServiceDataCollector & sdc); - + virtual errlHndl_t GenerateSrcPfa(ATTENTION_TYPE attn_type, + ServiceDataCollector & sdc, + bool & o_initiateHwudump, + TARGETING::TargetHandle_t & o_dumpTrgt, + errlHndl_t & o_dumpErrl, + uint32_t & o_dumpErrlActions ); private: // functions |

