diff options
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C | 97 |
1 files changed, 87 insertions, 10 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C index 2b6f5cc0f..cd9fea11a 100644 --- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C +++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C @@ -42,13 +42,16 @@ #include <p9_pm_recovery_ffdc_cme.H> #include <p9_hcd_memmap_cme_sram.H> +#include <p9_quad_scom_addresses.H> #include <collect_reg_ffdc.H> #include <p9_ppe_defs.H> +#include <p9_ppe_utils.H> #include <stddef.h> #include <endian.h> namespace p9_stop_recov_ffdc { + PlatCme::PlatCme( const fapi2::Target< fapi2::TARGET_TYPE_PROC_CHIP > i_procChipTgt ) : PlatPmComplex( i_procChipTgt, PLAT_CME, @@ -87,6 +90,7 @@ HomerFfdcRegion * l_pHomerFfdc = ( HomerFfdcRegion *)( (uint8_t *)i_pHomerBuf + FFDC_REGION_HOMER_BASE_OFFSET ); + for( auto ex : l_exList ) { FAPI_TRY( FAPI_ATTR_GET( fapi2::ATTR_CHIP_UNIT_POS, ex, l_cmePos ), @@ -220,6 +224,11 @@ } + if( !(i_ffdcType & INIT ) ) + { + generateSummary( i_pHomerBuf ); + } + fapi_try_exit: FAPI_DBG("<< PlatCme::collectFfdc"); return fapi2::current_err; @@ -281,16 +290,30 @@ const fapi2::Target<fapi2::TARGET_TYPE_EX >& i_exTgt ) { FAPI_DBG(">> PlatCme::collectTrace" ); - PpeFfdcLayout * l_pCmeFfdc = ( PpeFfdcLayout *) ( i_pTraceBuf ); - - uint8_t * l_pTraceLoc = &l_pCmeFfdc->iv_ppeTraces[0]; - - FAPI_TRY( PlatPmComplex::collectSramInfo - ( i_exTgt, - l_pTraceLoc, - TRACES, - FFDC_PPE_TRACES_SIZE ), - "Trace Collection Failed" ); + PpeFfdcLayout * l_pCmeFfdc = ( PpeFfdcLayout *) ( i_pTraceBuf ); + uint8_t * l_pTraceLoc = &l_pCmeFfdc->iv_ppeTraces[0]; + uint64_t l_traceBufHdr = 0; + uint32_t l_traceBufAddress = 0; + uint32_t l_doubleWordsRead = 0; + + FAPI_TRY( PlatPmComplex::readSramInfo( i_exTgt, + getTraceBufAddr(), + (uint8_t *)&l_traceBufHdr, + 8, + l_doubleWordsRead ), + "Trace Buf Ptr Collection Failed" ); + + l_traceBufHdr = htobe64(l_traceBufHdr); + l_traceBufAddress = (uint32_t) l_traceBufHdr; + + FAPI_DBG( "Trace Buf Address 0x%08x Double Word 0x%016lx", l_traceBufAddress, l_traceBufHdr ); + + FAPI_TRY( PlatPmComplex::readSramInfo( i_exTgt, + l_traceBufAddress, + l_pTraceLoc, + FFDC_PPE_TRACES_SIZE, + l_doubleWordsRead ), + "Trace Bin Collection Failed" ); fapi_try_exit: FAPI_DBG("<< PlatCme::collectTrace" ); @@ -378,6 +401,60 @@ FAPI_DBG("<< updateCmeFfdcHeader" ); return fapi2::FAPI2_RC_SUCCESS; } + + //----------------------------------------------------------------------- + + fapi2::ReturnCode PlatCme::generateSummary( void * i_pHomerBuf ) + { + FAPI_DBG(">> PlatCme::generateSummary" ); + + HomerFfdcRegion * l_pHomerFfdc = + ( HomerFfdcRegion *)( (uint8_t *)i_pHomerBuf + FFDC_REGION_HOMER_BASE_OFFSET ); + + PlatPmComplex::initRegList(); + + for( uint32_t l_exPos = 0; l_exPos < MAX_CMES_PER_CHIP; l_exPos++ ) + { + uint8_t l_quadPos = l_exPos >> 1; + uint8_t l_relativeExPos = l_exPos & 0x01; + PpeFfdcLayout * l_pCmeLayout = + ( PpeFfdcLayout *)&l_pHomerFfdc->iv_quadFfdc[l_quadPos].iv_quadCmeBlock[l_relativeExPos][0]; + uint8_t *l_pCmeXir = &l_pCmeLayout->iv_ppeXirReg[0]; + uint8_t *l_pCmeSummary = &l_pHomerFfdc->iv_ffdcSummaryRegion.iv_cmeSummary[l_exPos][FFDC_SUMMARY_SEC_HDR_SIZE]; + FfdcScomEntry * l_pCmeLfirEntry = + ( FfdcScomEntry* )&l_pHomerFfdc->iv_firFfdcRegion.iv_firCmeBlock[l_exPos][0]; + SysState * l_pSysState = &l_pHomerFfdc->iv_ffdcSummaryRegion.iv_sysState; + + FfdcSummSubSectHdr * l_pCmeSummaryHdr = + ( FfdcSummSubSectHdr *) &l_pHomerFfdc->iv_ffdcSummaryRegion.iv_cmeSummary[l_exPos][0]; + l_pHomerFfdc->iv_ffdcSummaryRegion.iv_cmeScoreBoard[l_exPos].iv_dataPtr = &l_pCmeLayout->iv_ppeGlobals[0]; + l_pHomerFfdc->iv_ffdcSummaryRegion.iv_cmeScoreBoard[l_exPos].iv_dataSize = FFDC_PPE_SCORE_BOARD_SIZE; + + l_pCmeSummaryHdr->iv_subSectnId = PLAT_CME; + l_pCmeSummaryHdr->iv_majorNum = 1; + l_pCmeSummaryHdr->iv_minorNum = 0; + l_pCmeSummaryHdr->iv_secValid = l_pCmeLayout->iv_ppeFfdcHdr.iv_ppeFfdcHdr.iv_sectionsValid; + + if( !l_pCmeSummaryHdr->iv_secValid ) + { + FAPI_DBG("Skipping CME %d For Summary", l_exPos ); + continue; + } + + memcpy( &l_pSysState->iv_cmeFirs[l_exPos][0], + &l_pCmeLfirEntry->iv_scomData, + FFDC_SUMMARY_SCOM_REG_SIZE ); + + PlatPmComplex::extractPpeSummaryReg( l_pCmeXir, + FFDC_PPE_XIR_SIZE, + l_pCmeSummary ); + } + + FAPI_DBG("<< PlatCme::generateSummary" ); + + return fapi2::FAPI2_RC_SUCCESS; + } + //----------------------------------------------------------------------- extern "C" |