Skip to content

Commit

Permalink
PM Recovery FFDC: Added support to collect Register data for PPM
Browse files Browse the repository at this point in the history
Change-Id: I841cf840c8df49640b7612832960f56a59419ad7
RTC:179598
RTC:179602
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/47011
Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com>
Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Reviewed-by: PARVATHI RACHAKONDA <prachako@in.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/47051
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
  • Loading branch information
prasrang authored and crgeddes committed Oct 9, 2017
1 parent 6072cd8 commit fb91c96
Show file tree
Hide file tree
Showing 17 changed files with 1,186 additions and 11 deletions.
12 changes: 8 additions & 4 deletions src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H
Expand Up @@ -104,6 +104,7 @@ HCD_CONST(MAX_CORES_PER_EX, 2)

HCD_CONST(MAX_CMES_PER_QUAD, 2)
HCD_CONST(MAX_EXES_PER_QUAD, 2)
HCD_CONST(MAX_CORES_PER_QUAD, 4)

HCD_CONST(CACHE0_CHIPLET_ID, 0x10)
HCD_CONST(CACHE_CHIPLET_ID_MIN, 0x10)
Expand Down Expand Up @@ -544,6 +545,9 @@ HCD_CONST(FFDC_CME_MAGIC_NUM, (0x434d455f)) //"CME_"
HCD_CONST(FFDC_SGPE_MAGIC_NUM, (0x53475045)) //"SGPE"
HCD_CONST(FFDC_PGPE_MAGIC_NUM, (0x50475045)) //"PGPE"
HCD_CONST(FFDC_OCC_MAGIC_NUM, (0x4f43435f)) //"OCC_"
HCD_CONST(FFDC_CPPM_MAGIC_NUM, (0x4350504d)) //"CPPM"
HCD_CONST(FFDC_QPPM_MAGIC_NUM, (0x5150504d)) //"QPPM"
HCD_CONST(FFDC_QUAD_MAGIC_NUM, (0x51554144)) //"QUAD"

//FFDC Region Layout
HCD_CONST(FFDC_PPE_SCORE_BOARD_SIZE, 0x200)
Expand All @@ -555,11 +559,11 @@ HCD_CONST(FFDC_PPE_INTERNAL_REG_SIZE, 0x78)
HCD_CONST(FFDC_PPE_TRACES_SIZE, 0x200)
HCD_CONST(FFDC_PPE_HDR_SIZE , 0x18)
HCD_CONST(FFDC_QUAD_HDR_SIZE , 0x18)
HCD_CONST(FFDC_CPPM_REGISTERS_SIZE, 0x380)
HCD_CONST(FFDC_PPE_BLOCK_SIZE, 0x630)
HCD_CONST(FFDC_QPPM_REGISTERS_SIZE, 0xE8)
HCD_CONST(FFDC_CPPM_REGISTERS_SIZE, 0x160)
HCD_CONST(FFDC_PPE_BLOCK_SIZE, 0x6FC)
HCD_CONST(FFDC_QPPM_REGISTERS_SIZE, 0x154)
HCD_CONST(FFDC_HOMER_TOP_HEADER , 0x38)
HCD_CONST(FFDC_QUAD_REGION_SIZE, 0x10E8)
HCD_CONST(FFDC_QUAD_REGION_SIZE, 0x14DC)
HCD_CONST(FFDC_SGPE_REGION_SIZE, (FFDC_PPE_BLOCK_SIZE))
HCD_CONST(FFDC_PGPE_REGION_SIZE, (FFDC_PPE_BLOCK_SIZE))
HCD_CONST(FFDC_OCC_REGION_HDR_SIZE, 0x18)
Expand Down
Expand Up @@ -187,5 +187,13 @@ HCD_CONST(OCC_SRAM_SGPE_DASHBOARD_START,
HCD_CONST( OCC_SRAM_SGPE_DASHBOARD_SIZE, 0x134 );
HCD_CONST( OCC_SRAM_SGPE_TRACE_START,
(OCC_SRAM_SGPE_HEADER_ADDR + SGPE_HEADER_SIZE));
// PGPE
HCD_CONST(OCC_SRAM_PGPE_DASHBOARD_START,
( OCC_SRAM_PGPE_HEADER_ADDR + PGPE_HEADER_SIZE + SGPE_DEBUG_PTRS_SIZE - 4 )); // For 8B alignment
HCD_CONST( OCC_SRAM_PGPE_DASHBOARD_SIZE, 0xfc );
HCD_CONST( OCC_SRAM_PGPE_TRACE_START,
(OCC_SRAM_PGPE_HEADER_ADDR + PGPE_HEADER_SIZE));



#endif /* __P9_HCD_MEMMAP_OCC_SRAM_H__ */
37 changes: 37 additions & 0 deletions src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_base.H
Expand Up @@ -41,6 +41,7 @@
// Includes
//--------------------------------------------------------------------------
#include <fapi2.H>
#include <collect_reg_ffdc.H>
#include <stdint.h>
#include <p9_hcd_memmap_cme_sram.H>
#include <p9_hcd_memmap_occ_sram.H>
Expand Down Expand Up @@ -119,6 +120,19 @@ namespace p9_stop_recov_ffdc
FfdcDataType i_dataType,
uint32_t i_sramLength );

///@brief Collects register data
///param[in] i_chipletTarget Chip/chilpet target
///param[out] o_pHomerBuf Homer base address to fill register
// data
// param[in] i_ffdcId Hwp ffdc id to know register
// collection type
///@return fapi2 return code
template<fapi2::TargetType T>
fapi2::ReturnCode collectRegisterData( const fapi2::Target<T>& i_chipletTarget,
uint8_t* o_pHomerBuf,
fapi2::HwpFfdcId i_ffdcId);


///@brief updates parts of PPE FFDC Header common for all platforms.
///param[in] i_pFfdcHdr points to the PPE FFDC header
///param[in] i_ffdcValid bit vector summarizing FFDC validity
Expand All @@ -142,6 +156,29 @@ namespace p9_stop_recov_ffdc
PmComplexPlatId iv_plat;
};

template<fapi2::TargetType T>
fapi2::ReturnCode PlatPmComplex::collectRegisterData(const fapi2::Target<T>& i_chipletTarget,
uint8_t *o_pHomerBuf,
fapi2::HwpFfdcId i_ffdcId)
{
FAPI_DBG(">> collectRegisterData");
std::vector<uint32_t> l_cfamAddresses;
std::vector<uint64_t> l_scomAddresses;
uint32_t l_ffdcRegReadSize = 0;
uint32_t l_offset = 0;
fapi2::ScomReader<T> l_scomReader(i_chipletTarget);

fapi2::getAddressData(i_ffdcId, l_scomAddresses, l_cfamAddresses, l_ffdcRegReadSize);

FAPI_TRY((fapi2::collectRegisterAndAddressData<uint64_t,
fapi2::ScomReader<T> >(l_scomAddresses, l_scomReader,
l_offset, o_pHomerBuf)),
"Failed in collectRegisterAndAddressData");

fapi_try_exit:
FAPI_DBG("<< collectRegisterData");
return fapi2::current_err;
}

} //namespace p9_stop_recov_ffdc ends

Expand Down
32 changes: 31 additions & 1 deletion src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.C
Expand Up @@ -42,6 +42,7 @@

#include <p9_pm_recovery_ffdc_cme.H>
#include <p9_hcd_memmap_cme_sram.H>
#include <collect_reg_ffdc.H>
#include <p9_ppe_defs.H>
#include <stddef.h>
#include <endian.h>
Expand Down Expand Up @@ -83,6 +84,7 @@
if( !ex.isFunctional() )
{
//Marking CME FFDC region as Invalid
l_ffdcValdityVect = PPE_FFDC_INVALID;
FAPI_TRY( updateCmeFfdcHeader( l_pFfdcLoc, l_cmePos, l_ffdcValdityVect, l_haltState ),
"Failed To Update CME FFDC Header for CME 0x%0d", l_cmePos );
continue;
Expand Down Expand Up @@ -126,6 +128,7 @@
{
FAPI_ERR("Error in collecting CME Globals, CME Pos 0x%08x", l_cmePos );
l_ffdcValdityVect &= ~PPE_DASHBOARD_VALID;

}

l_retCode = collectImageHeader( l_pFfdcLoc, ex );
Expand All @@ -136,8 +139,19 @@
l_ffdcValdityVect &= ~PPE_IMAGE_HEADER_VALID;
}

l_retCode = collectInternalReg( l_pFfdcLoc, ex , l_cmePos);

if( l_retCode )
{
FAPI_ERR("Error in collecting CME Internal Regs, CME Pos 0x%08x", l_cmePos );
l_ffdcValdityVect &= ~PPE_INT_REG_VALID;
}



FAPI_TRY( updateCmeFfdcHeader( l_pFfdcLoc, l_cmePos, l_ffdcValdityVect, l_haltState ),
"Failed To Update CME FFDC Header for CME 0x%0d", l_cmePos );

}

fapi_try_exit:
Expand Down Expand Up @@ -191,8 +205,24 @@
//-----------------------------------------------------------------------

fapi2::ReturnCode PlatCme::collectInternalReg( uint8_t * i_pCmeIntReg,
const fapi2::Target<fapi2::TARGET_TYPE_EX >& i_exTgt )
const fapi2::Target<fapi2::TARGET_TYPE_EX >& i_exTgt ,
const uint8_t i_exPos)
{
FAPI_DBG(">> PlatCme::collectInternalReg" );

PpeFfdcLayout * l_pCmeFfdc = ( PpeFfdcLayout *) ( i_pCmeIntReg);
uint8_t * l_pIntRegs = &l_pCmeFfdc->iv_ppeInternalReg[0];

FAPI_INF("CME Internal FFDC Pos %d ", i_exPos);

FAPI_TRY(collectRegisterData<fapi2::TARGET_TYPE_EX> (i_exTgt,
l_pIntRegs,
static_cast<fapi2::HwpFfdcId>(fapi2::CME_INTERNAL_FFDC_REGISTERS)),
"Failed to collect register data for CME instance %u",i_exPos);


fapi_try_exit:
FAPI_DBG("<< PlatCme::collectInternalReg" );
return fapi2::FAPI2_RC_SUCCESS;
}

Expand Down
10 changes: 6 additions & 4 deletions src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cme.H
Expand Up @@ -22,8 +22,8 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
#ifndef __PM_RECOVERY_FFDC_BASE_
#define __PM_RECOVERY_FFDC_BASE_
#ifndef __PM_RECOVERY_FFDC_CME_
#define __PM_RECOVERY_FFDC_CME_

///
/// @file p9_pm_recovery_ffdc_cme.H
Expand Down Expand Up @@ -76,8 +76,10 @@ namespace p9_stop_recov_ffdc
/// @brief collects internal register info for a given CME
/// @param[in] i_pHomerBuf points to location of HOMER meant for CME's internal register.
/// @param[in] i_exTgt fapi2 target for ex
/// @param[in] i_exPos EX target position
fapi2::ReturnCode collectInternalReg( uint8_t * i_pHomerBuf,
const fapi2::Target< fapi2::TARGET_TYPE_EX > & i_exTgt );
const fapi2::Target< fapi2::TARGET_TYPE_EX > & i_exTgt ,
const uint8_t i_exPos);

/// @brief collects CME Image Header info from CME SRAM buffer.
/// @param[in] i_pHomerBuf points to location of HOMER meant for CME's header.
Expand Down Expand Up @@ -106,4 +108,4 @@ extern "C"

} //namespace p9_stop_recov_ffdc ends

#endif //__PM_RECOVERY_FFDC_BASE_
#endif //__PM_RECOVERY_FFDC_CME_
190 changes: 190 additions & 0 deletions src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cppm.C
@@ -0,0 +1,190 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_cppm.C $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017 */
/* [+] 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. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
// *INDENT-OFF*


///
/// @file p9_pm_recovery_ffdc_cppm.C
/// @brief PPM FFDC collection of PM complex
///
/// *HWP HWP Owner: Greg Still <stillgs@us.ibm.com>
/// *HWP FW Owner: Prasad Bg Ranganath <prasadbgr@in.ibm.com>
/// *HWP Team: PM
/// *HWP Level: 2
/// *HWP Consumed by: Hostboot
//
// *INDENT-OFF*
//--------------------------------------------------------------------------
// Includes
//--------------------------------------------------------------------------

#include <p9_pm_recovery_ffdc_cppm.H>
#include <collect_reg_ffdc.H>
#include <stddef.h>
#include <endian.h>

namespace p9_stop_recov_ffdc
{
CppmRegs::CppmRegs( const fapi2::Target< fapi2::TARGET_TYPE_PROC_CHIP > i_procChipTgt )
: PlatPmComplex( i_procChipTgt,0,0,0,PLAT_PPM)
{ }

//----------------------------------------------------------------------

fapi2::ReturnCode CppmRegs::collectRegFfdc( void * i_pHomerBuf )
{
FAPI_DBG(">> CppmRegs::collectRegFfdc");
fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS;
auto l_quadList =
getProcChip().getChildren< fapi2::TARGET_TYPE_EQ > ( fapi2::TARGET_STATE_PRESENT );
uint8_t l_quadPos = 0;
uint8_t l_corePos = 0;
uint8_t *l_pFfdcLoc = NULL;
uint8_t l_cppmFfdcValid = 0;
uint8_t l_quadFfdcValid = 0;
HomerFfdcRegion * l_pHomerFfdc =
( HomerFfdcRegion *)( (uint8_t *)i_pHomerBuf + FFDC_REGION_HOMER_BASE_OFFSET );

for( auto quad : l_quadList )
{
l_cppmFfdcValid = 0;
l_quadFfdcValid = 0;
FAPI_TRY( FAPI_ATTR_GET( fapi2::ATTR_CHIP_UNIT_POS, quad, l_quadPos),
"FAPI_ATTR_GET Failed To Read QUAD Position" );
if( quad.isFunctional() )
{
l_quadFfdcValid = 1;
auto l_exList =
quad.getChildren< fapi2::TARGET_TYPE_EX > ( fapi2::TARGET_STATE_PRESENT );

for( auto ex : l_exList )
{
auto l_coreList =
ex.getChildren< fapi2::TARGET_TYPE_CORE > ( fapi2::TARGET_STATE_PRESENT );

for ( auto core : l_coreList )
{
FAPI_TRY( FAPI_ATTR_GET( fapi2::ATTR_CHIP_UNIT_POS, core, l_corePos ),
"FAPI_ATTR_GET Failed To Read CORE Position" );

l_pFfdcLoc = &l_pHomerFfdc->iv_quadFfdc[l_quadPos].iv_quadCppmRegion[l_corePos][0];

if( core.isFunctional() )
{
l_cppmFfdcValid = 1;

FAPI_INF("CPPM FFDC Pos %d ", l_corePos);

l_rc = collectRegisterData <fapi2::TARGET_TYPE_CORE> (core,
l_pFfdcLoc + sizeof (PpmFfdcHeader),
fapi2::CPPM_FFDC_REGISTERS);
if (l_rc)
{
l_cppmFfdcValid = 0;
}
}


FAPI_TRY( updateCppmFfdcHeader( l_pFfdcLoc, l_corePos, l_cppmFfdcValid),
"Failed To Update CPPM FFDC Header for CORE 0x%0d", l_corePos );
}
}
}
FAPI_TRY( updateQuadFfdcHeader( l_pFfdcLoc,l_quadPos, l_quadFfdcValid),
"Failed To Update CPPM FFDC Header for CORE 0x%0d", l_corePos );
}

fapi_try_exit:
FAPI_DBG("<< CppmRegs::collectRegFfdc");
return fapi2::current_err;
}

fapi2::ReturnCode CppmRegs::updateCppmFfdcHeader( uint8_t * i_pHomerBuf,
const uint8_t i_corePos,
const uint8_t i_ffdcValid)
{
FAPI_DBG(">> updateCppmFfdcHeader" );

PpmFfdcHeader * l_CppmFfdcHdr = (PpmFfdcHeader *) i_pHomerBuf ;
l_CppmFfdcHdr->iv_ppmMagicWord = htobe32(FFDC_CPPM_MAGIC_NUM);
l_CppmFfdcHdr->iv_Instance = i_corePos;
l_CppmFfdcHdr->iv_ppmHeaderSize = sizeof(PpmFfdcHeader);
l_CppmFfdcHdr->iv_sectionSize = FFDC_CPPM_REGISTERS_SIZE;
l_CppmFfdcHdr->iv_ffdcValid = i_ffdcValid;

FAPI_DBG("<< updateCppmFfdcHeader" );
return fapi2::FAPI2_RC_SUCCESS;
}
//-----------------------------------------------------------------------
//
fapi2::ReturnCode CppmRegs::updateQuadFfdcHeader( uint8_t * i_pHomerBuf,
const uint8_t i_eqPos,
const uint8_t i_ffdcValid)
{
FAPI_DBG(">> updateQuadFfdcHeader" );

QuadFfdcHeader* l_QuadFfdcHdr = (QuadFfdcHeader*) i_pHomerBuf ;
l_QuadFfdcHdr->iv_quadMagicWord = htobe32(FFDC_QUAD_MAGIC_NUM);
l_QuadFfdcHdr->iv_quadInstance = i_eqPos;
l_QuadFfdcHdr->iv_quadHeaderSize = sizeof(QuadFfdcHeader);
l_QuadFfdcHdr->iv_sectionSize = sizeof(HomerQuadFfdcRegion);
l_QuadFfdcHdr->iv_offsetCppm0 = htobe16(offsetof (struct HomerQuadFfdcRegion,
iv_quadCppmRegion[0][0]));
l_QuadFfdcHdr->iv_offsetCppm1 = htobe16(offsetof (struct HomerQuadFfdcRegion,
iv_quadCppmRegion[1][0]));
l_QuadFfdcHdr->iv_offsetCppm2 = htobe16(offsetof (struct HomerQuadFfdcRegion,
iv_quadCppmRegion[2][0]));
l_QuadFfdcHdr->iv_offsetCppm3 = htobe16(offsetof (struct HomerQuadFfdcRegion,
iv_quadCppmRegion[3][0]));
l_QuadFfdcHdr->iv_offsetCme0 = htobe16(offsetof(struct HomerQuadFfdcRegion,
iv_quadCmeBlock[0][0]));
l_QuadFfdcHdr->iv_offsetCme1 = htobe16(offsetof(struct HomerQuadFfdcRegion,
iv_quadCmeBlock[1][0]));
l_QuadFfdcHdr->iv_offsetQppm = htobe16(offsetof(struct HomerQuadFfdcRegion,
iv_quadQppmRegion[0]));
l_QuadFfdcHdr->iv_ffdcValid = i_ffdcValid;

FAPI_DBG("<< updateQuadFfdcHeader" );
return fapi2::FAPI2_RC_SUCCESS;
}


extern "C"
{
fapi2::ReturnCode p9_pm_recovery_ffdc_cppm( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP >& i_procChip, void * i_pFfdcBuf )
{
FAPI_IMP(">> p9_pm_recovery_ffdc_cppm" );
CppmRegs l_cppmFfdc( i_procChip );
FAPI_TRY( l_cppmFfdc.collectRegFfdc( i_pFfdcBuf ),
"Failed To Collect CPPM FFDC" );

fapi_try_exit:
FAPI_IMP("<< p9_pm_recovery_ffdc_cppm" );
return fapi2::current_err;
}

}

}//namespace p9_stop_recov_ffdc ends

0 comments on commit fb91c96

Please sign in to comment.