summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_sbe_lpc_init_errors.xml4
-rw-r--r--src/import/hwpf/fapi2/src/fapi2_utils.C159
-rw-r--r--src/usr/sbeio/common/sbe_retry_handler.C52
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
OpenPOWER on IntegriCloud