diff options
Diffstat (limited to 'src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C')
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C new file mode 100755 index 000000000..4beda7535 --- /dev/null +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C @@ -0,0 +1,221 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenPll.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2012 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ + +/** + * @file prdfCenPLL.C + * @brief chip Plug-in code for centaur pll support + */ + +#include <iipServiceDataCollector.h> +#include <prdfExtensibleChip.H> +#include <prdfPluginMap.H> +#include <prdfBitString.H> +#include <iipscr.h> +#include <prdfPlatServices.H> +#include <iipglobl.h> +#include <iipSystem.h> + +namespace PRDF +{ + +namespace Membuf +{ + + +enum +{ + PLL_DETECT_CENT_MEM = 18, // mem PLL error bit + PLL_DETECT_CENT_NEST = 19 // nest PLL error bit +}; + +/** + * @brief Query the PLL chip for a PLL error on Centaur Plugin + * @param i_chip Centaur chip + * @param o_result set to true in the presence of PLL error + * @returns Failure or Success of query. + * @note + */ +int32_t QueryPll( PrdfExtensibleChip * i_chip, + bool & o_result) +{ + 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_CENT_MEM) && + !(TP_LFIRmask->IsBitSet(PLL_DETECT_CENT_MEM))) || + (TP_LFIR->IsBitSet(PLL_DETECT_CENT_NEST) && + !(TP_LFIRmask->IsBitSet(PLL_DETECT_CENT_NEST)))) + { + o_result = true; + } + + } while(0); + + return rc; + +} +PRDF_PLUGIN_DEFINE( Membuf, QueryPll ); + +/** + * @brief Clear the PLL error for Centaur Plugin + * @param i_chip Centaur chip + * @param i_sc The step code data struct. + * @returns Failure or Success of query. + * @note + */ +int32_t ClearPll( PrdfExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & i_sc) +{ + int32_t rc = SUCCESS; + + if (CHECK_STOP != i_sc.service_data->GetAttentionType()) + { + SCAN_COMM_REGISTER_CLASS * TP_LFIR = i_chip->getRegister("TP_LFIR_AND"); + TP_LFIR->setAllBits(); + TP_LFIR->ClearBit(PLL_DETECT_CENT_MEM); + TP_LFIR->ClearBit(PLL_DETECT_CENT_NEST); + rc = TP_LFIR->Write(); + } + + return rc; + +} +PRDF_PLUGIN_DEFINE( Membuf, ClearPll ); + +/** + * @brief Mask the PLL error for Centaur Plugin + * @param i_chip Centaur chip + * @param Output Unused. + * @returns Failure or Success of query. + * @note + */ +int32_t MaskPll( PrdfExtensibleChip * i_chip,void * unused) +{ + int32_t rc = SUCCESS; + + SCAN_COMM_REGISTER_CLASS * TP_LFIR = i_chip->getRegister("TP_LFIR"); + SCAN_COMM_REGISTER_CLASS * TP_LFIR_or = i_chip->getRegister("TP_LFIR_MASK_OR"); + + rc = TP_LFIR->Read(); + TP_LFIR_or->clearAllBits(); + + if(TP_LFIR->IsBitSet(PLL_DETECT_CENT_MEM)) TP_LFIR_or->SetBit(PLL_DETECT_CENT_MEM); + if(TP_LFIR->IsBitSet(PLL_DETECT_CENT_NEST)) TP_LFIR_or->SetBit(PLL_DETECT_CENT_NEST); + + rc |= TP_LFIR_or->Write(); + + return rc; + +} +PRDF_PLUGIN_DEFINE( Membuf, MaskPll ); + +/** + * @brief Adds to the callout list for Centaur PLL errors. + * @param i_chip Centaur chip. + * @param i_sc The step code data struct. + * @return SUCCESS. + */ +int32_t CalloutPll( PrdfExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & i_sc ) +{ + // FIXME: RTC: 51628 will address clock target issue + // set Level 2 callout since we don't have clock target yet + i_sc.service_data->SetCallout( NextLevelSupport_ENUM ); + + return SUCCESS; +} +PRDF_PLUGIN_DEFINE( Membuf, CalloutPll ); + +/** + Send a PLL error message on Centaur Plugin. + @param i_chip the chip that this is for. + @param i_sc service data. + @returns Failure Or Success of message call. + @note + */ +int32_t PllPostAnalysis( PrdfExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & i_sc ) +{ + using namespace TARGETING; + int32_t l_rc = SUCCESS; + +// Need to send MBA Skip Message to MDIA in Hostboot only +#ifdef __HOSTBOOT_MODULE + + TargetHandle_t l_cenHandle = i_chip->GetChipHandle(); + + do + { + TargetHandleList list = PlatServices::getConnected(l_cenHandle , TYPE_MBA); + if ( 0 == list.size() ) + { + PRDF_ERR("[PllPostAnalysis] failed to get MBAs connected to this " + "Membuf: 0x%08x", PlatServices::getHuid(l_cenHandle) ); + l_rc = FAIL; + break; + } + + for (TargetHandleList::iterator mbaIt = list.begin(); mbaIt != list.end(); ++mbaIt) + { + // Get the extensible chip for this mba + PrdfExtensibleChip *l_mbaChip = (PrdfExtensibleChip *)systemPtr->GetChip(*mbaIt); + + //Check to make sure we are at threshold and have something garded. + if( (NULL != l_mbaChip) && + (i_sc.service_data->IsAtThreshold()) && + (i_sc.service_data->QueryGard() != GardResolution::NoGard) ) + { + //Call the Skip Maintanence Command on this mba + PrdfExtensibleChipFunction * l_skipMbaMsg = + l_mbaChip->getExtensibleFunction("SkipMbaMsg", true); + + // This call will return an error if it doesn't complete. + // Don't fail on error. keep going. + l_rc |= (*l_skipMbaMsg)(l_mbaChip, + PrdfPluginDef::bindParm<STEP_CODE_DATA_STRUCT &>(i_sc)); + } + } + + } while(0); + +#endif // ifdef __HOSTBOOT_MODULE + + return l_rc; +} +PRDF_PLUGIN_DEFINE( Membuf, PllPostAnalysis ); + + +} // end namespace Membuf + +} // end namespace PRDF |