diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2018-08-30 09:26:02 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-10-03 09:38:26 -0500 |
commit | 1c97a157a652980c994c3bc4f452f3b0fdc70ecf (patch) | |
tree | 2cbc1273cf987bc2e470d9d8e1ea98069cda739d /src/usr/fapi2 | |
parent | 1ad25a8428db5a9811c5d494d1a9cdb4c57a1658 (diff) | |
download | blackbird-hostboot-1c97a157a652980c994c3bc4f452f3b0fdc70ecf.tar.gz blackbird-hostboot-1c97a157a652980c994c3bc4f452f3b0fdc70ecf.zip |
Cxxtest for fapi_i2c support
Test framework for fapi_i2c testing
Change-Id: I2f901ad393d03ce498e7b1c30ce1c4ef25bee037
RTC:197029
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/65952
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/fapi2')
-rw-r--r-- | src/usr/fapi2/test/fapi2I2cAccessTest.H | 174 | ||||
-rw-r--r-- | src/usr/fapi2/test/fapi2Test.mk | 22 | ||||
-rw-r--r-- | src/usr/fapi2/test/p9_i2ctests.C | 251 | ||||
-rw-r--r-- | src/usr/fapi2/test/p9_i2ctests.H | 55 |
4 files changed, 501 insertions, 1 deletions
diff --git a/src/usr/fapi2/test/fapi2I2cAccessTest.H b/src/usr/fapi2/test/fapi2I2cAccessTest.H new file mode 100644 index 000000000..d6b1e4f43 --- /dev/null +++ b/src/usr/fapi2/test/fapi2I2cAccessTest.H @@ -0,0 +1,174 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/fapi2/test/fapi2I2cAccessTest.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2018 */ +/* [+] 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 __FAPI2_I2CACCESSTEST_H +#define __FAPI2_I2CACCESSTEST_H + +/** + * @file src/usr/fapi2/test/fapi2I2cAccessTest.H + * + * @brief Test various types of i2c access with FAPI2 Macros + */ + +#include <cxxtest/TestSuite.H> +#include <errl/errlmanager.H> +#include <errl/errlentry.H> +#include <fapi2.H> +#include <fapi2TestUtils.H> +#include <p9_i2ctests.H> +#include <plat_hwp_invoker.H> + +using namespace fapi2; + +class Fapi2I2cAccessTest : public CxxTest::TestSuite +{ +public: +//****************************************************************************** +// test_fapi2I2cIllegalAccess +//****************************************************************************** +void test_fapi2I2cIllegalAccess() +{ + errlHndl_t l_errl = nullptr; + int numTests = 0; + int numFails = 0; + + // Create a vector of TARGETING::Target pointers + TARGETING::TargetHandleList l_procTargetList; + + // Get a list of all of the proc chips + TARGETING::getAllChips(l_procTargetList, TARGETING::TYPE_PROC, true); + + + for (auto & l_proc: l_procTargetList) + { + Target<fapi2::TARGET_TYPE_PROC_CHIP> fapi2_procTarget( l_proc ); + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_geti2c_fail, fapi2_procTarget); + if(l_errl != nullptr) + { + delete l_errl; // delete expected error log + l_errl = nullptr; + } + else + { + TS_FAIL("No error from p9_i2ctest_geti2c_fail !!"); + numFails++; + } + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_puti2c_fail, fapi2_procTarget); + if(l_errl != nullptr) + { + delete l_errl; // delete expected error log + l_errl = nullptr; + } + else + { + TS_FAIL("No error from p9_i2ctest_puti2c_fail !!"); + numFails++; + } + } + + FAPI_INF("fapi2I2cAccessTest Test Complete. %d/%d fails", numFails, numTests); + +} + + +//****************************************************************************** +// test_fapi2I2cAccess +//****************************************************************************** +void test_fapi2I2cAccess() +{ + int numTests = 0; + int numFails = 0; + + errlHndl_t l_errl = nullptr; + + // Create a vector of TARGETING::Target pointers + TARGETING::TargetHandleList l_chipList; + + // Get a list of all of the proc chips + TARGETING::getAllChips(l_chipList, TARGETING::TYPE_OCMB_CHIP, true); + + for (auto & l_ocmb: l_chipList) + { + Target<fapi2::TARGET_TYPE_OCMB_CHIP> l_fapi2_target( l_ocmb ); + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_geti2c_pass, l_fapi2_target); + if(l_errl) + { + TS_FAIL("Error from p9_i2ctest_geti2c_pass !!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + l_errl = nullptr; + } + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_puti2c_pass, l_fapi2_target); + if(l_errl) + { + TS_FAIL("Error from p9_i2ctest_puti2c_pass !!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + l_errl = nullptr; + } + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_double_read_pass, l_fapi2_target); + if(l_errl) + { + TS_FAIL("Error from p9_i2ctest_double_read_pass !!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + l_errl = nullptr; + } + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_i2ctest_write_read_pass, l_fapi2_target); + if(l_errl) + { + TS_FAIL("Error from p9_i2ctest_write_read_pass !!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + l_errl = nullptr; + } + } + + FAPI_INF("fapi2I2cAccessTest Test Complete. %d/%d fails", numFails, numTests); +} + + +}; + +#endif // End __FAPI2_I2CACCESSTEST_H diff --git a/src/usr/fapi2/test/fapi2Test.mk b/src/usr/fapi2/test/fapi2Test.mk index 3f9770f90..8ce5638e0 100644 --- a/src/usr/fapi2/test/fapi2Test.mk +++ b/src/usr/fapi2/test/fapi2Test.mk @@ -52,7 +52,27 @@ OBJS += fapi2TestUtils.o OBJS += getVpdTest.o OBJS += p9_pm_get_poundv_bucket.o -TESTS += ${shell ls ${ROOTPATH}/src/usr/fapi2/test/*Test.H | sort | xargs} +ifeq (${HOSTBOOT_RUNTIME},1) +################################################################################ +## Remove non-runtime tests (grep -v testname.H) +TESTS += ${shell ls ${ROOTPATH}/src/usr/fapi2/test/*Test.H | \ + grep -v fapi2I2cAccessTest.H | \ + sort | xargs} + +################################################################################ + +else + +################################################################################ +## All hostboot IPL time tests +TESTS += ${shell ls ${ROOTPATH}/src/usr/fapi2/test/*Test.H | \ + sort | xargs} +OBJS += p9_i2ctests.o + +################################################################################ +endif + +TESTS += ${shell ls src/usr/fapi2/test/*TestCxx.H | sort | xargs)} VPATH += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/pm/ diff --git a/src/usr/fapi2/test/p9_i2ctests.C b/src/usr/fapi2/test/p9_i2ctests.C new file mode 100644 index 000000000..e71aa22df --- /dev/null +++ b/src/usr/fapi2/test/p9_i2ctests.C @@ -0,0 +1,251 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/fapi2/test/p9_i2ctests.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2018 */ +/* [+] 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 */ +//------------------------------------------------------------------------------ +/// @file p9_i2ctests.C +/// +/// @brief These procedures test the fapi2 i2c_access interfaces. +//----------------------------------------------------------------------------- +#include <sys/time.h> + +#include <fapi2.H> +#include <i2c_access.H> +#include <errl/errlentry.H> +#include <plat_hwp_invoker.H> +#include <sbe/sbe_common.H> + + +fapi2::ReturnCode p9_i2ctest_geti2c_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + // This will fail because PROC_CHIP not supported type + std::vector<uint8_t> l_i2cdata; + std::vector<uint8_t> l_cfgData; + l_cfgData.push_back(0); + l_cfgData.push_back(1); + + FAPI_INF("Entering p9_i2ctest_geti2c_fail..."); + + FAPI_INF("Do getI2c on a proc target for 10 bytes"); + FAPI_TRY(fapi2::getI2c(i_target, + 10, + l_cfgData, + l_i2cdata)); + fapi_try_exit: + + FAPI_INF("Exiting p9_i2ctest_geti2c_fail..."); + + return fapi2::current_err; + +} + +fapi2::ReturnCode p9_i2ctest_puti2c_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + // This will fail because PROC_CHIP not supported type + FAPI_INF("Entering p9_i2ctest_puti2c_fail..."); + + std::vector<uint8_t> l_i2cdata; + l_i2cdata.push_back(1); + l_i2cdata.push_back(2); + l_i2cdata.push_back(3); + l_i2cdata.push_back(4); + l_i2cdata.push_back(5); + + + FAPI_INF( "Do putI2c on proc target" ); + FAPI_TRY(fapi2::putI2c(i_target, + l_i2cdata)); + + fapi_try_exit: + + FAPI_INF( "Exiting p9_i2ctest_puti2c_fail... rc = 0x%.8X", + (uint64_t)fapi2::current_err ); + + return fapi2::current_err; + +} + +//////////////////////////////////////////////////////////////////////////////// +// @todo RTC:198116 -- Need to update testcases to use OCMB target instead of PROC +// Also update FAPI_I2C_CONTROL_INFO attribute on OCMB target +//////////////////////////////////////////////////////////////////////////////// +fapi2::ReturnCode p9_i2ctest_geti2c_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + std::vector<uint8_t> l_i2cdata; + std::vector<uint8_t> l_cfgData; + + FAPI_INF("Entering p9_i2ctest_geti2c_pass..."); +/* + const size_t l_i2cdataSize = 4; + FAPI_INF("Do getI2c on a proc target"); + FAPI_TRY(fapi2::getI2c(i_target, + l_i2cdataSize, + l_cfgData, + l_i2cdata)); + + fapi_try_exit: +*/ + FAPI_INF("Exiting p9_i2ctest_geti2c_pass..."); + + return fapi2::current_err; + +} + + +fapi2::ReturnCode p9_i2ctest_double_read_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ +/* + std::vector<uint8_t> l_cfgData; + std::vector<uint8_t> l_1st_read; + std::vector<uint8_t> l_2nd_read; + + FAPI_INF("Entering p9_i2ctest_double_read_pass..."); + + const size_t l_expectedReadSize = sizeof(SBE::sbeSeepromVersionInfo_t); + l_cfgData.push_back(0xFE); + l_cfgData.push_back(0xD9); + + FAPI_INF("Do first getI2c on a proc target"); + FAPI_TRY(fapi2::getI2c(i_target, + l_expectedReadSize, + l_cfgData, + l_1st_read)); + + // Initialize to some bad data + l_2nd_read.push_back('T'); + l_2nd_read.push_back('e'); + l_2nd_read.push_back('s'); + l_2nd_read.push_back('t'); + + FAPI_INF("Do second getI2c on a proc target"); + FAPI_TRY(fapi2::getI2c(i_target, + l_expectedReadSize, + l_cfgData, + l_2nd_read)); + + // read data should match + if (l_2nd_read != l_1st_read) + { + FAPI_ERR("1st read data does NOT match 2nd read data"); + TRACFBIN(g_fapiTd, "1st data", l_1st_read.data(), l_1st_read.size()); + TRACFBIN(g_fapiTd, "2nd data", l_2nd_read.data(), l_2nd_read.size()); + } + + fapi_try_exit: +*/ + FAPI_INF("Exiting p9_i2ctest_double_read_pass..."); + + return fapi2::current_err; +} + + +fapi2::ReturnCode p9_i2ctest_puti2c_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + FAPI_INF("Entering p9_i2ctest_puti2c_pass..."); +/* + std::vector<uint8_t> l_i2cdata; + + // purposely truncate address to the last 2 bytes + uint16_t offsetAddr = (uint16_t)SBE::SBE_VERSION_SEEPROM_ADDRESS; + uint8_t * pOffset = (uint8_t*)&offsetAddr; + + l_i2cdata.push_back(pOffset[0]); + l_i2cdata.push_back(pOffset[1]); + l_i2cdata.push_back('P'); + l_i2cdata.push_back('U'); + l_i2cdata.push_back('T'); + l_i2cdata.push_back('I'); + l_i2cdata.push_back('2'); + l_i2cdata.push_back('C'); + l_i2cdata.push_back('-'); + l_i2cdata.push_back('P'); + l_i2cdata.push_back('A'); + l_i2cdata.push_back('S'); + l_i2cdata.push_back('S'); + + FAPI_INF("Do putI2c on proc target"); + FAPI_TRY(fapi2::putI2c(i_target, + l_i2cdata)); + fapi_try_exit: +*/ + FAPI_INF("Exiting p9_i2ctest_puti2c_pass..."); + + return fapi2::current_err; +} + + +fapi2::ReturnCode p9_i2ctest_write_read_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + FAPI_INF("Entering p9_i2ctest_write_read_pass..."); +/* + std::vector<uint8_t> l_i2cdata; + std::vector<uint8_t> l_read_i2cdata; + std::vector<uint8_t> l_read_offset; + + const uint8_t l_data[] = {0xFE,0xD9, + 0x49,0x4E,0x56,0x41,0x4C,0x49,0x44,0x00,0x8C, + 0x49,0x4E,0x56,0x41,0x4C,0x49,0x44,0x00,0x8C, + 0x49,0x4E,0x56,0x41,0x4C,0x49,0x44,0x00,0x8C, + 0x49,0x4E,0x56,0x41,0x4C,0x49,0x44,0x00,0x8C}; + const size_t l_read_size = sizeof(l_data) - 2; + l_i2cdata.insert( l_i2cdata.end(), &l_data[0], &l_data[sizeof(l_data)] ); + l_read_offset.insert( l_read_offset.end(), &l_data[0], &l_data[2]); + + FAPI_INF("Calling putI2c on the target"); + FAPI_TRY(fapi2::putI2c(i_target, + l_i2cdata)); + + // now read it out and verify it was written correctly + FAPI_INF("Now read the just written data"); + FAPI_TRY(fapi2::getI2c(i_target, + l_read_size, + l_read_offset, + l_read_i2cdata)); + + // remove 2-byte address part at beginning + l_i2cdata.clear(); + l_i2cdata.insert( l_i2cdata.end(), &l_data[2], &l_data[sizeof(l_data)] ); + if (l_i2cdata == l_read_i2cdata) + { + FAPI_INF("Data found matches what was written"); + } + else + { + FAPI_ERR( "Data found (%d) does NOT match written values (%d)", + l_read_i2cdata.size(), l_i2cdata.size() ); + TRACFBIN(g_fapiTd, "getI2c returned", l_read_i2cdata.data(), l_read_i2cdata.size()); + TRACFBIN(g_fapiTd, "putI2c wrote", l_i2cdata.data(), l_i2cdata.size()); + } + + fapi_try_exit: +*/ + FAPI_INF("Exiting p9_i2ctest_write_read_pass..."); + + return fapi2::current_err; +} diff --git a/src/usr/fapi2/test/p9_i2ctests.H b/src/usr/fapi2/test/p9_i2ctests.H new file mode 100644 index 000000000..357c1a5a2 --- /dev/null +++ b/src/usr/fapi2/test/p9_i2ctests.H @@ -0,0 +1,55 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/fapi2/test/p9_i2ctests.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2018 */ +/* [+] 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 */ +//------------------------------------------------------------------------------ +/// @file p9_i2ctests.C +/// +/// @brief These procedures test the fapi2 i2c_access interfaces. +//------------------------------------------------------------------------------ +#ifndef _P9_I2CTESTS_H_ +#define _P9_I2CTESTS_H_ + +#include <fapi2.H> + +fapi2::ReturnCode p9_i2ctest_geti2c_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); + + +fapi2::ReturnCode p9_i2ctest_puti2c_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); + + +fapi2::ReturnCode p9_i2ctest_geti2c_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target); + +fapi2::ReturnCode p9_i2ctest_puti2c_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target); + +fapi2::ReturnCode p9_i2ctest_double_read_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target); + +fapi2::ReturnCode p9_i2ctest_write_read_pass( + fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target); + +#endif |