From 5681b4d8dd3f1dd49d967a74434151b35f97f64d Mon Sep 17 00:00:00 2001 From: Shakeeb Date: Thu, 1 Sep 2016 23:50:52 -0500 Subject: Changing FFDC package structure Change-Id: I150b6e094660e8b639296ee313994c0bd41cf6ee RTC: 160155 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/29236 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Sachin Gupta Reviewed-by: AMIT J. TENDOLKAR --- src/sbefw/sbeFFDC.C | 29 +++++++++++++++-------------- src/sbefw/sbeFFDC.H | 31 +++++++++++++------------------ src/sbefw/sbeFifoMsgUtils.C | 6 ++++-- src/sbefw/sbeSpMsg.H | 28 ++++++++++++++++++++++++++-- src/sbefw/sbe_sp_intf.H | 2 ++ src/sbefw/sbecmdgeneric.C | 8 ++++---- 6 files changed, 64 insertions(+), 40 deletions(-) (limited to 'src/sbefw') diff --git a/src/sbefw/sbeFFDC.C b/src/sbefw/sbeFFDC.C index 3a8e24e7..de8bd43f 100644 --- a/src/sbefw/sbeFFDC.C +++ b/src/sbefw/sbeFFDC.C @@ -30,22 +30,20 @@ #include "sbeFFDC.H" /* - * @brief sendOverFIFO - method to pack and send SBE internal FFDC - * only if isSendInternalFFDCSet() is true - * over FIFO interface - * @param[in] i_primStatus - Primary status of Chip op - * @param[in] i_secStatus - Secondary status of Chip op - * @param[in] i_fieldsConfig - bitmap indicating the field - * to be sent in FFDC - * @param[out] o_bytesSent -number of bytes sent - * + * @brief sendOverFIFO - method to pack and send SBE internal FFDC + * only if isSendInternalFFDCSet() is true + * over FIFO interface + * @param[in] i_hdr - Fifo response header + * @param[in] i_fieldsConfig - bitmap indicating the field + * to be sent in FFDC + * @param[out] o_bytesSent - number of bytes sent * @param[in] i_skipffdcBitCheck - Boolean to indicate whether * ffdc bit should be checked or not. * By default it is false. - * @return - SBE secondary RC + * + * @return - SBE secondary RC */ -uint32_t SbeFFDCPackage::sendOverFIFO(uint32_t i_primStatus, - uint32_t i_secStatus, +uint32_t SbeFFDCPackage::sendOverFIFO(const sbeRespGenHdr_t &i_hdr, uint32_t i_fieldsConfig, uint32_t &o_bytesSent, bool i_skipffdcBitCheck) @@ -72,8 +70,11 @@ uint32_t SbeFFDCPackage::sendOverFIFO(uint32_t i_primStatus, } // update the primary and secondary status - iv_sbeFFDCDataHeader.primaryStatus = i_primStatus; - iv_sbeFFDCDataHeader.secondaryStatus = i_secStatus; + iv_sbeFFDCDataHeader.primaryStatus = i_hdr.primaryStatus; + iv_sbeFFDCDataHeader.secondaryStatus = i_hdr.secondaryStatus; + // Set failed command information + // Sequence Id is 0 by default for Fifo interface + iv_sbeFFDCHeader.setCmdInfo(0, i_hdr.cmdClass, i_hdr.command); //Update the user data header with dump fields configuration iv_sbeFFDCDataHeader.dumpFields.set(i_fieldsConfig); iv_sbeFFDCHeader.lenInWords = (sizeof(sbeResponseFfdc_t) + diff --git a/src/sbefw/sbeFFDC.H b/src/sbefw/sbeFFDC.H index 995840a8..e77c54b6 100644 --- a/src/sbefw/sbeFFDC.H +++ b/src/sbefw/sbeFFDC.H @@ -75,7 +75,6 @@ public: static_assert((sizeof(PkTraceBuffer) % 4) == 0, "g_pk_trace_buf not 4byte aligned"); - iv_sbeFFDCHeader.magicBytes = 0xFFDC; iv_sbeFFDCHeader.fapiRc = fapi2::FAPI2_RC_PLAT_ERR_SEE_DATA; iv_sbeFFDCDataHeader.primaryStatus = SBE_PRI_OPERATION_SUCCESSFUL; @@ -85,29 +84,25 @@ public: //to be sent in send APIs iv_sbeFFDCDataHeader.dumpFields = {0}; } + /* - * @brief sendOverFIFO - method to pack and send SBE internal FFDC - * only if isSendInternalFFDCSet() is true - * over FIFO interface - * @param[in] i_primStatus - Primary status of Chip op - * @param[in] i_secStatus - Secondary status of Chip op - * @param[in] i_fieldsConfig - bitmap indicating the field - * to be sent in FFDC - * - * @param[out] o_bytesSent -number of bytes sent + * @brief sendOverFIFO - method to pack and send SBE internal FFDC + * only if isSendInternalFFDCSet() is true + * over FIFO interface + * @param[in] i_hdr - Fifo response header + * @param[in] i_fieldsConfig - bitmap indicating the field + * to be sent in FFDC + * @param[out] o_bytesSent - number of bytes sent + * @param[in] i_skipffdcBitCheck - Boolean to indicate whether + * ffdc bit should be checked or not. + * By default it is false. * - * @param[in] i_skipffdciBitCheck - * - boolean to indicate whether - * ffdc bit should be checked or not. - * By Default it is false. - * @return - SBE secondary RC + * @return - SBE secondary RC */ - uint32_t sendOverFIFO(uint32_t i_primStatus, - uint32_t i_secStatus, + uint32_t sendOverFIFO(const sbeRespGenHdr_t &i_hdr, uint32_t i_fieldsConfig, uint32_t &o_bytesSent, bool i_skipffdcBitCheck = false); - /* TODO via RTC:150786 * @brief sendOverHOST - method to pack and send SBE internal FFDC * only if isSendInternalFFDCSet() is true diff --git a/src/sbefw/sbeFifoMsgUtils.C b/src/sbefw/sbeFifoMsgUtils.C index 4525d20f..1f35bf6d 100644 --- a/src/sbefw/sbeFifoMsgUtils.C +++ b/src/sbefw/sbeFifoMsgUtils.C @@ -344,6 +344,9 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, assert((g_FfdcData.ffdcLength % sizeof(uint32_t)) == 0); uint32_t ffdcDataLenInWords = g_FfdcData.ffdcLength / sizeof(uint32_t); + // Set failed command information + // Sequence Id is 0 by default for Fifo interface + i_ffdc->setCmdInfo(0, i_hdr.cmdClass, i_hdr.command); // Add HWP specific ffdc data length i_ffdc->lenInWords += ffdcDataLenInWords; len = sizeof(sbeResponseFfdc_t)/sizeof(uint32_t); @@ -371,8 +374,7 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, //Add FFDC data as well. //Generate all the fields of FFDC package SbeFFDCPackage sbeFfdc; - rc = sbeFfdc.sendOverFIFO(i_hdr.primaryStatus, - i_hdr.secondaryStatus, + rc = sbeFfdc.sendOverFIFO(i_hdr, SBE_FFDC_ALL_DUMP, len); if (rc) diff --git a/src/sbefw/sbeSpMsg.H b/src/sbefw/sbeSpMsg.H index c1b972bf..38251632 100644 --- a/src/sbefw/sbeSpMsg.H +++ b/src/sbefw/sbeSpMsg.H @@ -6,6 +6,7 @@ /* OpenPOWER sbe Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ /* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ @@ -147,8 +148,29 @@ typedef struct sbeResponseFfdc { uint32_t magicBytes:16; uint32_t lenInWords:16; // length in word( 4 byte ) + uint32_t seqId:16; + uint32_t cmdClass:8; + uint32_t cmd:8; uint32_t fapiRc; + /** + * @brief set failed command information + * + * @param[in] i_seqId sequence Id of command + * @param[in] i_cmdClass command class + * @param[in] i_cmd command + * + * @return + */ + void inline setCmdInfo(const uint16_t i_seqId, + const uint8_t i_cmdClass, + const uint8_t i_cmd) + { + seqId = i_seqId; + cmdClass = i_cmdClass; + cmd = i_cmd; + } + /** * @brief set rc * @@ -181,9 +203,11 @@ typedef struct sbeResponseFfdc sbeResponseFfdc() { magicBytes = 0xFFDC; - //TODO via 129076. - //Need to change value for length once FFDC design is final. + seqId = 0; + cmdClass = SBE_CMD_CLASS_UNKNOWN; + cmd = SBE_CMD_UNKNOWN; lenInWords = ( sizeof(uint32_t ) // For magicBytes + lenInWords + + sizeof(uint32_t) // For SeqId + CmdClass + Cmd + sizeof(fapiRc)) / sizeof(uint32_t); fapiRc = 0; diff --git a/src/sbefw/sbe_sp_intf.H b/src/sbefw/sbe_sp_intf.H index f210adb7..93a05148 100644 --- a/src/sbefw/sbe_sp_intf.H +++ b/src/sbefw/sbe_sp_intf.H @@ -63,6 +63,8 @@ enum sbeCommandClass SBE_CMD_CLASS_MPIPL_COMMANDS = 0xA9, }; +static const uint8_t SBE_CMD_UNKNOWN = 0x00; + /** * @brief enums for SBE Istep Control command class * diff --git a/src/sbefw/sbecmdgeneric.C b/src/sbefw/sbecmdgeneric.C index 31165e50..c45a70a6 100644 --- a/src/sbefw/sbecmdgeneric.C +++ b/src/sbefw/sbecmdgeneric.C @@ -150,10 +150,10 @@ uint32_t sbeGetFfdc (uint8_t *i_pArg) // @TODO via RTC : 149074 // primary and secondary status should be picked // from the globals. - rc = sbeFfdcPack.sendOverFIFO(respHdr.primaryStatus, - respHdr.secondaryStatus, - SBE_FFDC_ALL_DUMP,len, - true); + rc = sbeFfdcPack.sendOverFIFO(respHdr, + SBE_FFDC_ALL_DUMP, + len, + true); if (rc) { break; -- cgit v1.2.1