diff options
-rw-r--r-- | src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml | 4 | ||||
-rw-r--r-- | src/import/hwpf/fapi2/src/fapi2_utils.C | 159 | ||||
-rw-r--r-- | src/usr/sbeio/common/sbe_retry_handler.C | 52 |
3 files changed, 132 insertions, 83 deletions
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml index 87f7db6f3..a7c695ed1 100644 --- a/src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml +++ b/src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml @@ -49,7 +49,9 @@ <sbeError/> <rc>RC_LPC_OPB_ERROR</rc> <description>After LPC initialization, the OPB master indicated an error.</description> - <collectFfdc>p9_collect_lpc_regs, FFDC_TARGET_CHIP</collectFfdc> + <ffdc>FFDC_TARGET_CHIP</ffdc> + <!-- TODO RTC: 198639 Handle collectFfdc xml tags in fapi error xml in FIFO FFDC buffer --> + <!-- <collectFfdc>p9_collect_lpc_regs, FFDC_TARGET_CHIP</collectFfdc> --> <callout> <procedure>CODE</procedure> <priority>HIGH</priority> diff --git a/src/import/hwpf/fapi2/src/fapi2_utils.C b/src/import/hwpf/fapi2/src/fapi2_utils.C index f1c364f77..f1124d508 100644 --- a/src/import/hwpf/fapi2/src/fapi2_utils.C +++ b/src/import/hwpf/fapi2/src/fapi2_utils.C @@ -84,86 +84,97 @@ uint16_t convertSbeTargInstanceToFapiPos(fapi2::TargetType i_targType, FAPI_ATTR_GET(fapi2::ATTR_FAPI_POS, i_proc, l_procPosition); - switch( i_targType ) + // if the target type being converted is a proc chip, then + // it will be the same proc as the sbe instance, just return that one + if(i_targType == TARGET_TYPE_PROC_CHIP ) { - case TARGET_TYPE_EQ: - { - max_targets = MAX_EQ_PER_PROC; - break; - } - - case TARGET_TYPE_CORE: - { - max_targets = MAX_CORE_PER_PROC; - break; - } - - case TARGET_TYPE_EX: - { - max_targets = MAX_EX_PER_PROC; - break; - } - - case TARGET_TYPE_MCS: - { - max_targets = MAX_MCS_PER_PROC; - break; - } - - case TARGET_TYPE_MCA: - { - max_targets = MAX_MCA_PER_PROC; - break; - } - - case TARGET_TYPE_MC: - { - max_targets = MAX_MC_PER_PROC; - break; - } - - case TARGET_TYPE_MI: - { - max_targets = MAX_MI_PER_PROC; - break; - } - - case TARGET_TYPE_PHB: - { - max_targets = MAX_PHB_PER_PROC; - break; - } - - case TARGET_TYPE_MCBIST: - { - max_targets = MAX_MCBIST_PER_PROC; - break; - } - - case TARGET_TYPE_PERV: - { - max_targets = MAX_PERV_PER_PROC; - break; - } - - default: - max_targets = INVALID_TARGET_COUNT; - break; - } - - if( max_targets == INVALID_TARGET_COUNT ) - { - FAPI_ERR("Unable to determine the target count " - "for target type = 0x%x and instance 0x%d " - "associated with proc position %d", - i_targType, i_instance, l_procPosition); + fapi_pos = l_procPosition; } else { - fapi_pos = max_targets * l_procPosition + - (i_instance % max_targets); + switch( i_targType ) + { + case TARGET_TYPE_EQ: + { + max_targets = MAX_EQ_PER_PROC; + break; + } + + case TARGET_TYPE_CORE: + { + max_targets = MAX_CORE_PER_PROC; + break; + } + + case TARGET_TYPE_EX: + { + max_targets = MAX_EX_PER_PROC; + break; + } + + case TARGET_TYPE_MCS: + { + max_targets = MAX_MCS_PER_PROC; + break; + } + + case TARGET_TYPE_MCA: + { + max_targets = MAX_MCA_PER_PROC; + break; + } + + case TARGET_TYPE_MC: + { + max_targets = MAX_MC_PER_PROC; + break; + } + + case TARGET_TYPE_MI: + { + max_targets = MAX_MI_PER_PROC; + break; + } + + case TARGET_TYPE_PHB: + { + max_targets = MAX_PHB_PER_PROC; + break; + } + + case TARGET_TYPE_MCBIST: + { + max_targets = MAX_MCBIST_PER_PROC; + break; + } + + case TARGET_TYPE_PERV: + { + max_targets = MAX_PERV_PER_PROC; + break; + } + + default: + max_targets = INVALID_TARGET_COUNT; + break; + } + + if( max_targets == INVALID_TARGET_COUNT ) + { + FAPI_ERR("Unable to determine the target count " + "for target type = 0x%x and instance 0x%d " + "associated with proc position %d", + i_targType, i_instance, l_procPosition); + } + else + { + fapi_pos = max_targets * l_procPosition + + (i_instance % max_targets); + } } + FAPI_INF("Returning FAPI_POS= %d for target type 0x%x", fapi_pos, i_targType); + return fapi_pos; } diff --git a/src/usr/sbeio/common/sbe_retry_handler.C b/src/usr/sbeio/common/sbe_retry_handler.C index 4410d089d..25f05311d 100644 --- a/src/usr/sbeio/common/sbe_retry_handler.C +++ b/src/usr/sbeio/common/sbe_retry_handler.C @@ -63,6 +63,9 @@ #include <secureboot/service.H> #include <devicefw/driverif.H> +#include <plat_utils.H> +#include <set_sbe_error.H> + extern trace_desc_t* g_trac_sbeio; @@ -78,6 +81,7 @@ extern trace_desc_t* g_trac_sbeio; TRACDBIN(g_trac_sbeio,"sbe_retry_handler.C: " printf_string,##args) using namespace ERRORLOG; +using namespace fapi2; namespace SBEIO { @@ -979,14 +983,6 @@ void SbeRetryHandler::sbe_get_ffdc_handler(TARGETING::Target * i_target) // Process each FFDC package for(auto i=0; i<l_pkgs; i++) { - // Add each package to the log - l_errl->addFFDC( SBEIO_COMP_ID, - l_ffdc_parser->getFFDCPackage(i), - l_ffdc_parser->getPackageLength(i), - 0, - SBEIO_UDT_PARAMETERS, - false ); - // Get the RC from the FFDC package uint32_t l_rc = l_ffdc_parser->getPackageRC(i); @@ -994,6 +990,46 @@ void SbeRetryHandler::sbe_get_ffdc_handler(TARGETING::Target * i_target) P9_EXTRACT_SBE_RC::RETURN_ACTION l_action = static_cast<P9_EXTRACT_SBE_RC::RETURN_ACTION>(action_for_ffdc_rc(l_rc)); + //See if HWP error, create another error log with callouts + if (l_rc != fapi2::FAPI2_RC_PLAT_ERR_SEE_DATA) + { + fapi2::ReturnCode l_fapiRc; + ffdc_package l_package = {nullptr, 0, 0}; + if(!l_ffdc_parser->getFFDCPackage(i, l_package)) + { + continue; + } + + //Put FFDC into sbeFfdc_t struct and + //call FAPI_SET_SBE_ERROR + fapi2::sbeFfdc_t l_sbeFfdc; + l_sbeFfdc.size = l_package.size; + l_sbeFfdc.data = reinterpret_cast<uint64_t>( + l_package.ffdcPtr); + + uint32_t l_pos = i_target->getAttr<TARGETING::ATTR_FAPI_POS>(); + FAPI_SET_SBE_ERROR(l_fapiRc, l_rc, &l_sbeFfdc, l_pos); + errlHndl_t l_sbeHwpfErr = rcToErrl(l_fapiRc); + if(l_sbeHwpfErr) + { + // Set the PLID of the error log to master PLID + // if the master PLID is set + updatePlids(l_sbeHwpfErr); + + ERRORLOG::errlCommit( l_sbeHwpfErr, SBEIO_COMP_ID ); + } + } + else + { + // Add each package to the log + l_errl->addFFDC( SBEIO_COMP_ID, + l_ffdc_parser->getFFDCPackage(i), + l_ffdc_parser->getPackageLength(i), + 0, + SBEIO_UDT_PARAMETERS, + false ); + } + if(l_action != NO_ACTION_FOUND_FOR_THIS_RC) { // Set the action associated with the RC that we found |