summaryrefslogtreecommitdiffstats
path: root/src/usr/sbeio/test
diff options
context:
space:
mode:
authorMarty Gloff <mgloff@us.ibm.com>2017-08-07 09:26:09 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-08-27 12:36:09 -0400
commit6442a89776eb751ed923c157c7b04e2b6941adb1 (patch)
tree812f17223aa58a1d9d18b206a1a86b486f915fe8 /src/usr/sbeio/test
parente103f5b112f2b705db2c1691842dfd3dedecd06a (diff)
downloadblackbird-hostboot-6442a89776eb751ed923c157c7b04e2b6941adb1.tar.gz
blackbird-hostboot-6442a89776eb751ed923c157c7b04e2b6941adb1.zip
Implement getSbeFfdc FIFO request
Add support for sending getSbeFfdc FIFO requests to SBE and add a test case for the getSbeFfdc request. Change-Id: I19dbbd92cb2d25679218528d199cfbd09fd9f995 RTC: 178022 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44288 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/sbeio/test')
-rw-r--r--src/usr/sbeio/test/sbe_fifo_buffer_test.H158
-rw-r--r--src/usr/sbeio/test/sbe_getsbeffdctest.H206
2 files changed, 361 insertions, 3 deletions
diff --git a/src/usr/sbeio/test/sbe_fifo_buffer_test.H b/src/usr/sbeio/test/sbe_fifo_buffer_test.H
index 0383ebe7b..6d524c8ad 100644
--- a/src/usr/sbeio/test/sbe_fifo_buffer_test.H
+++ b/src/usr/sbeio/test/sbe_fifo_buffer_test.H
@@ -35,6 +35,8 @@
extern trace_desc_t* g_trac_sbeio;
+#define SBE_BUFFER_TRACF(printf_string,args...) \
+ TRACFCOMP(g_trac_sbeio,"sbeFifoBufferTest: " printf_string,##args)
#define SBE_BUFFER_TRACD(printf_string,args...) \
TRACDCOMP(g_trac_sbeio,"sbeFifoBufferTest: " printf_string,##args)
@@ -45,9 +47,11 @@ class SbeFifoRespBufferTestFixture:public SbeFifoRespBuffer
public:
explicit SbeFifoRespBufferTestFixture(uint32_t * i_fifoBuffer,
- size_t bufferWordSize):
+ size_t bufferWordSize,
+ bool i_getSbeFfdcFmt = false):
SbeFifoRespBuffer(i_fifoBuffer,
- bufferWordSize)
+ bufferWordSize,
+ i_getSbeFfdcFmt)
{
}
@@ -129,6 +133,19 @@ std::vector<uint32_t> bufferShortRead = {
0x00000001 //EOT
};
+std::vector<uint32_t> bufferGetSbeFFDC = {
+ 0xFFDC0024, //FFDC 1
+ 0x00983AB6, //FFDC 2 - RC_SBE_SCOM_FAILURE
+ 0x00000008, //FFDC 3 - scom addr size
+ 0x12345678, //FFDC 4 - scom addr
+ 0x00000008, //FFDC 5 - PIB RC size
+ 0x00000006, //FFDC 6 - PIB_PARITY_ERROR
+ 0xC0DEA801, //Status Header 1
+ 0x00000000, //Status Header 2
+ 0x00000003, //Offset to Status Header
+ 0x00000001, //EOT
+ };
+
size_t overrun_element_count{2096};
uint32_t overrun_element_value{34};
std::vector<uint32_t> bufferOverrun(overrun_element_count,
@@ -164,7 +181,7 @@ public:
//------------------------------------------------
void testState()
{
- SBE_BUFFER_TRACD("Enter sbeFifoBufferTest testState");
+ SBE_BUFFER_TRACF("Enter sbeFifoBufferTest testState");
bool result{true};
@@ -1349,6 +1366,141 @@ public:
}
}
+ //-----------------------------------------------------------------------
+ void testGetSbeFFDC()
+ {
+ SBE_BUFFER_TRACD("Enter sbeFifoBufferTest testGetSbeFFDC");
+
+ //Test with buffer data that has FFDC data in get SBE FFDC format
+
+ bool result{true};
+
+ do
+ {
+ uint32_t callerBuffer[10] = {0};
+ SbeFifoRespBufferTestFixture fifoBuffer(callerBuffer,
+ sizeof(callerBuffer)/sizeof(uint32_t),
+ true);
+
+ if(not fifoBuffer)
+ {
+ TS_FAIL("sbeFifoBufferTest testGetSbeFFDC: "
+ "The FIFO buffer is not in a good state after "
+ "CTOR call. Buffer state: %s",
+ fifoBuffer.getStateString()
+ );
+
+ result = false;
+ break;
+ }
+
+ setTestData(&bufferGetSbeFFDC);
+
+ while(fifoBuffer)
+ {
+ uint32_t value{};
+ bool rc = readTestData(value);
+ if(rc)
+ {
+ rc = fifoBuffer.append(value);
+ if(not rc)
+ {
+ TS_FAIL("sbeFifoBufferTest testGetSbeFFDC: "
+ "append operation unexpectedly failed. "
+ "Fifo Buffer state = %s",
+ fifoBuffer.getStateString()
+ );
+
+ result = false;
+ break;
+ }
+ }
+ else
+ {
+ fifoBuffer.completeMessage();
+ }
+ }
+
+ if(not result)
+ {
+ break;
+ }
+
+ if(SbeFifoRespBuffer::MSG_COMPLETE != fifoBuffer.getState())
+ {
+ TS_FAIL("sbeFifoBufferTest testGetSbeFFDC: "
+ "Buffer unexpectedly not in the complete state after "
+ "populating buffer. State = %s.",
+ fifoBuffer.getStateString()
+ );
+
+ result = false;
+ break;
+ }
+
+ if(not fifoBuffer.isMsgComplete())
+ {
+ TS_FAIL("sbeFifoBufferTest testGetSbeFFDC: "
+ "unexpectedly returned false for isMsgComplete"
+ );
+
+ result = false;
+ break;
+ }
+
+ if(not fifoBuffer.getStatus())
+ {
+ TS_FAIL("sbeFifoBufferTest testGetSbeFFDC: "
+ "unexpectedly returned false for getStatus"
+ );
+
+ result = false;
+ break;
+ }
+
+ expected_data expData;
+ memset(&expData, 0, sizeof(expData));
+
+ expData.test_name = "GetSbeFFDC";
+ expData.index = 10;
+ expData.offset_index = 8;
+ expData.offset = 3;
+
+ expData.statusIndex = 6;
+ expData.expected_status = &bufferGetSbeFFDC[6];
+
+ // NOTE: FFDC is in the return data for get SBE FFDC response.
+ expData.expectFFDC = true;
+ expData.ffdcIndex = 0;
+ expData.ffdcByteSize = sizeof(uint32_t)*6;
+ expData.expected_ffdc_data = &bufferGetSbeFFDC[0];
+
+ expData.expectReturnData = true;
+ expData.dataByteSize = sizeof(uint32_t) * 6;
+ expData.expected_data = &bufferGetSbeFFDC[0];
+
+ bool check_result = runChecks(expData, fifoBuffer);
+
+ if(not check_result)
+ {
+ TS_FAIL("%s", expData.strMessage);
+
+ result = false;
+ break;
+ }
+ }
+ while(0);
+
+ if(result)
+ {
+ SBE_BUFFER_TRACD("sbeFifoBufferTest testGetSbeFFDC test passed!");
+ }
+ else
+ {
+ SBE_BUFFER_TRACD("sbeFifoBufferTest testGetSbeFFDC test failed!");
+ }
+ }
+
private:
std::vector<uint32_t>* iv_testData{};
diff --git a/src/usr/sbeio/test/sbe_getsbeffdctest.H b/src/usr/sbeio/test/sbe_getsbeffdctest.H
new file mode 100644
index 000000000..431d81696
--- /dev/null
+++ b/src/usr/sbeio/test/sbe_getsbeffdctest.H
@@ -0,0 +1,206 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/sbeio/test/sbe_getsbeffdctest.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#ifndef __SBE_GETSBEFFDCTEST_H
+#define __SBE_GETSBEFFDCTEST_H
+
+/**
+ * @file sbe_getsbeffdctest.H
+ *
+ * @brief Test cases for get sbe ffdc fifo request
+*/
+
+#include <cxxtest/TestSuite.H>
+#include <errl/errlentry.H>
+#include <errl/errlmanager.H>
+#include <targeting/common/commontargeting.H>
+#include <targeting/common/utilFilter.H>
+#include <targeting/common/target.H>
+#include <targeting/common/targetservice.H>
+#include <sbeio/sbeioif.H>
+#include <sbeio/sbe_sp_intf.H>
+#include <../../usr/sbeio/sbe_fifodd.H>
+#include "sbe_fifo_buffer.H"
+
+#define SBEFFDC_TRACF(printf_string,args...) \
+ TRACFCOMP(g_trac_sbeio,"getSBEFFDCTest: " printf_string,##args)
+
+extern trace_desc_t* g_trac_sbeio;
+
+class GetSBEFFDCTest : public CxxTest::TestSuite
+{
+ public:
+
+ /**
+ * @brief Test with zero data
+ */
+ void testgetSBEFFDC1(void)
+ {
+ errlHndl_t l_errl = nullptr;
+ uint32_t l_responseSize = SbeFifoRespBuffer::MSG_BUFFER_SIZE;
+ uint32_t *l_pFifoResponse =
+ reinterpret_cast<uint32_t *>(malloc(l_responseSize));
+
+ TS_TRACE("getSBEFFDCTest entry");
+
+ //
+ // get a list of all functional procs in the system
+ //
+ TARGETING::TargetHandleList l_cpuTargetList;
+ getAllChips(l_cpuTargetList,
+ TARGETING::TYPE_PROC);
+
+ SBEFFDC_TRACF("getSBEFFDCTest: %d proc(s) in the system.",
+ l_cpuTargetList.size() );
+
+ //
+ // get the master procs for the system
+ //
+ TARGETING::Target* masterProcChipTargetHandle = NULL;
+ l_errl = TARGETING::targetService().
+ queryMasterProcChipTargetHandle(masterProcChipTargetHandle);
+ if(l_errl)
+ {
+ TS_FAIL("getSBEFFDCTest FAILED: query master proc, RC 0x.8X",
+ l_errl->reasonCode());
+
+ errlCommit( l_errl, CXXTEST_COMP_ID );
+
+ }
+ else
+ {
+ // loop thru all the cpu's
+ for (const auto & l_cpu_target: l_cpuTargetList)
+ {
+ // Can't do FSI with SBE for master proc
+ if(l_cpu_target == masterProcChipTargetHandle)
+ {
+ TS_TRACE("getSBEFFDCTest: Skipping testing for master "
+ "proc 0x%.8X",
+ TARGETING::get_huid(l_cpu_target));
+
+ continue;
+ }
+
+ l_errl = SBEIO::getFifoSBEFFDC(l_cpu_target,
+ l_pFifoResponse,
+ l_responseSize);
+
+ // Check that no error log was returned
+ if(l_errl != nullptr)
+ {
+ TS_FAIL("getSBEFFDCTest FAILED: proc 0x%.8X, RC 0x.8X",
+ TARGETING::get_huid(l_cpu_target),
+ l_errl->reasonCode());
+
+ delete l_errl;
+ l_errl = nullptr;
+ break;
+ }
+
+ // Find the status header after the return data, ie, FFDC
+ uint32_t l_size = 0;
+ SbeFifo::ffdcHeader *l_pFfdcHeader =
+ reinterpret_cast<SbeFifo::ffdcHeader *>(l_pFifoResponse);
+ uint64_t l_firstFfdcHeaderAddr =
+ reinterpret_cast<uint64_t>(l_pFfdcHeader);
+ while(l_pFfdcHeader->magic == SBEIO::SbeFifo::FIFO_FFDC_MAGIC)
+ {
+ l_size += l_pFfdcHeader->lengthWords / sizeof(uint32_t);
+ l_pFfdcHeader = reinterpret_cast<SbeFifo::ffdcHeader *>
+ (l_firstFfdcHeaderAddr + l_size);
+ };
+ SbeFifo::statusHeader *l_pStatusHeader = reinterpret_cast<
+ SbeFifo::statusHeader *>(l_firstFfdcHeaderAddr + l_size);
+
+ // Check that status header has expected magic value
+ if(l_pStatusHeader->magic != SBEIO::SbeFifo::FIFO_STATUS_MAGIC)
+ {
+ TS_FAIL("getSBEFFDCTest FAILED: proc 0x%.8X with status "
+ "magic 0x%.4x, but expected 0x%.4x",
+ TARGETING::get_huid(l_cpu_target),
+ l_pStatusHeader->magic,
+ SBEIO::SbeFifo::FIFO_STATUS_MAGIC);
+
+ break;
+ }
+
+ // Check status header has expected command class and command
+ if((l_pStatusHeader->commandClass !=
+ SBEIO::SbeFifo::SBE_FIFO_CLASS_GENERIC_MESSAGE) ||
+ (l_pStatusHeader->command !=
+ SBEIO::SbeFifo::SBE_FIFO_CMD_GET_SBE_FFDC))
+ {
+ TS_FAIL("getSBEFFDCTest FAILED: proc 0x%.8X with status "
+ "command 0x%.2x%.2x, but expected 0x%.2x%.2x",
+ TARGETING::get_huid(l_cpu_target),
+ l_pStatusHeader->commandClass,
+ l_pStatusHeader->command,
+ SBEIO::SbeFifo::SBE_FIFO_CLASS_GENERIC_MESSAGE,
+ SBEIO::SbeFifo::SBE_FIFO_CMD_GET_SBE_FFDC);
+
+ break;
+ }
+
+ // Check if status header has allowed unsupported status
+ if((l_pStatusHeader->primaryStatus == SBE_PRI_INVALID_COMMAND)
+ && (l_pStatusHeader->secondaryStatus ==
+ SBE_SEC_COMMAND_NOT_SUPPORTED))
+ {
+ TS_TRACE("getSBEFFDCTest: proc 0x%.8X got response with "
+ "not supported status 0x%.4x / 0x%.4x",
+ TARGETING::get_huid(l_cpu_target),
+ l_pStatusHeader->primaryStatus,
+ l_pStatusHeader->secondaryStatus);
+
+ break;
+ }
+
+ // Check that status header has expected successful status
+ if((l_pStatusHeader->primaryStatus !=
+ SBE_PRI_OPERATION_SUCCESSFUL) ||
+ (l_pStatusHeader->secondaryStatus !=
+ SBE_SEC_OPERATION_SUCCESSFUL))
+ {
+ TS_FAIL("getSBEFFDCTest FAILED: proc 0x%.8X with status "
+ "0x%.4x / 0x%.4x, but expected 0x%.4x / 0x%.4x",
+ TARGETING::get_huid(l_cpu_target),
+ l_pStatusHeader->primaryStatus,
+ l_pStatusHeader->secondaryStatus,
+ SBE_PRI_OPERATION_SUCCESSFUL,
+ SBE_SEC_OPERATION_SUCCESSFUL);
+
+ break;
+ }
+ }
+ }
+
+ free(l_pFifoResponse);
+ l_pFifoResponse = nullptr;
+
+ TS_TRACE("getSBEFFDCTest exit");
+ }
+};
+
+#endif
OpenPOWER on IntegriCloud