From ba7f9cc584351b770de629d4493712840a18ba9d Mon Sep 17 00:00:00 2001 From: Shakeeb Date: Wed, 17 Aug 2016 01:58:47 -0500 Subject: SBE HWP FFDC support Change-Id: I2a578bbd0661c64f4ef1d3703b162327c9c9a036 RTC:129076 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28448 Tested-by: Jenkins Server Reviewed-by: Sachin Gupta Reviewed-by: AMIT J. TENDOLKAR --- src/sbefw/sbeFifoMsgUtils.C | 26 ++++++++++++++++++++++---- src/sbefw/sbeFifoMsgUtils.H | 6 +++--- 2 files changed, 25 insertions(+), 7 deletions(-) (limited to 'src/sbefw') diff --git a/src/sbefw/sbeFifoMsgUtils.C b/src/sbefw/sbeFifoMsgUtils.C index 99cf2709..07463336 100644 --- a/src/sbefw/sbeFifoMsgUtils.C +++ b/src/sbefw/sbeFifoMsgUtils.C @@ -35,6 +35,7 @@ #include "sbeerrorcodes.H" #include "assert.h" #include "sbeFFDC.H" +#include "hwp_error_info.H" // If we can not perform FIFO operation ( FIFO FULL while writing // or EMPTY while reading ) we will sleep for FIFO_WAIT_SLEEP_TIME @@ -45,6 +46,7 @@ static const uint32_t FIFO_WAIT_SLEEP_TIME = 1; // in higher word to trigger EOT. static const uint64_t DOWNSTREAM_EOT_DATA = 0x100000000ull; +using namespace fapi2; ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// uint32_t sbeUpFifoDeq_mult (uint32_t &io_len, @@ -318,7 +320,7 @@ uint32_t sbeDownFifoSignalEot (void) uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, - const sbeResponseFfdc_t &i_ffdc ) + sbeResponseFfdc_t &io_ffdc ) { uint32_t rc = SBE_SEC_OPERATION_SUCCESSFUL; do @@ -334,15 +336,30 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, distance += len; // If no ffdc , exit; - if( i_ffdc.getRc() ) + if( io_ffdc.getRc() ) { - len = sizeof(i_ffdc)/sizeof(uint32_t); - rc = sbeDownFifoEnq_mult ( len, ( uint32_t *) &i_ffdc); + // making sure ffdc length is multiples of uint32_t + assert((g_FfdcData.ffdcLength % sizeof(uint32_t)) == 0); + uint32_t ffdcDataLenInWords = g_FfdcData.ffdcLength + / sizeof(uint32_t); + // Add HWP specific ffdc data length + io_ffdc.lenInWords += ffdcDataLenInWords; + len = sizeof(io_ffdc)/sizeof(uint32_t); + rc = sbeDownFifoEnq_mult ( len, ( uint32_t *) &io_ffdc); if (rc) { break; } distance += len; + + // Send HWP ffdc data + rc = sbeDownFifoEnq_mult ( ffdcDataLenInWords, + ( uint32_t *) &g_FfdcData.ffdcData); + if (rc) + { + break; + } + distance += ffdcDataLenInWords; } // If there is a SBE internal failure @@ -369,6 +386,7 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, { break; } + SBE_INFO("sizeof(sbeFfdc_t) [%x]", sizeof(sbeFfdc_t)); }while(0); return rc; diff --git a/src/sbefw/sbeFifoMsgUtils.H b/src/sbefw/sbeFifoMsgUtils.H index 60492964..c3a5c856 100644 --- a/src/sbefw/sbeFifoMsgUtils.H +++ b/src/sbefw/sbeFifoMsgUtils.H @@ -182,11 +182,11 @@ uint32_t sbeDownFifoSignalEot (void); * @brief sbeDsSendRespHdr : Send response header to DS FIFO * - This also sends the FFDC if exist. * - * @param[in] i_hdr Response Header - * @param[in] i_ffdc FFDC object + * @param[in] i_hdr Response Header + * @param[in] io_ffdc FFDC object * * @return Rc from the underlying scom utility */ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, - const sbeResponseFfdc_t &i_ffdc ); + sbeResponseFfdc_t &io_ffdc ); #endif // __SBEFW_SBEFIFOMSGUTILS_H -- cgit v1.2.1