diff options
| author | Marty Gloff <mgloff@us.ibm.com> | 2017-08-07 09:26:09 -0500 |
|---|---|---|
| committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-08-27 12:36:09 -0400 |
| commit | 6442a89776eb751ed923c157c7b04e2b6941adb1 (patch) | |
| tree | 812f17223aa58a1d9d18b206a1a86b486f915fe8 /src/usr/sbeio/test | |
| parent | e103f5b112f2b705db2c1691842dfd3dedecd06a (diff) | |
| download | blackbird-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.H | 158 | ||||
| -rw-r--r-- | src/usr/sbeio/test/sbe_getsbeffdctest.H | 206 |
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 |

