summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C
diff options
context:
space:
mode:
authorPrem Shanker Jha <premjha2@in.ibm.com>2017-11-27 06:50:17 -0600
committerChristian R. Geddes <crgeddes@us.ibm.com>2018-02-17 16:27:45 -0500
commitb74acc4c3a245d1f56306d1da431d9d4b85d4fa5 (patch)
tree3a002b306d7a39c2c11e22a224c022ecc779aac6 /src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C
parent2b999014ed98f02dcf8907179c952f21e9132e85 (diff)
downloadtalos-hostboot-b74acc4c3a245d1f56306d1da431d9d4b85d4fa5.tar.gz
talos-hostboot-b74acc4c3a245d1f56306d1da431d9d4b85d4fa5.zip
PM: Generation of summarized version of STOP Recovery FFDC.
A summary of STOP recovery FFDC is created after generation of complete FFDC. It is stored at the end of FFDC section. It is intended for copying to an error log created during second phase of STOP Recovery. Commit also incorporates some changes to support creation of PM Display from STOP Recovery FFDC. Key_Cronus_Test=PM_REGRESS CQ: SW416531 Change-Id: Ieb0bceeb141cc80b18f63b01e881e5ad3b50263d Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50414 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Cronus HW CI <cronushw-ci+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50422 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
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.C83
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" );
OpenPOWER on IntegriCloud