summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShakeeb <shakeebbk@in.ibm.com>2016-08-17 01:58:47 -0500
committerAMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>2016-09-02 07:58:32 -0400
commitba7f9cc584351b770de629d4493712840a18ba9d (patch)
tree34c4b0a12efb423837cb0135ac777c8831784dbc
parent185dabde31e9d83443da2222babbd0f547fb227e (diff)
downloadtalos-sbe-ba7f9cc584351b770de629d4493712840a18ba9d.tar.gz
talos-sbe-ba7f9cc584351b770de629d4493712840a18ba9d.zip
SBE HWP FFDC support
Change-Id: I2a578bbd0661c64f4ef1d3703b162327c9c9a036 RTC:129076 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28448 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com> Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
-rw-r--r--src/sbefw/sbeFifoMsgUtils.C26
-rw-r--r--src/sbefw/sbeFifoMsgUtils.H6
-rw-r--r--src/test/testcases/testCntlInstruction.py60
-rw-r--r--src/test/testcases/testUtil.py26
4 files changed, 99 insertions, 19 deletions
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
diff --git a/src/test/testcases/testCntlInstruction.py b/src/test/testcases/testCntlInstruction.py
index f3143e70..b30ff49c 100644
--- a/src/test/testcases/testCntlInstruction.py
+++ b/src/test/testcases/testCntlInstruction.py
@@ -254,22 +254,13 @@ INST_EXPDATA_ERR = [0xc0,0xde,0xa7,0x01,
0x00,0x00,0x00,0x03]
STOP_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01,
- 0x00,0xFE,0x00,0x0A,
- 0xFF,0xDC,0x00,0x02,
- 0x00,0xCE,0xBC,0xB2,
- 0x00,0x00,0x00,0x05]
+ 0x00,0xFE,0x00,0x0A]
START_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01,
- 0x00,0xFE,0x00,0x0A,
- 0xFF,0xDC,0x00,0x02,
- 0x00,0x25,0x64,0xDB,
- 0x00,0x00,0x00,0x05]
+ 0x00,0xFE,0x00,0x0A]
STEP_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01,
- 0x00,0xFE,0x00,0x0A,
- 0xFF,0xDC,0x00,0x02,
- 0x00,0x0D,0x06,0x8E,
- 0x00,0x00,0x00,0x05]
+ 0x00,0xFE,0x00,0x0A]
# MAIN Test Run Starts Here...
#-------------------------------------------------
@@ -301,18 +292,30 @@ def main( ):
testUtil.writeUsFifo( INST_STOP_0_0_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STOP_0_1_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STOP_0_2_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STOP_0_3_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
#stop all thread in core0
@@ -323,6 +326,9 @@ def main( ):
testUtil.writeUsFifo( INST_STOP0_ALL_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
# Control Instruction Message - Start
@@ -346,18 +352,30 @@ def main( ):
testUtil.writeUsFifo( INST_START_0_0_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_START_0_1_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_START_0_2_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_START_0_3_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
#start all thread in core0
@@ -368,6 +386,9 @@ def main( ):
testUtil.writeUsFifo( INST_START0_ALL_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
# Control Instruction Message - Step
@@ -390,18 +411,30 @@ def main( ):
testUtil.writeUsFifo( INST_STEP_0_0_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STEP_0_1_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STEP_0_2_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
testUtil.writeUsFifo( INST_STEP_0_3_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
#step all thread in core0
@@ -412,6 +445,9 @@ def main( ):
testUtil.writeUsFifo( INST_STEP0_ALL_TESTDATA_WITHOUT_WARN_FLG )
testUtil.writeEot( )
testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC )
+ testUtil.extractHWPFFDC( )
+ #flush out distance
+ testUtil.readDsEntryReturnVal()
testUtil.readEot( )
# Control Instruction Message - Sreset
diff --git a/src/test/testcases/testUtil.py b/src/test/testcases/testUtil.py
index 2312d2b7..b92fda60 100644
--- a/src/test/testcases/testUtil.py
+++ b/src/test/testcases/testUtil.py
@@ -147,6 +147,32 @@ def readEntry(obj, address, size):
return value
+def extractHWPFFDC(dumpToFile = False):
+ '''Header extraction'''
+ data = readDsEntryReturnVal()
+ magicBytes = ((data[0] << 8) | data[1])
+ if (magicBytes == 0xFFDC) :
+ print ("\nMagic Bytes Match")
+ else :
+ raise Exception('data mistmach')
+ packLen = ((data[2] << 8) | data[3])
+ print ("\nFFDC package length = " + str(packLen))
+
+ data = readDsEntryReturnVal()
+ fapiRc = ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3])
+ print ("\nFAPI rc = " + str(hex(fapiRc)))
+
+ if(dumpToFile):
+ myBin = open('trace.bin', 'wb')
+ print ("\nwriting "+'trace.bin')
+ for i in range(0, packLen-2):
+ data = readDsEntryReturnVal()
+ if(dumpToFile):
+ myBin.write(bytearray(data))
+ if(dumpToFile):
+ print("write to a file Done")
+ myBin.close()
+
def read(obj, address, size):
""" Read from memory space """
iface = SIM_get_interface(obj, "memory_space")
OpenPOWER on IntegriCloud