diff options
Diffstat (limited to 'src')
| -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 | 

