diff options
author | Richard J. Knight <rjknight@us.ibm.com> | 2012-10-16 00:13:25 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-11-03 14:39:41 -0500 |
commit | 0fb4ee347957ceb2b58a200551fe6cf2cc212e74 (patch) | |
tree | 14efe53094c44be5beb1afe62be4b65bf143014f /src | |
parent | 5aa9bef02647193eed4ce4d26851bd5d79c87c01 (diff) | |
download | talos-hostboot-0fb4ee347957ceb2b58a200551fe6cf2cc212e74.tar.gz talos-hostboot-0fb4ee347957ceb2b58a200551fe6cf2cc212e74.zip |
Return error when procedures fail during istep
Change-Id: I65686d261583ea84c7908f819071bd751fdb0e06
RTC: 39876
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1627
Tested-by: Jenkins Server
Reviewed-by: Brian H. Horton <brianh@linux.ibm.com>
Reviewed-by: Paul Nguyen <nguyenp@us.ibm.com>
Reviewed-by: Mark W. Wenning <wenning@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
26 files changed, 1982 insertions, 246 deletions
diff --git a/src/build/tools/genIStep.pl b/src/build/tools/genIStep.pl index 9e1c362b0..f3490432b 100755 --- a/src/build/tools/genIStep.pl +++ b/src/build/tools/genIStep.pl @@ -329,6 +329,8 @@ my $templateCFileHdr = #include <fapi.H> #include <fapiPlatHwpInvoker.H> +#include <hwpisteperror.H> + #include \"\@istepname.H\" // Uncomment these files as they become available: @@ -345,6 +347,7 @@ namespace \@\@istepname { using namespace TARGETING; +using namespace ISTEP_ERROR; using namespace fapi; "; ##### end templateCFileNSHdr ##################################### @@ -361,12 +364,14 @@ my $templateCFileSubStep = // void* call_\@substepname( void *io_pArgs ) { - errlHndl_t l_errl = NULL; + + IStepError l_StepError; TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, \"call_\@substepname entry\" ); #if 0 + errlHndl_t l_errl = NULL; // \@\@\@\@\@ CUSTOM BLOCK: \@\@\@\@\@ // figure out what targets we need // customize any other inputs @@ -390,6 +395,9 @@ void* call_\@substepname( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, \"ERROR : \@substepname, errorlog PLID=0x%x\", lerrl->plid() ); + + l_StepError.addErrorDetails( __REASON_CODE__, __MODULE_ID__, l_errl); + errlCommit( l_errl, HWPF_COMP_ID ); } else @@ -404,7 +412,7 @@ void* call_\@substepname( void *io_pArgs ) \"call_\@substepname exit\" ); // end task, returning any errorlogs to IStepDisp - return l_errl ; + return l_StepError.getErrorHandle(); } "; ##### end templateCFileSubStep ################################# diff --git a/src/include/usr/errl/errlentry.H b/src/include/usr/errl/errlentry.H index bc9d8a32a..e92a362b9 100644 --- a/src/include/usr/errl/errlentry.H +++ b/src/include/usr/errl/errlentry.H @@ -198,19 +198,28 @@ public: */ void setModuleId( const uint8_t i_moduleId ); + /** + * @brief Get the unique error log identifier (EID) of the error log. + * + * @return The error log ID of the error log. + */ + uint32_t eid() const; /** - * @brief Get the unique platform log identifier (PLID) of the error log. - * In legacy FSP, you could have one platform log ID such that a - * of entry IDs (EIDs) related to a single PLID. So far in Hostboot, - * PLID == EID. As such, there is no setter in the ErrlEntry interface - * for EID. When flattened as PEL for export, EID will be set to PLID. + * @brief Get the platform log identifier (PLID) of the error log. + * In legacy FSP, you could have one platform log ID such that a series + * of entry IDs (EIDs) related to a single PLID. * * @return The platform log ID of the error log. */ uint32_t plid() const; - + /** + * @brief Set the platform log id for this error log. + * + * @return The platform log ID of the error log. + */ + void plid( uint32_t i_plid); /** * @brief Get the event type of the error log. @@ -291,7 +300,40 @@ public: */ void setTermState(const errlTermState_t i_termState); + /** + * @brief Add data to the iv_Src user data words. + * + * @param[in] i_data - information to add to the user data word 1. + * + * @return void + * + */ + void addUserData1( const uint64_t i_data ); + /** + * @brief Add data to the iv_Src user data words. + * + * @param[in] i_data - information to add to the user data word 2. + * + * @return void + * + */ + void addUserData2( const uint64_t i_data ); + /** + * @brief Return iv_Src user data words. + * + * @return data1 word from SRC + * + */ + uint64_t getUserData1() const; + + /** + * @brief Return iv_Src user data words. + * + * @return data2 word from SRC + * + */ + uint64_t getUserData2() const; /** * @brief Allows the caller to add a chunk of FFDC data in a log @@ -498,11 +540,21 @@ private: //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// +inline uint32_t ErrlEntry::eid() const +{ + return iv_Private.iv_eid; +} + inline uint32_t ErrlEntry::plid() const { return iv_Private.iv_plid; } - +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +inline void ErrlEntry::plid( uint32_t i_plid) +{ + iv_Private.iv_plid = i_plid; +} //////////////////////////////////////////////////////////////////////////// @@ -549,6 +601,32 @@ inline void ErrlEntry::setReasonCode( const uint16_t i_reasonCode ) //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// +inline void ErrlEntry::addUserData1( const uint64_t i_data ) +{ + iv_Src.iv_user1 = i_data; +} + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +inline void ErrlEntry::addUserData2( const uint64_t i_data ) +{ + iv_Src.iv_user2 = i_data; +} +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +inline uint64_t ErrlEntry::getUserData1() const +{ + return iv_Src.iv_user1; +} +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +inline uint64_t ErrlEntry::getUserData2() const +{ + return iv_Src.iv_user2; +} + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// inline uint16_t ErrlEntry::reasonCode() const { return iv_Src.iv_reasonCode; diff --git a/src/include/usr/errl/errlprvt.H b/src/include/usr/errl/errlprvt.H index d8086b50b..86bfb820a 100644 --- a/src/include/usr/errl/errlprvt.H +++ b/src/include/usr/errl/errlprvt.H @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/include/usr/errl/errlprvt.H $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// 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 other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/errl/errlprvt.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2011,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 */ #ifndef ERRLPRVT_H #define ERRLPRVT_H @@ -110,10 +110,10 @@ private: uint64_t iv_committed; // TODO Expects BCD_time8_t, but using timebase uint8_t iv_cid; // Creator 'B' (enum errlCreator) uint8_t iv_sctns; // count of sections - uint32_t iv_plid; // error log id + uint32_t iv_plid; // platform log id + uint32_t iv_eid; // Error Log ID // uint8_t iv_cssver[CSS_VER]; // TODO unused now, do we need this? - // uint32_t iv_eid; // TODO Error ID now same as PLID }; diff --git a/src/include/usr/hwpf/hwp/hwpisteperror.H b/src/include/usr/hwpf/hwp/hwpisteperror.H new file mode 100644 index 000000000..1f7be8213 --- /dev/null +++ b/src/include/usr/hwpf/hwp/hwpisteperror.H @@ -0,0 +1,176 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/hwpf/hwp/hwpisteperror.H $ */ +/* */ +/* 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 */ +#ifndef __ISTEPERROR_H +#define __ISTEPERROR_H +/** + * @file isteperror.H + * + * Defines the following classes: + * + * IStepError: Handles creation of a top level error to incidate that a + * particular ISTEP has failed, all hwp error plids are added + * to the top level error. + */ + +#include <errl/errlentry.H> +#include <hwpf/istepreasoncodes.H> + + +namespace ISTEP_ERROR +{ + /** + * @class IStepError + * + * Inteface to the a top level error log returned to the ISTEP dispatcher when + * an individual step fails due to an error in a hardware procedure. + * + * The class may be used to aggregate the errors returned from procedures + * which may have been run in parallel. The top level error log will + * indicate the failed step and the module in which the error was created. + * Callers should note that only the addErrorDetails call should be used + * within a thread. + * + * NOTE: This class returns an allocated error log object which needs to + * deleted by the reciever. + * users must call getErrorHandle() to recieve the pointer which can + * be deleted. + * + */ + class IStepError + { + public: + /** + * @brief + */ + IStepError() + : iv_eHandle(NULL), iv_errorCount(0) + { + mutex_init( &iv_mutex ); + }; + + /** + * @brief Destructor + * + * Will free internal storage if getErrorHandle is not called + */ + ~IStepError() + { + mutex_destroy( &iv_mutex ); + + if( iv_eHandle ) + { + delete iv_eHandle; + } + }; + + /** + * @brief Adds selected error details from the passed in + * error to the top level istep error log object + * + * The expected usage for this object is to agrigate + * errors which may have been generated by hardware + * procedures which are run in parallel. + * + * The first call will initialize the internal object + * pointer allocating a new errl object as needed. + * Subsequent calls to this function will result in a new + * user data section being added to the top level error + * log with additional error data from the error handle + * passed in. + * + * NOTE: This function is thread safe. + * + * @param: reasoncode - reason code identifying which Istep has + * failed + * @param: modid - module id identifying which module or + * procedure has caused the error to be + * created + * + * @param i_err - error handle passed in, the internal code + * will parse specific details from the log + * passed in to include in the top level elog. + */ + void addErrorDetails(ISTEP::istepReasonCode reasoncode, + ISTEP::istepModuleId modid, + errlHndl_t i_err ); + + /** + * @brief Return an errlHndl_t which points to the internal error + * log object. + * + * Note: Caller must delete the errlHndl_t after use. + * This funciton is not thread safe + * + * @return iv_eHandle - error handle of top level ISTEP error to + * be returned to the ISTEP dispatcher. + * + */ + errlHndl_t getErrorHandle(); + + /** + * @brief Utility function to determine if the internal error handle + * is null. + * + * @return boolean + * true indicates errl handle is currently NULL; + * false indicates error object has been + * allocated; + * + * Note: This funciton is not thread safe + * + */ + bool isNull() const { return ((iv_eHandle == NULL ) ? true : false); }; + + private: + + // disable copy constructor + IStepError(const IStepError&); + + // serialize access to the internal data area + mutex_t iv_mutex; + + // pointer to the top level ISTEP error log, this log will be + // passed back to the istep dispatcher when a hardware proceudre + // fails. + errlHndl_t iv_eHandle; + + // count placed in user data 3 of the error log to indicate how + // many errors were captured in this top level elog + uint32_t iv_errorCount; + + }; + + inline errlHndl_t IStepError::getErrorHandle() + { + errlHndl_t l_err = iv_eHandle; + + // storage will be freed by destructor if the pointer is non-null + iv_eHandle = NULL; + + return l_err; + }; + + +}; + +#endif diff --git a/src/include/usr/hwpf/hwp/hwpistepud.H b/src/include/usr/hwpf/hwp/hwpistepud.H new file mode 100644 index 000000000..ab0d486c4 --- /dev/null +++ b/src/include/usr/hwpf/hwp/hwpistepud.H @@ -0,0 +1,143 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/hwpf/hwp/hwpistepud.H $ */ +/* */ +/* 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 */ +#ifndef INITSVC_UDSTEP_H +#define INITSVC_UDSTEP_H + +/** + * @file initsvcudistep.H + * + * Defines the following classes: + * + * IStepUserDetailsIstep: Adds IStep FFDC to an error log as user detail data + * IStepUserDetailsParserIstep: Parses IStep FFDC user detail in an error log + */ + +#include <errl/errluserdetails.H> + +// user data type for istep error details +static const uint32_t HWP_UDT_STEP_ERROR_DETAILS = 0x01; + +namespace ISTEP_ERROR +{ + + /** + * @struct IStepUserDetailsIstepData + * + * Defines the user detail data + */ + struct HwpUserDetailsIstepErrorData + { + uint32_t eid; + uint32_t reasoncode; + }; + +#ifndef PARSER + + /** + * @class IStepUserDetailsIstep + * + * Adds IStep FFDC to an error log as user detail data + */ + class HwpUserDetailsIstep : public ERRORLOG::ErrlUserDetails + { + public: + /** + * @brief Constructor + * + * Captures the supplied IStep FFDC data internally + * + * @param i_err error log returned by hardware procdure + * + */ + HwpUserDetailsIstep( errlHndl_t i_err); + + HwpUserDetailsIstep( ); + + /** + * @brief Destructor + */ + virtual ~HwpUserDetailsIstep(); + + private: + // Disabled + HwpUserDetailsIstep(const HwpUserDetailsIstep &); + HwpUserDetailsIstep & operator=(const HwpUserDetailsIstep &); + }; + +#else // (if PARSER defined) + + /** + * @class IStepUserDetailsParserIstep + * + * Parses Istep user detail in an error log + */ + class HwpUserDetailsParserIstep : public ERRORLOG::ErrlUserDetailsParser + { + public: + /** + * @brief Constructor + */ + HwpUserDetailsParserIstep() {} + + /** + * @brief Destructor + */ + virtual ~HwpUserDetailsParserIstep() {} + + /** + * @brief Parses Istep user detail data from an error log + * + * @param i_version Version of the data + * @param i_parse ErrlUsrParser object for outputting + * information + * @param i_pBuffer Pointer to buffer containing detail data + * @param i_buflen Length of the buffer + */ + virtual void parse(errlver_t i_version, + ErrlUsrParser & i_parser, + void * i_pBuffer, + const uint32_t i_buflen) const + { + HwpUserDetailsIstepErrorData * l_pData = + static_cast<HwpUserDetailsIstepErrorData *>(i_pBuffer); + + i_parser.PrintNumber("See error log ID:","0x%X", + ntohl(l_pData->eid)); + + i_parser.PrintNumber("Reasoncode:","0x%X", + ntohl(l_pData->reasoncode) ); + } + + private: + // Disabled + HwpUserDetailsParserIstep(const HwpUserDetailsParserIstep &); + HwpUserDetailsParserIstep & operator=( + const HwpUserDetailsParserIstep &); + }; +#endif + +} + +#endif + + diff --git a/src/include/usr/hwpf/hwp/hwpistepudparserfactory.H b/src/include/usr/hwpf/hwp/hwpistepudparserfactory.H new file mode 100644 index 000000000..be89a89f6 --- /dev/null +++ b/src/include/usr/hwpf/hwp/hwpistepudparserfactory.H @@ -0,0 +1,68 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/hwpf/hwp/hwpistepudparserfactory.H $ */ +/* */ +/* 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 */ +#ifndef __ISTEP_UDPARSERFACTORY_H +#define __ISTEP_UDPARSERFACTORY_H + +#ifdef PARSER + +/** + * @file initsvcudparserfactory.H + * + * Defines the IStepUserDetailsParserFactory.H class +*/ +#include <hwpf/istepvcreasoncodes.H> +#include <errl/errludparserfactory.H> + +namespace INITSERVICE +{ + +/** + * @class IStepUserDetailsParserFactory + * + * This factory produces ErrlUserDetailsParser objects to parse the specified + * InitService user detail data. +*/ +class IStepUserDetailsParserFactory : public ERRORLOG::ErrlUserDetailsParserFactory +{ +public: + + /** + * @brief Constructor + */ + IStepUserDetailsParserFactory() + { + registerParser<IStepUserDetailsParserIstep>( ISTEP_UDT_PLID ); + } + +private: + + // Disabled + IStepUserDetailsParserFactory(const IStepUserDetailsParserFactory &); + IStepUserDetailsParserFactory & operator=( + const IStepUserDetailsParserFactory &); +}; + +} + +#endif +#endif diff --git a/src/include/usr/hwpf/istepreasoncodes.H b/src/include/usr/hwpf/istepreasoncodes.H index 084f633ae..72e852827 100644 --- a/src/include/usr/hwpf/istepreasoncodes.H +++ b/src/include/usr/hwpf/istepreasoncodes.H @@ -50,9 +50,50 @@ enum istepModuleId ISTEP_STARTPAYLOAD_EXECUTE_UNIT_TESTS = 0x01, ISTEP_START_PAYLOAD_CALL_SHUTDOWN = 0x02, ISTEP_START_PAYLOAD_NOTIFY_FSP = 0x03, - ISTEP_ACTIVATE_SLAVE_CORES = 0x04, + ISTEP_HOST_ACTIVATE_SLAVE_CORES = 0x04, ISTEP_BUILD_WINKLE_IMAGES = 0x05, - ISTEP_CORE_ACTIVATE = 0x06, + ISTEP_PROC_STARTCLOCK_CHIPLETS = 0x06, + ISTEP_PROC_CHIPLET_SCOMINIT = 0x07, + ISTEP_PROC_SCOMOVERRIDE_CHIPLETS = 0x08, + ISTEP_FABRIC_IO_RUN_TRAINING = 0x09, + ISTEP_PROC_FAB_IOVALID = 0x0a, + ISTEP_PROC_BUILD_SMP = 0x0b, + ISTEP_MSS_MEMDIAG = 0x0c, + ISTEP_MSS_SCRUB = 0x0d, + ISTEP_HOST_BUILD_WINKLE = 0x0e, + ISTEP_IO_RUN_TRAINING = 0x0f, + ISTEP_PROC_CEN_FRAMEWORK = 0x10, + ISTEP_MEM_STARTCLOCKS = 0x11, + ISTEP_PROC_SET_PORE_BAR = 0x12, + ISTEP_PROC_PREP_MASTER_WINKLE = 0x13, + ISTEP_HOST_ACTIVATE_MASTER = 0x14, + ISTEP_PROC_SETUP_BARS = 0x15, + ISTEP_PROC_EXIT_CACHE_CONTAINED = 0x16, + ISTEP_MSS_EXTENT_SETUP = 0x17, + ISTEP_MSS_SETUP_BARS = 0x18, + ISTEP_MSS_SCOMINIT = 0x19, + ISTEP_MSS_DDR_PHY_RESET = 0x1a, + ISTEP_MSS_DRAMINIT = 0x1b, + ISTEP_MSS_DRAMINIT_TRAINING = 0x1c, + ISTEP_MSS_DRAMINIT_MC = 0x1d, + ISTEP_MSS_VOLT = 0x1e, + ISTEP_MSS_FREQ = 0x1f, + ISTEP_MSS_EFF_CONFIG = 0x20, + ISTEP_SBE_CENTAUR_INIT = 0x21, + ISTEP_PROC_REVERT_SBE_MCS_SETUP = 0x22, + ISTEP_HOST_IPL_COMPLETE = 0x23, + ISTEP_PROC_A_X_PCI_DMI_PLL_INITF = 0x24, + ISTEP_PROC_A_X_PCI_DMI_PLL_SETUP = 0x25, + ISTEP_PROC_FAPI_POREVE = 0x26, + ISTEP_PROC_CEN_FRAMELOCK = 0x27, + ISTEP_DMI_SCOMINIT = 0x28, + ISTEP_DMI_IO_RUN_TRAINING = 0x29, + ISTEP_PROC_OPT_MEMMAP = 0x2a, + ISTEP_MEM_PLL_SETUP = 0x2b, + ISTEP_PROC_SLW_BUILD = 0x2c, + ISTEP_PROC_FAB_IOVALID_EROR = 0x2d, + ISTEP_LOAD_PORE_IMAGE = 0x2e, + ISTEP_APPLY_PORE_GEN_CPU_REGS = 0x2f, }; /** @@ -69,8 +110,23 @@ enum istepReasonCode ISTEP_MBOX_MSG_NULL = ISTEP_COMP_ID | 0x03, ISTEP_BAD_RC = ISTEP_COMP_ID | 0x04, ISTEP_FAIL_MASTER_WINKLE_RC = ISTEP_COMP_ID | 0x05, -}; - + ISTEP_SLAVE_SBE_FAILED = ISTEP_COMP_ID | 0x06, + ISTEP_NEST_CHIPLETS_FAILED = ISTEP_COMP_ID | 0x07, + ISTEP_EDI_EI_INITIALIZATION_FAILED = ISTEP_COMP_ID | 0x08, + ISTEP_ACTIVATE_POWER_BUS_FAILED = ISTEP_COMP_ID | 0x09, + ISTEP_SBE_CENTAUR_INIT_FAILED = ISTEP_COMP_ID | 0x0a, + ISTEP_DMI_TRAINING_FAILED = ISTEP_COMP_ID | 0x0b, + ISTEP_MC_CONFIG_FAILED = ISTEP_COMP_ID | 0x0c, + ISTEP_DRAM_TRAINING_FAILED = ISTEP_COMP_ID | 0x0d, + ISTEP_DRAM_INITIALIZATION_FAILED = ISTEP_COMP_ID | 0x0e, + ISTEP_BUILD_WINKLE_IMAGES_FAILED = ISTEP_COMP_ID | 0x0F, + ISTEP_CORE_ACTIVATE_FAILED = ISTEP_COMP_ID | 0x10, + ISTEP_STEP_SEVENTEEN = ISTEP_COMP_ID | 0x11, + ISTEP_ESTABLISH_SYSTEM_SMP_FAILED = ISTEP_COMP_ID | 0x12, + ISTEP_STEP_NINETEEN = ISTEP_COMP_ID | 0x13, + ISTEP_LOAD_PAYLOAD_FAILED = ISTEP_COMP_ID | 0x14, + ISTEP_START_PAYLOAD_FAILED = ISTEP_COMP_ID | 0x15, }; // end ISTEP +} #endif diff --git a/src/usr/errl/errlprvt.C b/src/usr/errl/errlprvt.C index 064d842b8..6b8a85ce2 100644 --- a/src/usr/errl/errlprvt.C +++ b/src/usr/errl/errlprvt.C @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/usr/errl/errlprvt.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// 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 other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/errl/errlprvt.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2011,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 errlprvt.C * @@ -63,7 +63,7 @@ ErrlPrvt::ErrlPrvt( compId_t i_CreatorCompId ) : iv_sctns( 0 ) { // Ask the errl manager for the next ID to assign. - iv_plid = ERRORLOG::theErrlManager::instance().getUniqueErrId(); + iv_plid = iv_eid = ERRORLOG::theErrlManager::instance().getUniqueErrId(); // Set the time of creation. // TODO The field iv_created and iv_committed expect an 8-byte @@ -118,9 +118,7 @@ uint64_t ErrlPrvt::flatten( void * o_pBuffer, const uint64_t i_cbBuffer ) p->creatorId = iv_cid; p->sectionCount = iv_sctns; p->plid = iv_plid; - - // TODO In the future, eid may be different than PLID - p->eid = iv_plid; + p->eid = iv_eid; // return amount of bytes flattened l_rc = iv_header.iv_slen; diff --git a/src/usr/errl/parser/errlparser.C b/src/usr/errl/parser/errlparser.C index 20fcac589..801da1635 100644 --- a/src/usr/errl/parser/errlparser.C +++ b/src/usr/errl/parser/errlparser.C @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/usr/errl/parser/errlparser.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// 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 other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/errl/parser/errlparser.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2011,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 */ /** @@ -895,13 +895,13 @@ int main( int argc, char *argv[] ) } printf( "%-16s %8d\n", FindComp(pPrivateHdr->sectionheader.compId), - pPrivateHdr->plid ); + pPrivateHdr->eid ); } - else if(( fDetail ) && (( pPrivateHdr->plid == ulLogId ) || (fAll))) + else if(( fDetail ) && (( pPrivateHdr->eid == ulLogId ) || (fAll))) { // Write the native PEL to a temporary file // for x86 errl tool to display. - sprintf( szTmpFilename, "/tmp/pel%d.bin", pPrivateHdr->plid ); + sprintf( szTmpFilename, "/tmp/pel%d.bin", pPrivateHdr->eid ); int fd = open( szTmpFilename, O_RDWR | O_CREAT , 0664 ); if( -1 == fd ) @@ -974,7 +974,7 @@ int main( int argc, char *argv[] ) if( fExtractPEL ) { // Write the native PEL to a temporary file for debug later. - sprintf( szTmpFilename, "%s/pel%d.bin", pszOutputDir, pPrivateHdr->plid ); + sprintf( szTmpFilename, "%s/pel%d.bin", pszOutputDir, pPrivateHdr->eid ); int fd = open( szTmpFilename, O_RDWR | O_CREAT , 0664 ); if( -1 == fd ) diff --git a/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C b/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C index 3b6a834b0..22ad5a613 100644 --- a/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C +++ b/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C @@ -45,6 +45,7 @@ #include <errl/errlentry.H> #include <initservice/isteps_trace.H> +#include <hwpisteperror.H> // targeting support #include <targeting/common/commontargeting.H> @@ -63,6 +64,8 @@ namespace ACTIVATE_POWERBUS { +using namespace ISTEP_ERROR; +using namespace ISTEP; using namespace TARGETING; using namespace EDI_EI_INITIALIZATION; using namespace fapi; @@ -75,9 +78,11 @@ using namespace fapi; // void* call_proc_build_smp( void *io_pArgs ) { + errlHndl_t l_errl = NULL; + IStepError l_StepError; - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_build_smp entry" ); // Get all functional proc chip targets @@ -178,26 +183,45 @@ void* call_proc_build_smp( void *io_pArgs ) l_procChips.push_back( l_procEntry ); } - // call the HWP with each fapi::Target - FAPI_INVOKE_HWP( l_errl, proc_build_smp, - l_procChips, SMP_ACTIVATE_PHASE1 ); + if(!l_errl) + { + // call the HWP with each fapi::Target + FAPI_INVOKE_HWP( l_errl, proc_build_smp, + l_procChips, SMP_ACTIVATE_PHASE1 ); + } - if ( l_errl ) + if(l_errl) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR : proc_build_smp" ); + /*@ + * @errortype + * @reasoncode ISTEP_ACTIVATE_POWER_BUS_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_BUILD_SMP + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_build_smp has failed + */ + l_StepError.addErrorDetails(ISTEP_ACTIVATE_POWER_BUS_FAILED, + ISTEP_PROC_BUILD_SMP, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); } else { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : proc_build_smp" ); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "SUCCESS : proc_build_smp" ); } - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "call_proc_build_smp exit" ); + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "call_proc_build_smp exit" ); - // end task, returning any errorlogs to IStepDisp - return l_errl; + // end task, returning any errorlogs to IStepDisp + return l_StepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C index dd4afe3b5..56f245beb 100644 --- a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C +++ b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C @@ -43,6 +43,9 @@ #include <initservice/taskargs.H> #include <errl/errlentry.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + #include <initservice/isteps_trace.H> #include <initservice/initsvcreasoncodes.H> @@ -68,6 +71,9 @@ namespace BUILD_WINKLE_IMAGES { +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; using namespace TARGETING; using namespace fapi; using namespace DeviceFW; @@ -305,6 +311,8 @@ void* call_host_build_winkle( void *io_pArgs ) void *l_pImageOut = NULL; uint32_t l_sizeImageOut = MAX_OUTPUT_PORE_IMG_SIZE; + ISTEP_ERROR::IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_build_winkle entry" ); @@ -335,6 +343,12 @@ void* call_host_build_winkle( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "host_build_winkle ERROR : Returning errorlog, PLID=0x%x", l_errl->plid() ); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_errl); + // drop out of loop and return errlog to fail. break; } @@ -376,6 +390,12 @@ void* call_host_build_winkle( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "host_build_winkle ERROR : Returning errorlog, PLID=0x%x", l_errl->plid() ); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_errl); + // drop out if we hit an error and quit. break; } @@ -399,6 +419,12 @@ void* call_host_build_winkle( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "applyPoreGenCpuRegs ERROR : Returning errorlog, PLID=0x%x", l_errl->plid() ); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_errl); + // drop out if we hit an error and quit. break; } @@ -407,12 +433,32 @@ void* call_host_build_winkle( void *io_pArgs ) // @@@@@ END CUSTOM BLOCK: @@@@@ + if(l_errl) + { + /*@ + * @errortype + * @reasoncode ISTEP_BUILD_WINKLE_IMAGES_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_HOST_BUILD_WINKLE + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to host_build_winkle has failed + * + */ + l_StepError.addErrorDetails(ISTEP_BUILD_WINKLE_IMAGES_FAILED, + ISTEP_HOST_BUILD_WINKLE, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); + } TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_build_winkle exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_StepError.getErrorHandle(); } @@ -425,6 +471,8 @@ void* call_proc_set_pore_bar( void *io_pArgs ) { errlHndl_t l_errl = NULL; + ISTEP_ERROR::IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_set_pore_bar entry" ); @@ -496,6 +544,21 @@ void* call_proc_set_pore_bar( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR : p8_set_pore_bar, PLID=0x%x", l_errl->plid() ); + /*@ + * @errortype + * @reasoncode ISTEP_BUILD_WINKLE_IMAGES_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_SET_PORE_BAR + * @devdesc call to proc_set_porebar has failed, see + * error log identified by the plid in user + * data section. + */ + l_stepError.addErrorDetails(ISTEP_BUILD_WINKLE_IMAGES_FAILED, + ISTEP_PROC_SET_PORE_BAR, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } else { @@ -512,7 +575,7 @@ void* call_proc_set_pore_bar( void *io_pArgs ) "call_proc_set_pore_bar exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/core_activate/core_activate.C b/src/usr/hwpf/hwp/core_activate/core_activate.C index 6bd571751..7072b086f 100644 --- a/src/usr/hwpf/hwp/core_activate/core_activate.C +++ b/src/usr/hwpf/hwp/core_activate/core_activate.C @@ -47,6 +47,8 @@ #include <initservice/isteps_trace.H> #include <initservice/istepdispatcherif.H> +#include <hwpisteperror.H> + // targeting support #include <targeting/common/commontargeting.H> #include <targeting/common/utilFilter.H> @@ -74,6 +76,7 @@ namespace CORE_ACTIVATE using namespace TARGETING; using namespace fapi; using namespace ISTEP; +using namespace ISTEP_ERROR; @@ -83,11 +86,13 @@ using namespace ISTEP; // void* call_host_activate_master( void *io_pArgs ) { - errlHndl_t l_errl = NULL; TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_activate_master entry" ); + errlHndl_t l_errl = NULL; + IStepError l_stepError; + // @@@@@ CUSTOM BLOCK: @@@@@ do { @@ -153,7 +158,7 @@ using namespace ISTEP; * @errortype * @reasoncode ISTEP_FAIL_MASTER_WINKLE_RC * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE - * @moduleid ISTEP_CORE_ACTIVATE + * @moduleid ISTEP_HOST_ACTIVATE_MASTER * @userdata1 return code from cpu_master_winkle * * @devdesc p8_pore_gen_cpureg returned an error when @@ -161,7 +166,7 @@ using namespace ISTEP; */ l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - ISTEP_CORE_ACTIVATE, + ISTEP_HOST_ACTIVATE_MASTER, ISTEP_FAIL_MASTER_WINKLE_RC, l_rc ); break; @@ -196,13 +201,33 @@ using namespace ISTEP; } while ( 0 ); // @@@@@ END CUSTOM BLOCK: @@@@@ - + if( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_CORE_ACTIVATE_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_HOST_ACTIVATE_MASTER + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to host_activate_master failed see + * error identified by the plid in user data + * field. + */ + l_stepError.addErrorDetails(ISTEP_CORE_ACTIVATE_FAILED, + ISTEP_HOST_ACTIVATE_MASTER, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_activate_master exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } @@ -216,6 +241,8 @@ void* call_host_activate_slave_cores( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_activate_slave_cores entry" ); @@ -285,11 +312,34 @@ void* call_host_activate_slave_cores( void *io_pArgs ) #endif // @@@@@ END CUSTOM BLOCK: @@@@@ + if( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_CORE_ACTIVATE_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_HOST_ACTIVATE_SLAVE_CORES + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * + * @devdesc call to host_activate_master failed see + * error identified by the plid in user data + * field. + */ + l_stepError.addErrorDetails(ISTEP_CORE_ACTIVATE_FAILED, + ISTEP_HOST_ACTIVATE_SLAVE_CORES, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_activate_slave_cores exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } @@ -302,6 +352,8 @@ void* call_host_ipl_complete( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_ipl_complete entry" ); do @@ -367,12 +419,34 @@ void* call_host_ipl_complete( void *io_pArgs ) } while( 0 ); + if( l_err ) + { + /*@ + * @errortype + * @reasoncode ISTEP_CORE_ACTIVATE_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_HOST_IPL_COMPLETE + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to host_ipl_complete failed see + * error identified by the plid in user data + * field. + */ + l_stepError.addErrorDetails(ISTEP_CORE_ACTIVATE_FAILED, + ISTEP_HOST_IPL_COMPLETE, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + } + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "call_host_ipl_complete exit elog ptr = %p", l_err ); + "call_host_ipl_complete exit "); // end task, returning any errorlogs to IStepDisp - return l_err; + return l_stepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/dmi_training/dmi_training.C b/src/usr/hwpf/hwp/dmi_training/dmi_training.C index 40c3dc18c..eda3786b6 100644 --- a/src/usr/hwpf/hwp/dmi_training/dmi_training.C +++ b/src/usr/hwpf/hwp/dmi_training/dmi_training.C @@ -50,6 +50,9 @@ #include <initservice/isteps_trace.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + // targeting support. #include <targeting/common/commontargeting.H> #include <targeting/common/utilFilter.H> @@ -67,7 +70,9 @@ namespace DMI_TRAINING { - +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; using namespace TARGETING; using namespace fapi; @@ -78,13 +83,15 @@ void* call_dmi_scominit( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_scominit entry" ); uint8_t l_num = 0; - + // Get all functional MCS chiplets TARGETING::TargetHandleList l_mcsTargetList; getAllChiplets(l_mcsTargetList, TYPE_MCS); - + // Invoke dmi_scominit on each one for (l_num = 0; l_num < l_mcsTargetList.size(); l_num++) { @@ -94,7 +101,8 @@ void* call_dmi_scominit( void *io_pArgs ) reinterpret_cast<void *> (const_cast<TARGETING::Target*>(l_pTarget))); - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "Running dmi_scominit HWP on..."); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "Running dmi_scominit HWP on..."); EntityPath l_path; l_path = l_pTarget->getAttr<ATTR_PHYS_PATH>(); l_path.dump(); @@ -102,8 +110,15 @@ void* call_dmi_scominit( void *io_pArgs ) FAPI_INVOKE_HWP(l_errl, dmi_scominit, l_fapi_target); if (l_errl) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : dmi_scominit HWP returns error", - l_errl->reasonCode()); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X : dmi_scominit HWP returns error", + l_errl->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_pTarget); + + // capture the target data in the elog + myDetails.addToLog( l_errl ); + break; } else @@ -112,7 +127,7 @@ void* call_dmi_scominit( void *io_pArgs ) } } - if (!l_errl) + if ( l_StepError.isNull() ) { // Get all functional membuf chips TARGETING::TargetHandleList l_membufTargetList; @@ -137,6 +152,12 @@ void* call_dmi_scominit( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : dmi_scominit HWP returns error", l_errl->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_pTarget); + + // capture the target data in the elog + myDetails.addToLog( l_errl ); + break; } else @@ -146,10 +167,33 @@ void* call_dmi_scominit( void *io_pArgs ) } } + if( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_DMI_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_DMI_SCOMINIT + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to dmi_scominit has failed, target data + * is included in the error logs listed in the + * user data section of this error log. + * + */ + l_StepError.addErrorDetails(ISTEP_DMI_TRAINING_FAILED, + ISTEP_DMI_SCOMINIT, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_scominit exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_StepError.getErrorHandle(); } @@ -206,6 +250,8 @@ void* call_dmi_io_run_training( void *io_pArgs ) { errlHndl_t l_err = NULL; + ISTEP_ERROR::IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_io_run_training entry" ); TARGETING::TargetHandleList l_cpuTargetList; @@ -276,6 +322,29 @@ void* call_dmi_io_run_training( void *io_pArgs ) l_cpuNum, l_mcsNum, k ); + + ErrlUserDetailsTarget myDetails( l_mem_target ); + + // capture the target data in the elog + myDetails.addToLog( l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_DMI_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_DMI_IO_RUN_TRAINING + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to dmi_io_run_training has failed + */ + l_StepError.addErrorDetails(ISTEP_DMI_TRAINING_FAILED, + ISTEP_DMI_IO_RUN_TRAINING, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // Break out mem target loop } else @@ -290,24 +359,24 @@ void* call_dmi_io_run_training( void *io_pArgs ) } //end for l_mem_target - if (l_err) + // if there is an error bail out + if ( !l_StepError.isNull() ) { break; // Break out l_mcs_target } } // end for l_mcs_target - if (l_err) + if ( !l_StepError.isNull() ) { break; // Break out l_cpu_target } } // end for l_cpu_target - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_dmi_io_run_training exit" ); - return l_err; + return l_StepError.getErrorHandle(); } // @@ -334,6 +403,8 @@ void* call_proc_cen_framelock( void *io_pArgs ) errlHndl_t l_err = NULL; proc_cen_framelock_args l_args; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_cen_framework entry" ); // get the mcs chiplets @@ -389,6 +460,25 @@ void* call_proc_cen_framelock( void *io_pArgs ) TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : proc_cen_framelock HWP( mem %d )", l_err->reasonCode(), l_memNum ); + + /*@ + * @errortype + * @reasoncode ISTEP_DMI_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_CEN_FRAMELOCK + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_cen_framelock has failed + * + */ + l_StepError.addErrorDetails(ISTEP_DMI_TRAINING_FAILED, + ISTEP_PROC_CEN_FRAMELOCK, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out of mem num loop } else @@ -400,7 +490,8 @@ void* call_proc_cen_framelock( void *io_pArgs ) } // end mem - if (l_err) + // if there is already an error, bail out. + if ( !l_StepError.isNull() ) { break; // break out of mcs loop } @@ -409,7 +500,7 @@ void* call_proc_cen_framelock( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_cen_framework exit" ); - return l_err; + return l_StepError.getErrorHandle(); } // diff --git a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C index 7f0cc87c0..9c2d0667a 100644 --- a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C +++ b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C @@ -46,6 +46,7 @@ #include <diag/mdia/mdia.H> #include <diag/attn/attn.H> #include <initservice/isteps_trace.H> +#include <hwpisteperror.H> // targeting support #include <targeting/common/commontargeting.H> @@ -80,6 +81,8 @@ namespace DRAM_INITIALIZATION { +using namespace ISTEP; +using namespace ISTEP_ERROR; using namespace TARGETING; using namespace EDI_EI_INITIALIZATION; using namespace fapi; @@ -145,6 +148,8 @@ void* call_mss_extent_setup( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_extent_setup entry" ); @@ -155,6 +160,24 @@ void* call_mss_extent_setup( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR : failed executing mss_extent_setup returning error" ); + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_EXTENT_SETUP + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_extent_setup has failed, see error log + * identified by the plid in user data + */ + l_stepError.addErrorDetails(ISTEP_DRAM_INITIALIZATION_FAILED, + ISTEP_MSS_EXTENT_SETUP, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } else { @@ -166,7 +189,7 @@ void* call_mss_extent_setup( void *io_pArgs ) "call_mss_extent_setup exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } // @@ -179,6 +202,8 @@ void* call_mss_memdiag( void *io_pArgs ) errlHndl_t l_errl = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_memdiag entry" ); @@ -211,11 +236,32 @@ void* call_mss_memdiag( void *io_pArgs ) } while (0); + if( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_MEMDIAG + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_memdiag has failed, see error log + * identified by the plid in user data + */ + l_stepError.addErrorDetails(ISTEP_DRAM_INITIALIZATION_FAILED, + ISTEP_MSS_MEMDIAG, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_memdiag exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } @@ -334,6 +380,7 @@ void* call_proc_setup_bars( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_stepError; TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_setup_bars entry" ); @@ -374,6 +421,24 @@ void* call_proc_setup_bars( void *io_pArgs ) if ( l_errl ) { + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_SETUP_BARS + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_setup_bars failed, see error log + * identified by the plid in user data 1. + */ + l_stepError.addErrorDetails(ISTEP_DRAM_INITIALIZATION_FAILED, + ISTEP_MSS_SETUP_BARS, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR : mss_setup_bars" ); // break and return with error @@ -394,7 +459,7 @@ void* call_proc_setup_bars( void *io_pArgs ) if ( !TARGETING::is_vpo() ) { //Now need to scom the L3 bar on my EX to trigger Simics cache contained exit - if (!l_errl) + if (l_stepError.isNull()) { TARGETING::Target* procTarget = NULL; TARGETING::targetService().masterProcChipTargetHandle( procTarget ); @@ -421,7 +486,7 @@ void* call_proc_setup_bars( void *io_pArgs ) // @@@@@ end TEMPORARY SIMICS HACK for PHYP 6/1 milestone @@@@@ } - if ( ! l_errl ) + if ( l_stepError.isNull() ) { // ----------------------------------------------------------------------- // run proc_setup_bars on all CPUs @@ -495,18 +560,41 @@ void* call_proc_setup_bars( void *io_pArgs ) else { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : proc_setup-bars" ); + "SUCCESS : proc_setup_bars" ); } } } // end if !l_errl // @@@@@ END CUSTOM BLOCK: @@@@@ + if ( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_SETUP_BARS + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_setup_bars has failed, see error log + * identified by the plid in user data section. + */ + + l_stepError.addErrorDetails(ISTEP_DRAM_INITIALIZATION_FAILED, + ISTEP_PROC_SETUP_BARS, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); + + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_setup_bars exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } @@ -572,6 +660,8 @@ void* call_proc_exit_cache_contained( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_exit_cache_contained entry" ); @@ -624,13 +714,36 @@ void* call_proc_exit_cache_contained( void *io_pArgs ) rc ); } + if ( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_EXIT_CACHE_CONTAINED + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_exit_cache_contained has failed + * see error log in the user details section for + * additional details. + */ + l_stepError.addErrorDetails(ISTEP_DRAM_INITIALIZATION_FAILED, + ISTEP_PROC_EXIT_CACHE_CONTAINED, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); + + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_exit_cache_contained exit" ); // @@@@@ END CUSTOM BLOCK: @@@@@ // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/dram_training/dram_training.C b/src/usr/hwpf/hwp/dram_training/dram_training.C index f0efc125e..6a31ad17f 100644 --- a/src/usr/hwpf/hwp/dram_training/dram_training.C +++ b/src/usr/hwpf/hwp/dram_training/dram_training.C @@ -51,6 +51,9 @@ #include <targeting/common/util.H> #include <targeting/common/utilFilter.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + // fapi support #include <fapi.H> #include <fapiPlatHwpInvoker.H> @@ -84,6 +87,9 @@ const uint8_t VPO_NUM_OF_MEMBUF_TO_RUN = UNLIMITED_RUN; namespace DRAM_TRAINING { +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; using namespace TARGETING; using namespace fapi; @@ -154,6 +160,9 @@ void* call_host_disable_vddr( void *io_pArgs ) void* call_mem_pll_setup( void *io_pArgs ) { errlHndl_t l_err = NULL; + + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mem_pll_setup entry" ); //TODO - Enable this procedure in SIMICs when RTC 46643 is done. @@ -164,7 +173,7 @@ void* call_mem_pll_setup( void *io_pArgs ) "WARNING: mem_pll_setup HWP is disabled in SIMICS run!"); // end task return l_err; - + } @@ -196,6 +205,12 @@ void* call_mem_pll_setup( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mem_pll_initf HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_pCentaur); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + break; } else @@ -212,6 +227,12 @@ void* call_mem_pll_setup( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mem_pll_setup HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_pCentaur); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + break; } else @@ -221,6 +242,26 @@ void* call_mem_pll_setup( void *io_pArgs ) } } + if( l_err ) + { + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MEM_PLL_SETUP + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to cen_mem_pll_setup has failed + */ + l_StepError.addErrorDetails(ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MEM_PLL_SETUP, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mem_pll_setup exit" ); return l_err; @@ -235,6 +276,8 @@ void* call_mem_startclocks( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mem_startclocks entry" ); // Get all Centaur targets @@ -267,6 +310,30 @@ void* call_mem_startclocks( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: cen_mem_startclocks HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_pCentaur); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MEM_STARTCLOCKS + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to cen_mem_startclocks has failed + */ + l_StepError.addErrorDetails(ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MEM_STARTCLOCKS, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + + break; } else @@ -278,7 +345,7 @@ void* call_mem_startclocks( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mem_startclocks exit" ); - return l_err; + return l_StepError.getErrorHandle(); } @@ -351,6 +418,8 @@ void* call_mss_scominit( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_scominit entry" ); // Get all Centaur targets @@ -365,7 +434,7 @@ void* call_mss_scominit( void *io_pArgs ) // Dump current run on target TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "Running mss_scominit HWP on..." ); - + EntityPath l_path; l_path = l_pCentaur->getAttr<ATTR_PHYS_PATH>(); l_path.dump(); @@ -384,6 +453,25 @@ void* call_mss_scominit( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mss_scominit HWP returns error", l_err->reasonCode()); + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_SCOMINIT + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_scominit has failed + * see error log in the user details section for + * additional details. + */ + l_stepError.addErrorDetails(ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MSS_SCOMINIT, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; } else @@ -395,7 +483,7 @@ void* call_mss_scominit( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_scominit exit" ); - return l_err; + return l_stepError.getErrorHandle(); } // @@ -405,6 +493,8 @@ void* call_mss_ddr_phy_reset( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_ddr_phy_reset entry" ); // Get all MBA targets @@ -444,6 +534,29 @@ void* call_mss_ddr_phy_reset( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mss_ddr_phy_reset HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_mba_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_DDR_PHY_RESET + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_ddr_phy_reset has failed + */ + l_stepError.addErrorDetails(ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MSS_DDR_PHY_RESET, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out of mba loop } else @@ -454,7 +567,7 @@ void* call_mss_ddr_phy_reset( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_ddr_phy_reset exit" ); - return l_err; + return l_stepError.getErrorHandle(); } @@ -465,6 +578,8 @@ void* call_mss_draminit( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit entry" ); // Get all MBA targets @@ -504,6 +619,30 @@ void* call_mss_draminit( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : mss_draminit HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_mba_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_DRAMINIT + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_dram_init has failed + */ + l_stepError.addErrorDetails( ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MSS_DRAMINIT, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // Break out of mba loop } else @@ -515,7 +654,7 @@ void* call_mss_draminit( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit exit" ); - return l_err; + return l_stepError.getErrorHandle(); } @@ -526,6 +665,8 @@ void* call_mss_draminit_training( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_training entry" ); // Get all MBA targets @@ -566,6 +707,30 @@ void* call_mss_draminit_training( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : mss_draminit_training HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_mba_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_DRAMINIT_TRAINING + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_dram_init_training has failed + */ + l_stepError.addErrorDetails( ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MSS_DRAMINIT_TRAINING, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out of mba loop } else @@ -577,7 +742,7 @@ void* call_mss_draminit_training( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_training exit" ); - return l_err; + return l_stepError.getErrorHandle(); } // @@ -646,6 +811,8 @@ void* call_mss_draminit_mc( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_mc entry" ); // Get all centaur targets @@ -685,6 +852,31 @@ void* call_mss_draminit_mc( void *io_pArgs ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : mss_draminit_mc HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_membuf_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * + * @errortype + * @reasoncode ISTEP_DRAM_TRAINING_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_DRAMINIT_MC + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_dram_init_mc has failed + * + */ + l_stepError.addErrorDetails(ISTEP_DRAM_TRAINING_FAILED, + ISTEP_MSS_DRAMINIT_MC, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out of memBuf loop } else @@ -696,7 +888,7 @@ void* call_mss_draminit_mc( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_draminit_mc exit" ); - return l_err; + return l_stepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C b/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C index f46a09a47..dd7115907 100644 --- a/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C +++ b/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C @@ -47,6 +47,8 @@ #include <initservice/taskargs.H> #include <errl/errlentry.H> +#include <hwpisteperror.H> + #include <initservice/isteps_trace.H> // targeting support @@ -75,6 +77,8 @@ namespace EDI_EI_INITIALIZATION { +using namespace ISTEP; +using namespace ISTEP_ERROR; using namespace TARGETING; using namespace fapi; @@ -246,6 +250,8 @@ void* call_fabric_io_run_training( void *io_pArgs ) { errlHndl_t l_errl = NULL; + IStepError l_StepError; + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_io_run_training entry" ); @@ -285,6 +291,28 @@ void* call_fabric_io_run_training( void *io_pArgs ) "%s : %cbus connection io_run_training", (l_errl ? "ERROR" : "SUCCESS"), (i ? 'X' : 'A') ); + + if ( l_errl ) + { + /*@ + * @errortype + * @reasoncode ISTEP_EDI_EI_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_FABRIC_IO_RUN_TRAINING + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to fabric_io_run_training has failed + * see error log in the user details seciton for + * additional details. + */ + l_StepError.addErrorDetails(ISTEP_EDI_EI_INITIALIZATION_FAILED, + ISTEP_FABRIC_IO_RUN_TRAINING, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } } } @@ -292,7 +320,7 @@ void* call_fabric_io_run_training( void *io_pArgs ) "call_fabric_io_run_training exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_StepError.getErrorHandle(); } @@ -465,6 +493,8 @@ void* call_proc_fab_iovalid( void *io_pArgs ) ReturnCode l_rc; errlHndl_t l_errl = NULL; + IStepError l_StepError; + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_fab_iovalid entry" ); @@ -548,25 +578,43 @@ void* call_proc_fab_iovalid( void *io_pArgs ) l_smp.push_back(l_procEntry); } - if (l_errl) - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR : call_proc_fab_iovalid encountered an error"); - } - else + if (!l_errl) { FAPI_INVOKE_HWP( l_errl, proc_fab_iovalid, l_smp, true ); TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "%s : proc_fab_iovalid HWP.", - (l_errl ? "ERROR" : "SUCCESS")); + "%s : proc_fab_iovalid HWP.", + (l_errl ? "ERROR" : "SUCCESS")); + } + + if (l_errl) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR : call_proc_fab_iovalid encountered an error"); + /*@ + * @errortype + * @reasoncode ISTEP_EDI_EI_INITIALIZATION_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_FAB_IOVALID + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_fab_iovalid has failed + */ + l_StepError.addErrorDetails(ISTEP_EDI_EI_INITIALIZATION_FAILED, + ISTEP_PROC_FAB_IOVALID, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_fab_iovalid exit" ); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_StepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C index b6c2b8b76..6c6816f4f 100644 --- a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C +++ b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C @@ -46,6 +46,8 @@ #include <initservice/isteps_trace.H> +#include <hwpisteperror.H> + // targeting support #include <targeting/common/commontargeting.H> @@ -61,6 +63,8 @@ namespace ESTABLISH_SYSTEM_SMP { +using namespace ISTEP; +using namespace ISTEP_ERROR; using namespace TARGETING; using namespace fapi; @@ -74,7 +78,7 @@ void* call_host_coalesce_host( void *io_pArgs ) { errlHndl_t l_errl = NULL; - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_coalesce_host entry" ); #if 0 @@ -98,19 +102,19 @@ void* call_host_coalesce_host( void *io_pArgs ) FAPI_INVOKE_HWP( l_errl, host_coalesce_host, _args_...); if ( l_errl ) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR : .........." ); errlCommit( l_errl, HWPF_COMP_ID ); } else { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "SUCCESS : .........." ); } // @@@@@ END CUSTOM BLOCK: @@@@@ #endif - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_coalesce_host exit" ); // end task, returning any errorlogs to IStepDisp diff --git a/src/usr/hwpf/hwp/hwpisteperror.C b/src/usr/hwpf/hwp/hwpisteperror.C new file mode 100644 index 000000000..e825bdb19 --- /dev/null +++ b/src/usr/hwpf/hwp/hwpisteperror.C @@ -0,0 +1,71 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/hwp/hwpisteperror.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 */ +#include <hwpisteperror.H> +#include <hwpistepud.H> + +using namespace ISTEP; +using namespace ISTEP_ERROR; + +// setup the internal elog pointer and capture error data for the first or +// add error data to top level elog +void IStepError::addErrorDetails(istepReasonCode reasoncode, + istepModuleId modid, + const errlHndl_t i_err ) +{ + mutex_lock( &iv_mutex ); + + // if internal elog is null, create a new one ad grab some data from the + // first error that is passed in. + if( iv_eHandle == NULL ) + { + // add the PLID and reason code of the first error to user data word 0 + uint64_t data0 = i_err->plid(); + data0 <<= 32; + data0 |= i_err->reasonCode(); + + iv_eHandle = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + modid, reasoncode, data0, 0); + } + + // set the plid of the inpout elog to match the summary elog + i_err->plid( iv_eHandle->plid() ); + + // grab the isteps trace and add to the original elog + i_err->collectTrace("ISTEPS_TRACE", 1024); + + // add some details from the elog to the IStep error object + ISTEP_ERROR::HwpUserDetailsIstep errorDetails( i_err ); + + errorDetails.addToLog( iv_eHandle ); + + iv_errorCount++; + + // put iv_errorCount into bytes 0 and 1 of user data 2 + uint64_t data = ((uint64_t)iv_errorCount << 32); + + iv_eHandle->addUserData2(data); + + mutex_unlock( &iv_mutex ); +} + + diff --git a/src/usr/hwpf/hwp/hwpistepud.C b/src/usr/hwpf/hwp/hwpistepud.C new file mode 100644 index 000000000..bc1ad76f1 --- /dev/null +++ b/src/usr/hwpf/hwp/hwpistepud.C @@ -0,0 +1,57 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/hwp/hwpistepud.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 hwpudistep.C + * + * @brief Implementation of HwpSvcUserDetailsIstep + */ +#include <hbotcompid.H> +#include <hwpistepud.H> +#include <hwpf/istepreasoncodes.H> + +using namespace ISTEP_ERROR; + +//------------------------------------------------------------------------------ +HwpUserDetailsIstep::HwpUserDetailsIstep( errlHndl_t i_err ) +{ + HwpUserDetailsIstepErrorData * l_pBuf = + reinterpret_cast<HwpUserDetailsIstepErrorData *>( + reallocUsrBuf(sizeof(HwpUserDetailsIstepErrorData))); + + l_pBuf->eid = i_err->eid(); + + l_pBuf->reasoncode = i_err->reasonCode(); + + // Set up ErrlUserDetails instance variables + iv_CompId = HWPF_COMP_ID; + iv_Version = 1; + iv_SubSection = HWP_UDT_STEP_ERROR_DETAILS; +} + +//------------------------------------------------------------------------------ +HwpUserDetailsIstep::~HwpUserDetailsIstep() +{ + +} + + diff --git a/src/usr/hwpf/hwp/makefile b/src/usr/hwpf/hwp/makefile index 5a266d954..abe936b44 100644 --- a/src/usr/hwpf/hwp/makefile +++ b/src/usr/hwpf/hwp/makefile @@ -1,25 +1,25 @@ -# IBM_PROLOG_BEGIN_TAG -# This is an automatically generated prolog. -# -# $Source: src/usr/hwpf/hwp/makefile $ -# -# IBM CONFIDENTIAL -# -# COPYRIGHT International Business Machines Corp. 2011,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 +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/usr/hwpf/hwp/makefile $ +# +# IBM CONFIDENTIAL +# +# COPYRIGHT International Business Machines Corp. 2011,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 ROOTPATH = ../../../.. MODULE = hwp @@ -42,7 +42,9 @@ OBJS = fapiTestHwp.o \ dimmBadDqBitmapFuncs.o \ dimmBadDqBitmapAccessHwp.o \ RepairRingFunc.o \ - erepairGetFailedLanesHwp.o + erepairGetFailedLanesHwp.o \ + hwpisteperror.o \ + hwpistepud.o \ SUBDIRS = dmi_training.d sbe_centaur_init.d mc_config.d \ dram_training.d activate_powerbus.d build_winkle_images.d \ diff --git a/src/usr/hwpf/hwp/mc_config/mc_config.C b/src/usr/hwpf/hwp/mc_config/mc_config.C index d1cb61c14..05e6e0835 100644 --- a/src/usr/hwpf/hwp/mc_config/mc_config.C +++ b/src/usr/hwpf/hwp/mc_config/mc_config.C @@ -44,6 +44,9 @@ #include <initservice/taskargs.H> #include <errl/errlentry.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + #include <initservice/isteps_trace.H> // targeting support @@ -72,6 +75,9 @@ namespace MC_CONFIG { +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; using namespace TARGETING; using namespace fapi; @@ -144,6 +150,8 @@ void* call_mss_volt( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_volt entry" ); TARGETING::TargetHandleList l_membufTargetList; @@ -184,6 +192,24 @@ void* call_mss_volt( void *io_pArgs ) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mss_volt HWP( ) ", l_err->reasonCode()); + /*@ + * @errortype + * @reasoncode ISTEP_MC_CONFIG_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_VOLT + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_volt has failed + * + */ + l_StepError.addErrorDetails(ISTEP_MC_CONFIG_FAILED, + ISTEP_MSS_VOLT, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + } else { @@ -193,7 +219,7 @@ void* call_mss_volt( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_volt exit" ); - return l_err; + return l_StepError.getErrorHandle(); } // @@ -203,6 +229,8 @@ void* call_mss_freq( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_freq entry" ); TARGETING::TargetHandleList l_membufTargetList; @@ -235,6 +263,30 @@ void* call_mss_freq( void *io_pArgs ) "ERROR 0x%.8X: mss_freq HWP( %d ) ", l_err->reasonCode(), i ); + + ErrlUserDetailsTarget myDetails(l_membuf_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_MC_CONFIG_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_FREQ + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_freq has failed + * + */ + l_StepError.addErrorDetails(ISTEP_MC_CONFIG_FAILED, + ISTEP_MSS_FREQ, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out memBuf loop } else @@ -246,7 +298,7 @@ void* call_mss_freq( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_freq exit" ); - return l_err; + return l_StepError.getErrorHandle(); } errlHndl_t call_mss_eff_grouping() @@ -255,7 +307,7 @@ errlHndl_t call_mss_eff_grouping() TARGETING::TargetHandleList l_procsList; getAllChips(l_procsList, TYPE_PROC); - + for ( size_t i = 0; i < l_procsList.size(); i++ ) { // make a local copy of the target for ease of use @@ -294,7 +346,7 @@ errlHndl_t call_mss_eff_grouping() l_associated_centaurs.push_back(l_fapi_centaur_target); } - + FAPI_INVOKE_HWP(l_err, mss_eff_grouping, l_fapi_cpu_target, l_associated_centaurs); @@ -302,8 +354,14 @@ errlHndl_t call_mss_eff_grouping() if ( l_err ) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X: mss_eff_grouping HWP( cpu %d centaur %d ) ", - l_err->reasonCode(), i, j ); + "ERROR 0x%.8X: mss_eff_grouping HWP( cpu %d centaur %d ) ", + l_err->reasonCode(), i, j ); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + break; // break out mba loop } else @@ -323,6 +381,8 @@ void* call_mss_eff_config( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_eff_config entry" ); TARGETING::TargetHandleList l_mbaTargetList; @@ -357,6 +417,12 @@ void* call_mss_eff_config( void *io_pArgs ) TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: mss_eff_config HWP( mba %d ) ", l_err->reasonCode(), i ); + + ErrlUserDetailsTarget myDetails(l_mba_target); + + // capture the target data in the elog + myDetails.addToLog( l_err ); + break; // break out mba loop } else @@ -372,16 +438,38 @@ void* call_mss_eff_config( void *io_pArgs ) } // When opt_memmap HWP is available, it will be called - // here between the two call_mss_eff_grouping() + // here between the two call_mss_eff_grouping() + // - if (!l_err) + if(!l_err) { l_err = call_mss_eff_grouping(); } + if(l_err) + { + /*@ + * @errortype + * @reasoncode ISTEP_MC_CONFIG_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_MSS_EFF_CONFIG + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to mss_eff_grouping has failed + * + */ + l_StepError.addErrorDetails(ISTEP_MC_CONFIG_FAILED, + ISTEP_MSS_EFF_CONFIG, + l_err ); + + errlCommit( l_err, HWPF_COMP_ID ); + } + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_eff_config exit" ); - return l_err; + return l_StepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C index 24f877902..beb512982 100644 --- a/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C +++ b/src/usr/hwpf/hwp/nest_chiplets/nest_chiplets.C @@ -22,7 +22,7 @@ * IBM_PROLOG_END_TAG */ /** - * @file nest_chiplets.C + @file nest_chiplets.C * * Support file for IStep: nest_chiplets * Nest Chiplets @@ -44,6 +44,9 @@ #include <initservice/taskargs.H> #include <errl/errlentry.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + #include <initservice/isteps_trace.H> // targeting support @@ -65,9 +68,12 @@ #include "proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.H" #include "proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.H" -namespace NEST_CHIPLETS +namespace NEST_CHIPLETS { +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; using namespace TARGETING; using namespace fapi; @@ -80,6 +86,9 @@ using namespace fapi; void* call_proc_a_x_pci_dmi_pll_setup( void *io_pArgs ) { errlHndl_t l_err = NULL; + + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_a_x_pci_dmi_pll_setup entry" ); //TODO - Enable this procedure in SIMICs when RTC 46643 is done. @@ -123,6 +132,29 @@ void* call_proc_a_x_pci_dmi_pll_setup( void *io_pArgs ) TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: proc_a_x_pci_dmi_pll_initf HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_NEST_CHIPLETS_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_A_X_PCI_DMI_PLL_INITF + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_a_x_pci_dmi_pll_initf has failed + */ + l_StepError.addErrorDetails(ISTEP_NEST_CHIPLETS_FAILED, + ISTEP_PROC_A_X_PCI_DMI_PLL_INITF, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + break; } else @@ -142,8 +174,32 @@ void* call_proc_a_x_pci_dmi_pll_setup( void *io_pArgs ) if (l_err) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X: proc_a_x_pci_dmi_pll_setup HWP returns error", + "ERROR 0x%.8X: proc_a_x_pci_dmi_pll_setup \ + HWP returns error", l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_NEST_CHIPLETS_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_A_X_PCI_DMI_PLL_SETUP + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_a_x_pci_dmi_pll_setup has failed + */ + l_StepError.addErrorDetails(ISTEP_NEST_CHIPLETS_FAILED, + ISTEP_PROC_A_X_PCI_DMI_PLL_SETUP, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + break; } else @@ -155,8 +211,8 @@ void* call_proc_a_x_pci_dmi_pll_setup( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_a_x_pci_dmi_pll_setup exit" ); - // end task, returning any errorlogs to IStepDisp - return l_err; + // end task, returning any errorlogs to IStepDisp + return l_StepError.getErrorHandle(); } @@ -169,8 +225,10 @@ void* call_proc_startclock_chiplets( void *io_pArgs ) { errlHndl_t l_err = NULL; + IStepError l_StepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_startclock_chiplets entry" ); - + uint8_t l_cpuNum = 0; TARGETING::TargetHandleList l_cpuTargetList; @@ -200,7 +258,30 @@ void* call_proc_startclock_chiplets( void *io_pArgs ) if (l_err) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : proc_startclock_chiplets HWP returns error", - l_err->reasonCode()); + l_err->reasonCode()); + + ErrlUserDetailsTarget myDetails(l_cpu_target); + + // capture the target data in the elog + myDetails.addToLog(l_err ); + + /*@ + * @errortype + * @reasoncode ISTEP_NEST_CHIPLETS_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_STARTCLOCK_CHIPLETS + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_start_clocks_chiplets has failed + */ + l_StepError.addErrorDetails(ISTEP_NEST_CHIPLETS_FAILED, + ISTEP_PROC_STARTCLOCK_CHIPLETS, + l_err); + + errlCommit( l_err, HWPF_COMP_ID ); + break; // break out of cpuNum } else @@ -212,7 +293,7 @@ void* call_proc_startclock_chiplets( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_startclock_chiplets exit" ); // end task, returning any errorlogs to IStepDisp - return l_err; + return l_StepError.getErrorHandle(); } @@ -240,16 +321,16 @@ void* call_proc_chiplet_scominit( void *io_pArgs ) // void* call_proc_pcie_scominit( void *io_pArgs ) { - errlHndl_t l_errl = NULL; + errlHndl_t l_errl = NULL; TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_pcie_scominit entry" ); - + #if 0 - // @@@@@ CUSTOM BLOCK: @@@@@ + // @@@@@ CUSTOM BLOCK: @@@@@ // figure out what targets we need // customize any other inputs // set up loops to go through all targets (if parallel, spin off a task) - + // print call to hwp and dump physical path of the target(s) TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "===== proc_pcie_scominit HWP(? ? ? )", @@ -260,14 +341,14 @@ void* call_proc_pcie_scominit( void *io_pArgs ) EntityPath l_path; l_path = l_@targetN_target->getAttr<ATTR_PHYS_PATH>(); l_path.dump(); - TRACFCOMP( g_trac_mc_init, "===== " ); + TRACFCOMP( g_trac_mc_init, "===== " ); - // cast OUR type of target to a FAPI type of target. + // cast OUR type of target to a FAPI type of target. const fapi::Target l_fapi_@targetN_target( TARGET_TYPE_MEMBUF_CHIP, reinterpret_cast<void *> (const_cast<TARGETING::Target*>(l_@targetN_target)) ); - + // call the HWP with each fapi::Target l_fapirc = proc_pcie_scominit( ? , ?, ? ); @@ -286,7 +367,7 @@ void* call_proc_pcie_scominit( void *io_pArgs ) "ERROR 0x%.8X: proc_pcie_scominit HWP(? ? ?) ", static_cast<uint32_t>(l_fapirc) ); } - // @@@@@ END CUSTOM BLOCK: @@@@@ + // @@@@@ END CUSTOM BLOCK: @@@@@ #endif TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_pcie_scominit exit" ); @@ -303,16 +384,36 @@ void* call_proc_pcie_scominit( void *io_pArgs ) // void* call_proc_scomoverride_chiplets( void *io_pArgs ) { - errlHndl_t l_errl = NULL; + errlHndl_t l_errl = NULL; - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_scomoverride_chiplets entry" ); + IStepError l_StepError; + + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "call_proc_scomoverride_chiplets entry" ); FAPI_INVOKE_HWP(l_errl, proc_scomoverride_chiplets); if (l_errl) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X : proc_scomoverride_chiplets HWP returns error", + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X : proc_scomoverride_chiplets HWP returns error", l_errl->reasonCode()); + /*@ + * @errortype + * @reasoncode ISTEP_NEST_CHIPLETS_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_SCOMOVERRIDE_CHIPLETS + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_scomoverride_chiplets has failed + */ + l_StepError.addErrorDetails(ISTEP_NEST_CHIPLETS_FAILED, + ISTEP_PROC_SCOMOVERRIDE_CHIPLETS, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); } else { @@ -322,8 +423,8 @@ void* call_proc_scomoverride_chiplets( void *io_pArgs ) TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_scomoverride_chiplets exit" ); - // end task, returning any errorlogs to IStepDisp - return l_errl; + // end task, returning any errorlogs to IStepDisp + return l_StepError.getErrorHandle(); } diff --git a/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C b/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C index 140bfddd6..3db1c23a7 100644 --- a/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C +++ b/src/usr/hwpf/hwp/sbe_centaur_init/sbe_centaur_init.C @@ -52,6 +52,7 @@ #include <fapiPlatHwpInvoker.H> #include <vfs/vfs.H> #include "sbe_centaur_init.H" +#include <hwpisteperror.H> // Extern function declaration extern fapi::ReturnCode fapiPoreVe(const fapi::Target i_target, @@ -63,6 +64,8 @@ const uint64_t CENTAUR_SBE_PNOR_MRR = 0; namespace SBE_CENTAUR_INIT { +using namespace ISTEP; +using namespace ISTEP_ERROR; using namespace TARGETING; using namespace fapi; using namespace vsbe; @@ -85,6 +88,8 @@ void* call_sbe_centaur_init( void *io_pArgs ) const char * l_sbePnorAddr = NULL; errlHndl_t l_errl = NULL; + IStepError l_StepError; + do { // ----------------------- Setup sbe_pnor stuff -------------------- @@ -179,7 +184,25 @@ void* call_sbe_centaur_init( void *io_pArgs ) "ERROR 0x%.8X call_sbe_centaur_init - Error returned from" " VSBE engine on this Centaur, l_rc 0x%llX", l_errl->reasonCode()); - break; // break out of memBuf loop + /*@ + * @errortype + * @reasoncode ISTEP_SBE_CENTAUR_INIT_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE +l * @moduleid ISTEP_SBE_CENTAUR_INIT + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_swl_build to build the sleep + * winkle image has failed + */ + l_StepError.addErrorDetails(ISTEP_SBE_CENTAUR_INIT_FAILED, + ISTEP_SBE_CENTAUR_INIT, + l_errl); + + errlCommit( l_errl, HWPF_COMP_ID ); + + break; // break out of memBuf loop } else { @@ -218,23 +241,10 @@ void* call_sbe_centaur_init( void *io_pArgs ) } } - // process return code. - if ( l_errl ) - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X: sbe_centaur_init HWP", - l_errl->reasonCode()); - } - else - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : sbe_centaur_init HWP" ); - } - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_sbe_centaur_init exit" ); - return l_errl; + return l_StepError.getErrorHandle(); } }; // end namespace diff --git a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C index 3ec5bd2b0..176b77111 100644 --- a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C +++ b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C @@ -44,6 +44,9 @@ #include <targeting/common/commontargeting.H> #include <targeting/common/utilFilter.H> +#include <hwpisteperror.H> +#include <errl/errludtarget.H> + // fapi support #include <fapi.H> #include <fapiPlatHwpInvoker.H> @@ -51,6 +54,10 @@ #include "slave_sbe.H" #include "proc_revert_sbe_mcs_setup/proc_revert_sbe_mcs_setup.H" +using namespace ISTEP; +using namespace ISTEP_ERROR; +using namespace ERRORLOG; + namespace SLAVE_SBE { // @@ -61,6 +68,8 @@ void* call_proc_revert_sbe_mcs_setup(void *io_pArgs) { errlHndl_t l_errl = NULL; + IStepError l_stepError; + TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_revert_sbe_mcs_setup entry" ); @@ -75,7 +84,32 @@ void* call_proc_revert_sbe_mcs_setup(void *io_pArgs) if (l_errl) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR : failed executing proc_revert_sbe_mcs_setup returning error"); + "ERROR : failed executing proc_revert_sbe_mcs_setup \ + returning error"); + + ErrlUserDetailsTarget myDetails(l_pProcTarget); + + // capture the target data in the elog + myDetails.addToLog( l_errl ); + + /*@ + * @errortype + * @reasoncode ISTEP_SLAVE_SBE_FAILED + * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE + * @moduleid ISTEP_PROC_REVERT_SBE_MCS_SETUP + * @userdata1 bytes 0-1: plid identifying first error + * bytes 2-3: reason code of first error + * @userdata2 bytes 0-1: total number of elogs included + * bytes 2-3: N/A + * @devdesc call to proc_revert_sbe_mcs_setup returned an error + * + */ + l_stepError.addErrorDetails(ISTEP_SLAVE_SBE_FAILED, + ISTEP_PROC_REVERT_SBE_MCS_SETUP, + l_errl ); + + errlCommit( l_errl, HWPF_COMP_ID ); + } else { @@ -87,7 +121,7 @@ void* call_proc_revert_sbe_mcs_setup(void *io_pArgs) "call_proc_revert_sbe_mcs_setup exit"); // end task, returning any errorlogs to IStepDisp - return l_errl; + return l_stepError.getErrorHandle(); } } diff --git a/src/usr/hwpf/plugins/hwpfParse.C b/src/usr/hwpf/plugins/hwpfParse.C index c68d77d6a..5fe7af402 100644 --- a/src/usr/hwpf/plugins/hwpfParse.C +++ b/src/usr/hwpf/plugins/hwpfParse.C @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/usr/hwpf/plugins/hwpfParse.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 other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/plugins/hwpfParse.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 hwpfParse.C * @@ -27,5 +27,8 @@ */ #include <errl/errludparser.H> #include <hwpf/plat/fapiPlatUdParserFactory.H> +#include <hwpf/hwp/hwpistepudparserfactory.H> + ERRL_MAKE_UD_PARSER(fapi::PlatUserDetailsParserFactory, HWPF_COMP_ID) +ERRL_MAKE_UD_PARSER(ISTEP_ERROR::HwpIstepUserDetailsParserFactory, HWPF_COMP_ID) diff --git a/src/usr/hwpf/test/hwpisteperrortest.H b/src/usr/hwpf/test/hwpisteperrortest.H new file mode 100644 index 000000000..ba75d18ea --- /dev/null +++ b/src/usr/hwpf/test/hwpisteperrortest.H @@ -0,0 +1,234 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/test/hwpisteperrortest.H $ */ +/* */ +/* 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 */ +#ifndef __HWPIstepErrorTest_H +#define __HWPIstepErrorTest_H + +#include <cxxtest/TestSuite.H> +#include <errl/errlentry.H> +#include <hwpisteperror.H> + +using namespace ISTEP; +using namespace ISTEP_ERROR; + +class HwpIStepErrorTest: public CxxTest::TestSuite +{ +public: + /** + * @brief Test IStepError class + */ + void testIstepError1(void) + { + + const uint16_t MY_REASON_CODE = 0xC0DE; + const uint8_t MY_MODULE_ID = 0xBB; + // Create an error log + errlHndl_t l_errl = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_INFORMATIONAL, + MY_MODULE_ID, + MY_REASON_CODE, + TWO_UINT32_TO_UINT64( 0xDE, 0xAD), + TO_UINT64(0xBEEF) ); + do { + + IStepError l_stepError; + + l_stepError.addErrorDetails( ISTEP_INVALID_REASONCODE, + ISTEP_INVALID_MODULE, l_errl ); + + TS_TRACE("testIStepError1: original elog eid is %d", + l_errl->eid() ); + + TS_TRACE("testIStepError1: original elog reasoncode is %d", + l_errl->reasonCode() ); + + // grab the values from the original errorlog for use later + uint64_t test_data0 = l_errl->eid(); + test_data0 <<= 32; + + test_data0 |= l_errl->reasonCode(); + + // this call to get resets the error handle + errlHndl_t new_errl = l_stepError.getErrorHandle(); + + uint64_t l_data0 = new_errl->getUserData1(); + + uint32_t eid = ( l_data0 & 0xFFFFFFF00000000) >> 32; + uint32_t reason = (uint32_t)(l_data0 & 0x00000000FFFFFFFF); + + if( eid != l_errl->eid() ) + { + TS_FAIL("expected eid == l_errl->eid() " + "eid rebuilt from user data of " + "IStepError did not match original error eid"); + } + else + { + TS_TRACE("passed: eid == l_errl->eid()"); + } + + if( reason != l_errl->reasonCode() ) + { + TS_FAIL("expected reasonCode == l_errl->reasonCode() \ + reasonCode rebuilt from user data of \ + IStepError did not match original reasoncode"); + + } + else + { + TS_TRACE("passed: reason == l_errl->reasonCode()"); + } + + + // verify that we counted the error we added + // count is in bytes 0-3 of userdata 2 + // + uint64_t l_data1 = new_errl->getUserData2(); + + l_data1 >>= 32; + + if( l_data1 != 1 ) + { + TS_FAIL("error count in IStepError not correct should be 1"); + } + else + { + TS_TRACE("passed: error count = 1"); + } + + + errlCommit( l_errl, CXXTEST_COMP_ID ); + errlCommit( new_errl, CXXTEST_COMP_ID ); + + }while(0); + } + void testIstepError2(void) + { + + const uint16_t MY_REASON_CODE = 0xC0DE; + const uint8_t MY_MODULE_ID = 0xBB; + // Create an error log + errlHndl_t l_errl = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_INFORMATIONAL, + MY_MODULE_ID, + MY_REASON_CODE, + TWO_UINT32_TO_UINT64( 0xDE, 0xAD), + TO_UINT64(0xBEEF) ); + do { + + IStepError l_stepError; + + l_stepError.addErrorDetails( ISTEP_INVALID_REASONCODE, + ISTEP_INVALID_MODULE, l_errl ); + + TS_TRACE("testIStepError2: original elog eid is %d", + l_errl->eid() ); + + TS_TRACE("testIStepError2: original elog reasoncode is %d", + l_errl->reasonCode() ); + + // grab the values from the original errorlog for use later + uint64_t test_data0 = l_errl->eid(); + test_data0 <<= 32; + + test_data0 |= l_errl->reasonCode(); + + // add a new elog in three more times.. + // Create an error log -- junk data + errlHndl_t l_errl2 = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_INFORMATIONAL, + 0x05, + 0xcafe, + TWO_UINT32_TO_UINT64( 0xDE, 0xAD), + TO_UINT64(0xBEEF) ); + + l_stepError.addErrorDetails( ISTEP_INVALID_REASONCODE, + ISTEP_INVALID_MODULE, l_errl2); + + l_stepError.addErrorDetails( ISTEP_INVALID_REASONCODE, + ISTEP_INVALID_MODULE, l_errl2); + + l_stepError.addErrorDetails( ISTEP_INVALID_REASONCODE, + ISTEP_INVALID_MODULE, l_errl2); + + // count should be 4 and the data0 and data 1 values of the + // istep error should be the same as before + + + // this call to get resets the error handle + errlHndl_t new_errl = l_stepError.getErrorHandle(); + + uint64_t l_data0 = new_errl->getUserData1(); + + uint32_t eid = ( l_data0 & 0xFFFFFFF00000000) >> 32; + uint32_t reason = (uint32_t)(l_data0 & 0x00000000FFFFFFFF); + + if( eid != l_errl->eid() ) + { + TS_FAIL("expected eid == l_errl->eid() " + "eid rebuilt from user data of " + "IStepError did not match original error eid"); + } + else + { + TS_TRACE("passed: eid == l_errl->eid()"); + } + + if( reason != l_errl->reasonCode() ) + { + TS_FAIL("expected reasonCode == l_errl->reasonCode()" + "reasonCode rebuilt from user data of" + "IStepError did not match original reasoncode"); + + } + else + { + TS_TRACE("passed: reason == l_errl->reasonCode()"); + } + + // verify that we counted the error we added + // count is in bytes 0-3 of userdata 2 + // + uint64_t l_data1 = new_errl->getUserData2(); + + l_data1 >>= 32; + + if( l_data1 != 4 ) + { + TS_FAIL("error count in IStepError not correct" + "should be 4"); + TS_TRACE("error count is %d", l_data1 ); + } + else + { + TS_TRACE("passed: error count is correct [%d]", l_data1 ); + } + + errlCommit( l_errl, CXXTEST_COMP_ID ); + errlCommit( new_errl, CXXTEST_COMP_ID ); + errlCommit( l_errl2, CXXTEST_COMP_ID ); + + }while(0); + } + +}; +#endif |