summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_qppm.C
diff options
context:
space:
mode:
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