/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/usr/isteps/expupd/test/expupdatetest.H $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2019 */ /* [+] 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 __EXPUPDATETEST_H #define __EXPUPDATETEST_H /** * @file expupdatetest.H * * @brief Test cases for explorer chip firmware update */ #include #include #include #include #include #include #include #include #include #ifndef __HOSTBOOT_RUNTIME #include // module_is_loaded & module_load #endif #include const char MSS_LIBRARY_NAME[] = "libisteps_mss.so"; const char EXPUPD_LIBRARY_NAME[] = "libexpupd.so"; /** * @brief Generic function to load a module * @param o_module_loaded - returns true if module is loaded by this function * @param i_modName - module name to load * @return error handle if module_load call fails */ errlHndl_t loadModule(bool & o_module_loaded, const char * i_modName) { errlHndl_t err = nullptr; o_module_loaded = false; // VFS functions only compilable in non-runtime environment #ifndef __HOSTBOOT_RUNTIME if(!VFS::module_is_loaded(i_modName)) { err = VFS::module_load(i_modName); if(err) { TS_FAIL("loadModule() - %s load failed", i_modName ); } else { o_module_loaded = true; TS_TRACE("loadModule: %s loaded", i_modName); } } #endif return err; } /** * @brief Generic function to unload a module * @param i_modName - module name to load * @return error handle if module_unload call fails */ errlHndl_t unloadModule(const char * i_modName) { errlHndl_t err = nullptr; // VFS function only compilable in non-runtime environment #ifndef __HOSTBOOT_RUNTIME err = VFS::module_unload(i_modName); if(err) { TS_FAIL("unloadExplorerModule() - %s unload failed", i_modName ); } else { TS_TRACE("unloadModule: %s unloaded", i_modName); } #endif return err; } class ExpUpdateTest: public CxxTest::TestSuite { public: /** * @brief Test the explorer firmware update procedure */ void testExpFwUpdate( void ) { errlHndl_t l_errl = nullptr; uint8_t l_dataBuffer[4096] = {0}; // Create a vector of TARGETING::Target pointers TARGETING::TargetHandleList l_chipList; // Get a list of all of the functioning ocmb chips TARGETING::getAllChips(l_chipList, TARGETING::TYPE_OCMB_CHIP, true); TARGETING::HB_MUTEX_SERIALIZE_TEST_LOCK_ATTR l_mutex = exptest::getTestMutex(); if (l_mutex == nullptr) { TS_FAIL("testExpFwUpdate: unable to get test mutex"); } else { for (const auto & l_ocmb: l_chipList) { fapi2::Targetl_fapi2_target(l_ocmb); // Inband operations can't be run at the same time // atomic section >> mutex_lock(l_mutex); // Invoke procedure FAPI_INVOKE_HWP(l_errl, exp_fw_update, l_fapi2_target, l_dataBuffer, sizeof(l_dataBuffer)); // << atomic section mutex_unlock(l_mutex); if (l_errl) { #if 0 // skipping exp_fw_update error until simics is changed - @fixme:RTC-209865 TS_FAIL("Error from exp_fw_update for 0x%.8X target", TARGETING::get_huid(l_ocmb)); #endif break; } } if (l_errl) { errlCommit(l_errl, CXXTEST_COMP_ID); } } TS_INFO("testExpFwUpdate: exiting"); }; /** * @brief Constructor */ ExpUpdateTest() : CxxTest::TestSuite() { mss_module_loaded = false; expupd_module_loaded = false; // All modules are loaded by runtime, // so testcase loading of modules is not required #ifndef __HOSTBOOT_RUNTIME errlHndl_t err = nullptr; err = loadModule(mss_module_loaded, MSS_LIBRARY_NAME); if(err) { TS_FAIL("ExpUpdateTest() - Constuctor: failed to load MSS module"); errlCommit( err, CXXTEST_COMP_ID ); } err = loadModule(expupd_module_loaded, EXPUPD_LIBRARY_NAME); if(err) { TS_FAIL("ExpUpdateTest() - Constuctor: failed to load EXPUPD module"); errlCommit( err, CXXTEST_COMP_ID ); } #endif }; /** * @brief Destructor */ ~ExpUpdateTest() { errlHndl_t err = nullptr; if (mss_module_loaded) { err = unloadModule(MSS_LIBRARY_NAME); if(err) { TS_FAIL("~ExpUpdateTest() - Destructor: failed to unload MSS module"); errlCommit( err, CXXTEST_COMP_ID ); } } if (expupd_module_loaded) { err = unloadModule(EXPUPD_LIBRARY_NAME); if(err) { TS_FAIL("~ExpUpdateTest() - Destructor: failed to unload EXPUPD module"); errlCommit( err, CXXTEST_COMP_ID ); } } }; private: // use this to keep track of if we need to unload any // modules loaded by this testcase bool mss_module_loaded; bool expupd_module_loaded; }; #endif