diff options
| author | Zane Shelley <zshelle@us.ibm.com> | 2013-10-02 16:17:18 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-10-09 21:32:42 -0500 |
| commit | 9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a (patch) | |
| tree | 892615d6d97072e37cd2cafe30dee8c360dfb8ae /src | |
| parent | a4e6f46e545a6a8071975a827af1a442454963dd (diff) | |
| download | blackbird-hostboot-9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a.tar.gz blackbird-hostboot-9e80b02f9e4ebb45ecd5da03e85ef0b96af0ab6a.zip | |
PRD: Fixed MBA SCOM error during step 11
Change-Id: I98a69a5e9e6abf29e46439ce833274ad2ece3310
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6451
Tested-by: Jenkins Server
Reviewed-by: Christopher T. Phan <cphan@us.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6587
Diffstat (limited to 'src')
4 files changed, 108 insertions, 26 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C index 371ea99a7..caf5e6aeb 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C @@ -37,9 +37,10 @@ #include <UtilHash.H> // Pegasus includes -#include <prdfCenMbaDataBundle.H> -#include <prdfCenMarkstore.H> #include <prdfCenDqBitmap.H> +#include <prdfCenMarkstore.H> +#include <prdfCenMbaDataBundle.H> +#include <prdfCenMembufDataBundle.H> using namespace TARGETING; @@ -53,6 +54,87 @@ namespace CenMbaCaptureData //------------------------------------------------------------------------------ +void addMbaFirRegs( ExtensibleChip * i_membChip, CaptureData & io_cd ) +{ + #define PRDF_FUNC "[CenMbaCaptureData::addMbaFirRegs] " + + int32_t l_rc = SUCCESS; + + do + { + if ( NULL == i_membChip ) + { + PRDF_ERR( PRDF_FUNC"Given target is NULL" ); + break; + } + + if ( TYPE_MEMBUF != getTargetType(i_membChip->GetChipHandle()) ) + { + PRDF_ERR( PRDF_FUNC"Invalid target type: i_membChip=0x%08x", + i_membChip->GetId() ); + break; + } + + SCAN_COMM_REGISTER_CLASS * cs_reg, * re_reg, * firmsk_reg; + cs_reg = i_membChip->getRegister("MEM_CHIPLET_CS_FIR"); + re_reg = i_membChip->getRegister("MEM_CHIPLET_RE_FIR"); + firmsk_reg = i_membChip->getRegister("MEM_CHIPLET_FIR_MASK"); + + SCAN_COMM_REGISTER_CLASS * spa_reg, * spamsk_reg; + spa_reg = i_membChip->getRegister("MEM_CHIPLET_SPA"); + spamsk_reg = i_membChip->getRegister("MEM_CHIPLET_SPA_MASK"); + + l_rc = cs_reg->Read() | re_reg->Read() | firmsk_reg->Read(); + l_rc |= spa_reg->Read() | spamsk_reg->Read(); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"Failed to read a MEM_CHIPLET register on " + "0x%08x", i_membChip->GetId() ); + break; + } + + uint16_t cs_tmp = cs_reg->GetBitFieldJustified(0,16); + uint16_t re_tmp = re_reg->GetBitFieldJustified(0,16) >> 2; + uint16_t msk_tmp = firmsk_reg->GetBitFieldJustified(0,16); + + uint16_t csre_attns = (cs_tmp | re_tmp) & ~msk_tmp; + + uint16_t spa_attns = spa_reg->GetBitFieldJustified(0,16) & + ~spamsk_reg->GetBitFieldJustified(0,16); + + uint16_t mba_csre_msk[] = { 0x0648, // bits 5, 6, 9, 12 + 0x01a4 }; // bits 7, 8, 10, 13 + uint16_t mba_spa_msk[] = { 0x8000, // bit 0 + 0x4000 }; // bit 1 + + CenMembufDataBundle * membdb = getMembufDataBundle( i_membChip ); + + for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ ) + { + if ( (0 != (csre_attns & mba_csre_msk[i])) || + (0 != (spa_attns & mba_spa_msk[i] )) ) + { + ExtensibleChip * mbaChip = membdb->getMbaChip(i); + if ( NULL == mbaChip ) + { + PRDF_ERR( PRDF_FUNC"MEM_CHIPLET registers indicated an " + "attention but no chip found: i_membChip=0x%08x " + "i=%d", i_membChip->GetId(), i ); + continue; + } + + mbaChip->CaptureErrorData(io_cd, Util::hashString("FirRegs") ); + mbaChip->CaptureErrorData(io_cd, Util::hashString("CerrRegs")); + } + } + + } while (0); + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + void addMemEccData( TargetHandle_t i_mbaTrgt, errlHndl_t io_errl ) { CaptureData cd; diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H index bc0cdb1a4..4185dc2f3 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.H @@ -43,6 +43,19 @@ namespace CenMbaCaptureData { /** + * @brief Adds all MBA FirRegs and CerrRegs to the capture data for any MBA + * reporting an active attention via the MEM_CHIPLET_FIRs. + * @note This is only intended to be called in the MCS or MEMBUF PreAnalysis() + * plugins to capture the required FIR registers for FFDC. + * @note We are required to do the active attention check because there is a + * small window during the IPL where we may get an MCS or MEMBUF + * attention and the MBAs are not SCOMable at the time. + * @param i_membChip A MEMBUF chip. + * @param io_cd Capture data struct. + */ +void addMbaFirRegs( ExtensibleChip * i_membChip, CaptureData & io_cd ); + +/** * @brief Adds Memory ECC FFDC to an error log. * @note This is intended to be used in non-normal analysis paths that do not * have an SDC (i.e. Restore DRAM Repairs, IPL MNFG CE Isolation). diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C index 1b1373168..f0f0c9835 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C @@ -220,15 +220,7 @@ int32_t PreAnalysis( ExtensibleChip * i_mbChip, STEP_CODE_DATA_STRUCT & i_sc, mcsChip->CaptureErrorData( cd, Util::hashString("FirRegs") ); mcsChip->CaptureErrorData( cd, Util::hashString("CerrRegs") ); - for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ ) - { - ExtensibleChip * mbaChip = mbdb->getMbaChip(i); - if ( NULL != mbaChip ) - { - mbaChip->CaptureErrorData( cd, Util::hashString("FirRegs") ); - mbaChip->CaptureErrorData( cd, Util::hashString("CerrRegs") ); - } - } + CenMbaCaptureData::addMbaFirRegs( i_mbChip, cd ); } // Check for a Centaur Checkstop diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C index 5a3747b94..02af45f66 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Mcs.C @@ -25,15 +25,19 @@ * @brief Contains all the plugin code for the PRD P8 MCS */ +// Framework includes #include <iipServiceDataCollector.h> +#include <iipSystem.h> #include <prdfExtensibleChip.H> +#include <prdfGlobal.H> #include <prdfPluginMap.H> #include <UtilHash.H> -#include <prdfGlobal.H> -#include <iipSystem.h> -#include <prdfP8McsDataBundle.H> + +// Pegasus includes +#include <prdfCenMbaCaptureData.H> #include <prdfCenMembufDataBundle.H> #include <prdfLaneRepair.H> +#include <prdfP8McsDataBundle.H> //############################################################################## // @@ -108,8 +112,8 @@ int32_t CheckCentaurCheckstop( ExtensibleChip * i_mcsChip, * @param o_analyzed TRUE if analysis has been done on this chip * @return failure or success */ -int32_t PreAnalysis ( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc, - bool & o_analyzed ) +int32_t PreAnalysis( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc, + bool & o_analyzed ) { o_analyzed = false; @@ -122,16 +126,7 @@ int32_t PreAnalysis ( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & i_sc, membChip->CaptureErrorData( cd, Util::hashString("FirRegs") ); membChip->CaptureErrorData( cd, Util::hashString("CerrRegs") ); - CenMembufDataBundle * mbdb = getMembufDataBundle( membChip ); - for ( uint32_t i = 0; i < MAX_MBA_PER_MEMBUF; i++ ) - { - ExtensibleChip * mbaChip = mbdb->getMbaChip(i); - if ( NULL != mbaChip ) - { - mbaChip->CaptureErrorData( cd, Util::hashString("FirRegs") ); - mbaChip->CaptureErrorData( cd, Util::hashString("CerrRegs") ); - } - } + CenMbaCaptureData::addMbaFirRegs( membChip, cd ); } // Check for a Centaur Checkstop |

