diff options
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule | 14 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/Proc_regs_PB.rule | 9 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C | 78 |
3 files changed, 98 insertions, 3 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule index cde63dbc0..69b5175cf 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule @@ -1240,7 +1240,7 @@ group gPbCentFir filter singlebit /** PBCENTFIR[5] * PB_CENT_CRESP_ADDR_ERROR */ - (PbCentFir, bit(5)) ? calloutProcAnalyzeMpIpl; + (PbCentFir, bit(5)) ? combinedResponseError; /** PBCENTFIR[6] * PB_CENT_CRESP_ERROR @@ -1265,7 +1265,7 @@ group gPbCentFir filter singlebit /** PBCENTFIR[10] * PB_CENT_FORCE_MP_IPL */ - (PbCentFir, bit(10)) ? calloutProcAnalyzeMpIpl; + (PbCentFir, bit(10)) ? forceMpIpl; /** PBCENTFIR[11] * PB_CENT_FIR_SPARE_0 @@ -3150,8 +3150,16 @@ actionclass calloutNxThr5pHr threshold5phour; }; -actionclass calloutProcAnalyzeMpIpl +actionclass combinedResponseError +{ + callout2ndLvlMedThr1; + funccall("combinedResponseCallout"); + funccall("analyzeMpIPL"); +}; + +actionclass forceMpIpl { calloutProcLevel2MedThr1; funccall("analyzeMpIPL"); }; + diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_regs_PB.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_regs_PB.rule index 600bcfc93..4b19ffeee 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_regs_PB.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_regs_PB.rule @@ -384,6 +384,15 @@ capture req nonzero("PBEASTFIR"); }; + # c_err_rpt for PBWESTFIR, PBCENTFIR, and PBEASTFIR + register PB_CENT_CR_ERROR + { + name "EH.PB.MISC.PB_CENT_CR_ERROR"; + scomaddr 0x02010c6c; + capture group default; + capture group CerrRegs; + }; + ############################################################################ # PB Chiplet PBEXTFIR ############################################################################ diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C index aeec2edfa..6700a9e2d 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C @@ -582,6 +582,84 @@ PRDF_PLUGIN_DEFINE( Proc, calloutMasterCore ); //------------------------------------------------------------------------------ /** + * @brief Calls out the EX chiplet (MRU_LOW), if possible. Otherwise, calls + * out the PROC (MRU_LOW) + * @param i_chip P8 chip + * @param io_sc service data collector + * @returns SUCCESS + */ +int32_t combinedResponseCallout( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[Proc::combinedResponseCallout] " + + int32_t l_rc = SUCCESS; + + TargetHandle_t procTrgt = i_chip->GetChipHandle(); + + SCAN_COMM_REGISTER_CLASS * reg = i_chip->getRegister("PB_CENT_CR_ERROR"); + + do + { + l_rc = reg->Read(); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"Read() failed on PB_CENT_CR_ERROR" ); + break; + } + + uint32_t tmp = reg->GetBitFieldJustified(0,3); + if ( 0x02 != tmp ) // Must be 0b010 to continue + { + PRDF_ERR( PRDF_FUNC"Unsupported reason code: 0x%02x", tmp ); + l_rc = FAIL; break; + } + + tmp = reg->GetBitFieldJustified(38,5); + if ( 0x00 != tmp ) // Must be 0b00000 to continue + { + PRDF_ERR( PRDF_FUNC"Unsupported combined response encoding: 0x%02x", + tmp ); + l_rc = FAIL; break; + } + + if ( reg->IsBitSet(22) ) // Must be 0b0 to continue + { + PRDF_ERR( PRDF_FUNC"Operation not sourced by an EX chiplet" ); + l_rc = FAIL; break; + } + + // Get the EX target + tmp = reg->GetBitFieldJustified(23,4); + TargetHandle_t exTrgt = getConnectedChild( procTrgt, TYPE_EX, tmp ); + if ( NULL == exTrgt ) + { + PRDF_ERR( PRDF_FUNC"No connected EX chiplet at position %d", tmp ); + l_rc = FAIL; break; + } + + // Callout the EX target + io_sc.service_data->SetCallout( exTrgt, MRU_LOW ); + + } while (0); + + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC"Unable to isolate to an EX chiplet. Calling out " + "PROC 0x%08x instead.", i_chip->GetId() ); + + io_sc.service_data->SetCallout( procTrgt, MRU_LOW ); + } + + return SUCCESS; + + #undef PRDF_FUNC +} +PRDF_PLUGIN_DEFINE( Proc, combinedResponseCallout ); + +//------------------------------------------------------------------------------ + +/** * @brief When not in MNFG mode, clear the service call flag so that * thresholding will still be done, but no visible error log committed. * @param i_chip P8 chip |