Skip to content

Commit

Permalink
STOP Recovery: Added support for FFDC collection of CME and SGPE.
Browse files Browse the repository at this point in the history
Change-Id: Ie0ac19b81a44a72faedc860ea2337acc8e20c321
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46853
Tested-by: Jenkins Server <pfd-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: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46923
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
premsjha authored and crgeddes committed Oct 9, 2017
1 parent afc07df commit d0605e8
Show file tree
Hide file tree
Showing 13 changed files with 1,369 additions and 0 deletions.
38 changes: 38 additions & 0 deletions src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H
Expand Up @@ -67,6 +67,7 @@ HCD_CONST64(SGPE_MAGIC_NUMBER_BASE, ULL(0x534750455f302e30)) /
HCD_CONST64(PPMR_MAGIC_NUMBER_BASE, ULL(0x50504d525f302e30)) // PPMR_0.0
HCD_CONST64(PGPE_MAGIC_NUMBER_BASE, ULL(0x504750455F302E30)) // PGPE_0.0


/// Size constants

HCD_CONST(HALF_KB, 512)
Expand Down Expand Up @@ -538,4 +539,41 @@ HCD_CONST(WOF_TABLE_RESERVE,
HCD_CONST(PGPE_IMAGE_RESERVE_SIZE,
(OCC_PSTATE_PARAM_BLOCK_PPMR_OFFSET - PGPE_IMAGE_PPMR_OFFSET - PGPE_IMAGE_SIZE - PGPE_AUX_TASK_SIZE))

//FFDC Magic Words
HCD_CONST(FFDC_CME_MAGIC_NUM, (0x434d455f)) //"CME_"
HCD_CONST(FFDC_SGPE_MAGIC_NUM, (0x53475045)) //"SGPE"
HCD_CONST(FFDC_PGPE_MAGIC_NUM, (0x50475045)) //"PGPE"

//FFDC Region Layout
HCD_CONST(FFDC_PPE_SCORE_BOARD_SIZE, 0x200)
HCD_CONST(FFDC_PPE_IMG_HDR_SIZE, 0x80)
HCD_CONST(FFDC_PPE_XIR_SIZE, 0x28)
HCD_CONST(FFDC_PPE_SPR_SIZE, 0x80)
HCD_CONST(FFDC_PPE_MAJOR_SPR_SIZE, 0x38)
HCD_CONST(FFDC_PPE_MINOR_SPR_SIZE, 0x38)
HCD_CONST(FFDC_PPE_GPR_SIZE, 0x80)
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_HOMER_TOP_HEADER , 0x38)
HCD_CONST(FFDC_QUAD_REGION_SIZE, 0x10E8)
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_SIZE, 0x8610)
HCD_CONST(FFDC_OCC_REGION_HDR_SIZE, 0x10)
HCD_CONST(FFDC_TRACE_ERR_SIZE, (8 * ONE_KB))
HCD_CONST(FFDC_TRACE_IMP_SIZE, (FFDC_TRACE_ERR_SIZE))
HCD_CONST(FFDC_TRACE_INF_SIZE, (FFDC_TRACE_ERR_SIZE))
HCD_CONST(FFDC_TRACE_SSX_SIZE , (FFDC_TRACE_ERR_SIZE))
HCD_CONST(FFDC_TRACE_GPE0_SIZE, 0x200)
HCD_CONST(FFDC_TRACE_GPE1_SIZE, 0x200)
HCD_CONST(FFDC_SHARED_SRAM_SIZE, 0x200)
HCD_CONST(FFDC_REGION_QPMR_BASE_OFFSET, 0xE0000)
HCD_CONST(FFDC_REGION_HOMER_BASE_OFFSET,
(QPMR_HOMER_OFFSET + FFDC_REGION_QPMR_BASE_OFFSET))

#endif /* __HCD_MEMMAP_BASE_H__ */
Expand Up @@ -46,7 +46,10 @@
// -------------------------------------------------------------------

HCD_CONST(CME_SRAM_BASE_ADDR, 0xFFFF8000)
HCD_CONST(FFDC_PPE_IMG_HDR_START, (CME_INT_VECTOR_SIZE + CME_SRAM_BASE_ADDR))
HCD_CONST(CME_SRAM_HEADER_ADDR,
(CME_SRAM_BASE_ADDR + CME_INT_VECTOR_SIZE))
HCD_CONST(FFDC_CME_TRACE_START, (CME_SRAM_BASE_ADDR + CME_DEBUG_PTRS_OFFSET))
HCD_CONST(FFDC_CME_DASH_BOARD_START, (FFDC_CME_TRACE_START + CME_DEBUG_PTRS_SIZE - 4 ))

#endif /* __P9_HCD_MEMMAP_CME_SRAM_H__ */
Expand Up @@ -161,5 +161,10 @@ HCD_CONST(OCC_SRAM_QUAD_SPECIFIC_RINGS_LENGTH_ADDR,
(OCC_SRAM_SGPE_QPMR_HEADER_ADDR + QPMR_QUAD_SPECIFIC_RINGS_LENGTH_BYTE))


HCD_CONST(OCC_SRAM_SGPE_DASHBOARD_START,
( OCC_SRAM_SGPE_HEADER_ADDR + SGPE_HEADER_SIZE + SGPE_DEBUG_PTRS_SIZE - 4 )); // For 8B alignment
HCD_CONST( OCC_SRAM_SGPE_DASHBOARD_SIZE, 0x134 );
HCD_CONST( OCC_SRAM_SGPE_TRACE_START,
(OCC_SRAM_SGPE_HEADER_ADDR + SGPE_HEADER_SIZE));

#endif /* __P9_HCD_MEMMAP_OCC_SRAM_H__ */
225 changes: 225 additions & 0 deletions src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_base.C
@@ -0,0 +1,225 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/chips/p9/procedures/hwp/pm/p9_pm_recovery_ffdc_base.C $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2015,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*

#include <p9_pm_recovery_ffdc_base.H>
#include <p9_pm_recovery_ffdc_defines.H>
#include <endian.h>
#include <stddef.h>

namespace p9_stop_recov_ffdc
{
PlatPmComplex::PlatPmComplex( const fapi2::Target< fapi2::TARGET_TYPE_PROC_CHIP > i_procChipTgt,
uint32_t i_imageHdrBaseAddr, uint32_t i_traceBufBaseAddr,
uint32_t i_globalBaseAddr, PmComplexPlatId i_plat )
: iv_procChip( i_procChipTgt ),
iv_imageHeaderBaseAddress( i_imageHdrBaseAddr ),
iv_traceBufBaseAddress( i_traceBufBaseAddr ),
iv_globalBaseAddress( i_globalBaseAddr ),
iv_plat( i_plat )
{ }

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

fapi2::ReturnCode PlatPmComplex::collectFfdc( void * i_pHomerBuf )
{
FAPI_DBG("<< PlatPmComplex::collectFfdc");

FAPI_DBG("<< PlatPmComplex::collectFfdc");
return fapi2::FAPI2_RC_SUCCESS;;
}

//---------------------------------------------------------------------------------------------
#ifndef __HOSTBOOT_MODULE // for manual examination of info on cronus

fapi2::ReturnCode PlatPmComplex::debugSramInfo( uint8_t * i_pSramLoc, uint32_t i_dataLen )
{
FAPI_DBG(">>PlatPmComplex::debugSramInfo");
uint32_t l_data = 0;
uint32_t l_doubleWordLength = i_dataLen >> 3;
uint64_t * l_pDoubleWord = (uint64_t *)i_pSramLoc;
uint64_t tempWord = 0;

for ( l_data = 0; l_data < l_doubleWordLength; l_data++ )
{
tempWord = htobe64(*l_pDoubleWord);
*l_pDoubleWord = tempWord;
l_pDoubleWord++;

}

return fapi2::FAPI2_RC_SUCCESS;

}
#endif
//---------------------------------------------------------------------------------------------

fapi2::ReturnCode PlatPmComplex::updatePpeFfdcHeader( PpeFfdcHeader * i_pFfdcHdr,
uint8_t i_ffdcValid, uint8_t i_haltState )
{
FAPI_DBG(">> updatePpeFfdcHeader" );

i_pFfdcHdr->iv_headerSize = sizeof( PpeFfdcHeader );
i_pFfdcHdr->iv_sectionSize = htobe16( sizeof( PpeFfdcLayout ) );
i_pFfdcHdr->iv_ffdcValid = i_ffdcValid;
i_pFfdcHdr->iv_ppeHaltCondition = i_haltState;
i_pFfdcHdr->iv_dashBoardOffset = htobe16( offsetof( struct PpeFfdcLayout, iv_ppeGlobals[0]));
i_pFfdcHdr->iv_sramHeaderOffset = htobe16( offsetof( struct PpeFfdcLayout, iv_ppeImageHeader[0]));
i_pFfdcHdr->iv_sprOffset = htobe16( offsetof( struct PpeFfdcLayout, iv_ppeXirReg[0]));
i_pFfdcHdr->iv_intRegOffset = htobe16( offsetof( struct PpeFfdcLayout, iv_ppeInternalReg[0]));
i_pFfdcHdr->iv_offsetTraces = htobe16( offsetof( struct PpeFfdcLayout, iv_ppeTraces[0] ));

FAPI_DBG( "================== PPE Header ==========================" );
FAPI_DBG( "FFDC Validity Vector : 0x%02x", i_pFfdcHdr->iv_ffdcValid );
FAPI_DBG( "PPE Header Size : 0x%02x", i_pFfdcHdr->iv_headerSize );
FAPI_DBG( "PPE FFDC Section Size : 0x%04x", REV_2_BYTE(i_pFfdcHdr->iv_sectionSize) );
FAPI_DBG( "PPE Halt State : 0x%02x", i_pFfdcHdr->iv_ppeHaltCondition );
FAPI_DBG( "Dash Board Offset : 0x%04x", REV_2_BYTE( i_pFfdcHdr->iv_dashBoardOffset ));
FAPI_DBG( "SRAM Header Offset : 0x%04x", REV_2_BYTE( i_pFfdcHdr->iv_sramHeaderOffset ));
FAPI_DBG( "SPR Offset : 0x%04x", REV_2_BYTE( i_pFfdcHdr->iv_sprOffset ));
FAPI_DBG( "Internal Register Offset : 0x%04x", REV_2_BYTE( i_pFfdcHdr->iv_intRegOffset ));
FAPI_DBG( "Trace Offset : 0x%04x", REV_2_BYTE( i_pFfdcHdr->iv_offsetTraces ));
FAPI_DBG( "================== PPE Header Ends ====================" );

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

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

fapi2::ReturnCode PlatPmComplex::collectSramInfo( const fapi2::Target< fapi2::TARGET_TYPE_EX > & i_exTgt,
uint8_t * i_pSramData,
FfdcDataType i_dataType,
uint32_t i_sramLength )
{
FAPI_DBG(">> PlatPmComplex::collectSramInfo" );

uint32_t l_rows = i_sramLength / sizeof(uint64_t);
uint64_t * l_pSramBuf = (uint64_t *)(i_pSramData);
uint32_t l_actualDoubleWord = 0;
uint32_t l_sramAddress = 0;

switch( i_dataType )
{
case IMAGE_HEADER:
l_sramAddress = iv_imageHeaderBaseAddress;
break;
case DASH_BOARD_VAR:
l_sramAddress = iv_globalBaseAddress;
break;
case TRACES:
l_sramAddress = iv_traceBufBaseAddress;
break;
default:
FAPI_ERR("Bad FFDC Data type. Skipping 0x%d", (uint32_t)i_dataType );
goto fapi_try_exit;
break;
}

FAPI_INF( "CME Start Add 0x%08x Length 0x%08x", l_sramAddress, i_sramLength );

//handle SRAM

FAPI_TRY( p9_cme_sram_access( i_exTgt,
l_sramAddress,
l_rows,
l_pSramBuf,
l_actualDoubleWord ),
"HWP to access CME SRAM Failed" );

#ifndef __HOSTBOOT_MODULE

debugSramInfo( i_pSramData, i_sramLength );

#endif

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

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

fapi2::ReturnCode PlatPmComplex::collectSramInfo( const fapi2::Target< fapi2::TARGET_TYPE_PROC_CHIP > & i_procTgt,
uint8_t * i_pSramData,
FfdcDataType i_dataType,
uint32_t i_sramLength )
{
FAPI_DBG(">> PlatPmComplex::collectSramInfo" );

uint32_t l_rows = i_sramLength / sizeof(uint64_t);
uint64_t * l_pSramBuf = (uint64_t *)(i_pSramData);
uint32_t l_actualDoubleWord = 0;
uint32_t l_sramAddress = 0;

switch( i_dataType )
{
case IMAGE_HEADER:
l_sramAddress = iv_imageHeaderBaseAddress;
break;
case DASH_BOARD_VAR:
l_sramAddress = iv_globalBaseAddress;
break;
case TRACES:
l_sramAddress = iv_traceBufBaseAddress;
break;
default:
FAPI_ERR("Bad FFDC Data type. Skipping 0x%d", (uint32_t)i_dataType );
goto fapi_try_exit;
break;
}

//handle OCC SRAM

FAPI_DBG("OCC SRAM Collection" );
FAPI_TRY( p9_pm_ocb_indir_setup_linear( iv_procChip, // Compiler error work around
p9ocb::OCB_CHAN0,
p9ocb::OCB_TYPE_LINSTR,
l_sramAddress ),
"HWP To Setup OCB Indirect Access Failed" );

FAPI_TRY( p9_pm_ocb_indir_access ( iv_procChip, //Compiler error workaround
p9ocb::OCB_CHAN0,
p9ocb::OCB_GET,
l_rows,
true,
l_sramAddress,
l_actualDoubleWord,
l_pSramBuf ),
"HWP To Access OCC SRAM Failed" );

FAPI_DBG("Actual Length Read from OCC SRAM is 0x%016lx", ( l_actualDoubleWord * sizeof(uint64_t)) );

#ifndef __HOSTBOOT_MODULE

debugSramInfo( i_pSramData, i_sramLength );

#endif

fapi_try_exit:
FAPI_DBG("<< PlatPmComplex::collectSramInfo" );
return fapi2::current_err;
}
}//namespace p9_stop_recov_ffdc ends

0 comments on commit d0605e8

Please sign in to comment.