diff options
author | Chris Phan <cphan@us.ibm.com> | 2014-02-21 14:05:23 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-03-13 13:53:31 -0500 |
commit | b12e7126132fbb4d5fd20441e29301cae425ca57 (patch) | |
tree | 2cf62a572a7da023ce4c6f62aa6f31b238629ef6 /src/usr | |
parent | 762d11a7d6af171096cf4606e105e2389fa4bc5a (diff) | |
download | talos-hostboot-b12e7126132fbb4d5fd20441e29301cae425ca57.tar.gz talos-hostboot-b12e7126132fbb4d5fd20441e29301cae425ca57.zip |
PRD: fixed segfault in PLL analysis
Change-Id: I7c725a854d3141c063f619a29e3dc6e1d8d25cfa
CQ: SW248230
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/9070
Tested-by: Jenkins Server
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: Prem Shanker Jha <premjha2@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.aus.stglabs.ibm.com:8080/gerrit/9444
Diffstat (limited to 'src/usr')
-rwxr-xr-x | src/usr/diag/prdf/common/framework/config/prdfPllDomain.C | 11 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule | 1 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/prdfP8Pll.C | 189 |
3 files changed, 114 insertions, 87 deletions
diff --git a/src/usr/diag/prdf/common/framework/config/prdfPllDomain.C b/src/usr/diag/prdf/common/framework/config/prdfPllDomain.C index 04e8195ff..c2afafef2 100755 --- a/src/usr/diag/prdf/common/framework/config/prdfPllDomain.C +++ b/src/usr/diag/prdf/common/framework/config/prdfPllDomain.C @@ -44,6 +44,8 @@ using namespace TARGETING; namespace PRDF { +using namespace PlatServices; + //------------------------------------------------------------------------------ int32_t PllDomain::Initialize(void) @@ -163,6 +165,15 @@ int32_t PllDomain::Analyze(STEP_CODE_DATA_STRUCT & serviceData, l_chip->CaptureErrorData( serviceData.service_data->GetCaptureData(), Util::hashString("PllFIRs")); + + // Call this chip's capturePllFfdc plugin if it exists. + ExtensibleChipFunction * l_captureFfdc = + l_chip->getExtensibleFunction("capturePllFfdc", true); + if ( NULL != l_captureFfdc ) + { + (*l_captureFfdc)( l_chip, + PluginDef::bindParm<STEP_CODE_DATA_STRUCT &>(serviceData) ); + } } else if ( !PlatServices::isFunctional(l_chip->GetChipHandle()) ) { diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule index 731388538..5feb8cad9 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule @@ -1156,6 +1156,7 @@ actionclass analyzeMcs31 actionclass PllError { capture(PllFIRs); + funccall("capturePllFfdc"); threshold32pday; }; diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Pll.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Pll.C index afa833aa7..b087aceba 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Pll.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Pll.C @@ -36,6 +36,7 @@ #include <iipSystem.h> #include <prdfGlobal_common.H> #include <prdfP8DataBundle.H> +#include <UtilHash.H> using namespace TARGETING; @@ -115,55 +116,6 @@ void GetProcPllErrRegList(ExtensibleChip * i_chip, } /** - * @brief Query the PLL chip for a PLL error on P8 - * @param i_chip P8 Pci chip - * @param o_result set to true in the presence of PLL error - * @returns Failure or Success of query. - * @note - */ -int32_t QueryPll( ExtensibleChip * i_chip, - bool & o_result) -{ - #define PRDF_FUNC "[Proc::QueryPll] " - - int32_t rc = SUCCESS; - o_result = false; - - SCAN_COMM_REGISTER_CLASS * TP_LFIR = - i_chip->getRegister("TP_LFIR"); - SCAN_COMM_REGISTER_CLASS * TP_LFIRmask = - i_chip->getRegister("TP_LFIR_MASK"); - - do - { - rc = TP_LFIR->Read(); - if (rc != SUCCESS) break; - - rc = TP_LFIRmask->Read(); - if (rc != SUCCESS) break; - - if(TP_LFIR->IsBitSet(PLL_DETECT_P8) && - !TP_LFIRmask->IsBitSet(PLL_DETECT_P8)) - { - o_result = true; - } - - } while(0); - - if( rc != SUCCESS ) - { - PRDF_ERR(PRDF_FUNC"failed for proc: 0x%.8X", - i_chip->GetId()); - } - - return rc; - - #undef PRDF_FUNC -} -PRDF_PLUGIN_DEFINE( Proc, QueryPll ); - - -/** * @brief Query the PLL chip for a Proc PLL error * @param i_chip P8 chip * @param o_result set to true in the presence of PLL error @@ -178,35 +130,18 @@ int32_t QueryProcPll( ExtensibleChip * i_chip, int32_t rc = SUCCESS; o_result = false; - SCAN_COMM_REGISTER_CLASS * TP_LFIR = - i_chip->getRegister("TP_LFIR"); - SCAN_COMM_REGISTER_CLASS * TP_LFIRmask = - i_chip->getRegister("TP_LFIR_MASK"); MODEL procModel = getProcModel( i_chip->GetChipHandle() ); - do - { - rc = TP_LFIR->Read(); - if (rc != SUCCESS) break; - - rc = TP_LFIRmask->Read(); - if (rc != SUCCESS) break; - - // First check for LFIR - if( !(TP_LFIR->IsBitSet(PLL_DETECT_P8) && - !(TP_LFIRmask->IsBitSet(PLL_DETECT_P8))) ) - { - break; - } - - // Next check for the error reg bits in the chiplets - P8DataBundle * procdb = getDataBundle( i_chip ); - P8DataBundle::ProcPllErrRegList & procPllErrRegList = - procdb->getProcPllErrRegList(); + // Next check for the error reg bits in the chiplets + P8DataBundle * procdb = getDataBundle( i_chip ); + P8DataBundle::ProcPllErrRegList & procPllErrRegList = + procdb->getProcPllErrRegList(); - // Always get a list here since this is the entry point - GetProcPllErrRegList( i_chip, procPllErrRegList ); + // Always get a list here since this is the entry point + GetProcPllErrRegList( i_chip, procPllErrRegList ); + do + { P8DataBundle::ProcPllErrRegListIter itr = procPllErrRegList.begin(); for( ; itr != procPllErrRegList.end(); ++itr) { @@ -238,6 +173,12 @@ int32_t QueryProcPll( ExtensibleChip * i_chip, } while(0); + // clear the PLL Err Reg list if no pll error was found + if(false == o_result) + { + procPllErrRegList.clear(); + } + if( rc != SUCCESS ) { PRDF_ERR(PRDF_FUNC"failed for proc: 0x%.8X", @@ -264,10 +205,6 @@ int32_t QueryPciPll( ExtensibleChip * i_chip, int32_t rc = SUCCESS; o_result = false; - SCAN_COMM_REGISTER_CLASS * TP_LFIR = - i_chip->getRegister("TP_LFIR"); - SCAN_COMM_REGISTER_CLASS * TP_LFIRmask = - i_chip->getRegister("TP_LFIR_MASK"); SCAN_COMM_REGISTER_CLASS * pciErrReg = i_chip->getRegister("PCI_ERROR_REG"); SCAN_COMM_REGISTER_CLASS * pciConfigReg = @@ -275,21 +212,13 @@ int32_t QueryPciPll( ExtensibleChip * i_chip, do { - rc = TP_LFIR->Read(); - if (rc != SUCCESS) break; - - rc = TP_LFIRmask->Read(); - if (rc != SUCCESS) break; - rc = pciErrReg->Read(); if (rc != SUCCESS) break; rc = pciConfigReg->Read(); if (rc != SUCCESS) break; - if(TP_LFIR->IsBitSet(PLL_DETECT_P8) && - !TP_LFIRmask->IsBitSet(PLL_DETECT_P8) && - pciErrReg->IsBitSet(PLL_ERROR_BIT) && + if(pciErrReg->IsBitSet(PLL_ERROR_BIT) && !pciConfigReg->IsBitSet(PLL_ERROR_MASK)) { o_result = true; @@ -309,6 +238,61 @@ int32_t QueryPciPll( ExtensibleChip * i_chip, } PRDF_PLUGIN_DEFINE( Proc, QueryPciPll ); +/** + * @brief Query the PLL chip for a PLL error on P8 + * @param i_chip P8 Pci chip + * @param o_result set to true in the presence of PLL error + * @returns Failure or Success of query. + * @note + */ +int32_t QueryPll( ExtensibleChip * i_chip, + bool & o_result) +{ + #define PRDF_FUNC "[Proc::QueryPll] " + + int32_t rc = SUCCESS; + o_result = false; + + SCAN_COMM_REGISTER_CLASS * TP_LFIR = + i_chip->getRegister("TP_LFIR"); + SCAN_COMM_REGISTER_CLASS * TP_LFIRmask = + i_chip->getRegister("TP_LFIR_MASK"); + + do + { + rc = TP_LFIR->Read(); + if (rc != SUCCESS) break; + + rc = TP_LFIRmask->Read(); + if (rc != SUCCESS) break; + + if( ! (TP_LFIR->IsBitSet(PLL_DETECT_P8) && + !TP_LFIRmask->IsBitSet(PLL_DETECT_P8)) ) + { + // if global pll bit is not set, break out + break; + } + + rc = QueryPciPll( i_chip, o_result ); + if ((rc != SUCCESS) || (true == o_result)) break; + + rc = QueryProcPll( i_chip, o_result ); + if ((rc != SUCCESS) || (true == o_result)) break; + + } while(0); + + if( rc != SUCCESS ) + { + PRDF_ERR(PRDF_FUNC"failed for proc: 0x%.8X", + i_chip->GetId()); + } + + return rc; + + #undef PRDF_FUNC +} +PRDF_PLUGIN_DEFINE( Proc, QueryPll ); + /** * @brief Clear the PLL error for P8 Plugin @@ -491,6 +475,37 @@ int32_t PllPostAnalysis( ExtensibleChip * i_chip, } PRDF_PLUGIN_DEFINE( Proc, PllPostAnalysis ); +/** + * @brief capture additional PLL FFDC + * @param i_chip P8 chip + * @param i_sc service data collector + * @returns Success + */ +int32_t capturePllFfdc( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[capturePllFfdc] " + + TargetHandleList exList = getConnected( + i_chip->GetChipHandle(), TYPE_EX); + ExtensibleChip * exChip; + TargetHandleList::iterator itr = exList.begin(); + for( ; itr != exList.end(); ++itr) + { + exChip = (ExtensibleChip *)systemPtr->GetChip(*itr); + if( NULL == exChip ) continue; + + exChip->CaptureErrorData( + io_sc.service_data->GetCaptureData(), + Util::hashString("PllFIRs")); + } + + return SUCCESS; + +#undef PRDF_FUNC +} +PRDF_PLUGIN_DEFINE( Proc, capturePllFfdc ); + } // end namespace Proc } // end namespace PRDF |