diff options
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C | 83 |
1 files changed, 71 insertions, 12 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C index 205240346..3288b92db 100644 --- a/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C +++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ +/* Contributors Listed Below - COPYRIGHT 2017,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -42,6 +42,7 @@ #include <p9_pm_recovery_ffdc_qppm.H> #include <collect_reg_ffdc.H> +#include <p9_quad_scom_addresses.H> #include <stddef.h> #include <endian.h> @@ -56,6 +57,7 @@ fapi2::ReturnCode QppmRegs::init ( void* i_pHomerBuf ) { FAPI_DBG (">> QppmRegs::init" ); + FAPI_TRY ( collectFfdc( i_pHomerBuf, INIT), "Failed To init QPPM REGS FFDC" ); @@ -66,6 +68,17 @@ //---------------------------------------------------------------------- + void QppmRegs::initRegList() + { + std::vector < uint32_t> l_scomRegList; + l_scomRegList.push_back( EQ_PPM_GPMMR_SCOM ); + l_scomRegList.push_back( EQ_PPM_SSHSRC ); + l_scomRegList.push_back( EQ_QPPM_DPLL_FREQ ); + PlatPmComplex::updateSummaryList( l_scomRegList ); + } + + //---------------------------------------------------------------------- + fapi2::ReturnCode QppmRegs::collectFfdc ( void* i_pHomerBuf, uint8_t i_ffdcType ) { @@ -73,11 +86,11 @@ fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS; - auto l_quadList = + uint8_t* l_pFfdcLoc = NULL; + auto l_quadList = getProcChip().getChildren< fapi2::TARGET_TYPE_EQ > ( fapi2::TARGET_STATE_PRESENT ); - uint8_t l_quadPos = 0; - uint8_t* l_pFfdcLoc = NULL; - uint16_t l_ffdcValid = 0; + uint8_t l_quadPos = 0; + uint16_t l_ffdcValid = FFDC_SUMMARY_SUB_SEC_VALID; HomerFfdcRegion * l_pHomerFfdc = ( HomerFfdcRegion *)( (uint8_t *)i_pHomerBuf + FFDC_REGION_HOMER_BASE_OFFSET ); @@ -95,22 +108,30 @@ // Note: ( i_ffdcType & INIT ) is the default case if ( i_ffdcType & SCOM_REG ) { - l_ffdcValid = 1; + l_ffdcValid = FFDC_SUMMARY_SUB_SEC_VALID; FAPI_INF("QPPM FFDC Pos %d ", l_quadPos); l_rc = collectRegisterData <fapi2::TARGET_TYPE_EQ> ( quad, l_pFfdcLoc + sizeof(PpmFfdcHeader), static_cast<fapi2::HwpFfdcId>(fapi2::QPPM_FFDC_REGISTERS)); - if (l_rc ) + + if ( l_rc ) { - l_ffdcValid = 0; + l_ffdcValid = FFDC_SUMMARY_SUB_SEC_INVALID; } } + } FAPI_TRY( updateQppmFfdcHeader( l_pFfdcLoc, l_quadPos, l_ffdcValid), "Failed To Update QPPM FFDC Header for quad 0x%0d", l_quadPos); + + } + + if( !( i_ffdcType & INIT ) ) + { + generateSummary( i_pHomerBuf ); } fapi_try_exit: @@ -118,16 +139,18 @@ return fapi2::current_err; } - fapi2::ReturnCode QppmRegs::updateQppmFfdcHeader( uint8_t * i_pHomerBuf, + //----------------------------------------------------------------------- + + fapi2::ReturnCode QppmRegs::updateQppmFfdcHeader( uint8_t * i_pHomerBuf, const uint8_t i_quadPos, const uint16_t i_ffdcValid) { FAPI_DBG(">> updateQppmFfdcHeader" ); - PpmFfdcHeader * l_QppmFfdcHdr = (PpmFfdcHeader *) i_pHomerBuf ; + PpmFfdcHeader * l_QppmFfdcHdr = (PpmFfdcHeader *) i_pHomerBuf ; l_QppmFfdcHdr->iv_ppmMagicWord = htobe32(FFDC_QPPM_MAGIC_NUM); - l_QppmFfdcHdr->iv_versionMajor = 1; - l_QppmFfdcHdr->iv_versionMinor = 0; + l_QppmFfdcHdr->iv_versionMajor = 1; + l_QppmFfdcHdr->iv_versionMinor = 0; l_QppmFfdcHdr->iv_Instance = i_quadPos; l_QppmFfdcHdr->iv_ppmHeaderSize = htobe16(sizeof(PpmFfdcHeader)); l_QppmFfdcHdr->iv_sectionSize = htobe16(FFDC_QPPM_REGION_SIZE); @@ -136,15 +159,51 @@ FAPI_DBG("<< updateQppmFfdcHeader" ); return fapi2::FAPI2_RC_SUCCESS; } + //----------------------------------------------------------------------- + fapi2::ReturnCode QppmRegs::generateSummary( void * i_pHomer ) + { + HomerFfdcRegion * l_pHomerFfdc = + ( HomerFfdcRegion *)( (uint8_t *)i_pHomer + FFDC_REGION_HOMER_BASE_OFFSET ); + uint8_t* l_pQppmFfdcLoc = NULL; + uint8_t * l_pQppmSummary = NULL; + PpmFfdcHeader * l_pQppmHdr = NULL; + uint32_t l_regionSizeLimit = FFDC_QPPM_REGION_SIZE - sizeof( PpmFfdcHeader ); + initRegList(); + + for( uint8_t l_ppmPos = 0; l_ppmPos < MAX_QUADS_PER_CHIP; l_ppmPos++ ) + { + l_pQppmFfdcLoc = &l_pHomerFfdc->iv_quadFfdc[l_ppmPos].iv_quadQppmRegion[0]; + l_pQppmSummary = &l_pHomerFfdc->iv_ffdcSummaryRegion.iv_qpmmRegSummary[l_ppmPos][FFDC_SUMMARY_SEC_HDR_SIZE]; + l_pQppmHdr = ( PpmFfdcHeader * ) &l_pHomerFfdc->iv_quadFfdc[l_ppmPos].iv_quadQppmRegion[0]; + FfdcSummSubSectHdr * l_pQppmSummaryHdr + = (FfdcSummSubSectHdr *)&l_pHomerFfdc->iv_ffdcSummaryRegion.iv_qpmmRegSummary[l_ppmPos][0]; + l_pQppmSummaryHdr->iv_subSectnId = PLAT_QPPM; + l_pQppmSummaryHdr->iv_majorNum = 1; + l_pQppmSummaryHdr->iv_minorNum = 0; + l_pQppmSummaryHdr->iv_secValid = htobe16(l_pQppmHdr->iv_ffdcValid); + + if( !l_pQppmSummaryHdr->iv_secValid ) + { + continue; + } + PlatPmComplex::extractScomSummaryReg( l_pQppmFfdcLoc + sizeof( PpmFfdcHeader ), + l_regionSizeLimit, l_pQppmSummary ); + } + + return fapi2::FAPI2_RC_SUCCESS; + } + + //----------------------------------------------------------------------- extern "C" { fapi2::ReturnCode p9_pm_recovery_ffdc_qppm( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP >& i_procChip, void * i_pFfdcBuf ) { FAPI_IMP(">> p9_pm_recovery_ffdc_qppm" ); + QppmRegs l_qppmFfdc( i_procChip ); FAPI_TRY( l_qppmFfdc.collectFfdc( i_pFfdcBuf, SCOM_REG ), "Failed To Collect QPPM FFDC" ); |