From 0ab063c088f59890c409b7d00e0bf6afcf07dc16 Mon Sep 17 00:00:00 2001 From: Roland Veloz Date: Wed, 30 Aug 2017 17:32:48 -0500 Subject: [PATCH] Added code to send an Error Log to FSP via the firmware_request Change-Id: I6ce94d9cbf62fa7d2afe53b83b6bc5588a39a5d6 RTC:178947 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/45442 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Tested-by: Jenkins OP HW Reviewed-by: ILYA SMIRNOV Reviewed-by: Daniel M. Crowell --- src/include/runtime/interface.h | 20 +- src/usr/errl/runtime/rt_errlmanager.C | 80 ++++++-- .../pm/runtime/test/firmwareRequestTest.H | 185 ++++++++++++------ src/usr/testcore/rtloader/loader.H | 69 +++++-- 4 files changed, 264 insertions(+), 90 deletions(-) diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h index f3d67f69a1c..7fa1e86fb6b 100644 --- a/src/include/runtime/interface.h +++ b/src/include/runtime/interface.h @@ -502,6 +502,8 @@ typedef struct hostInterfaces HBRT_FW_MSG_TYPE_RESP_NOP = 1, HBRT_FW_MSG_TYPE_RESP_GENERIC = 2, HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE = 3, + HBRT_FW_MSG_HBRT_FSP = 4, + HBRT_FW_MSG_TYPE_ERROR_LOG = 5, }; struct hbrt_fw_msg // define struct hbrt_fw_msg @@ -524,14 +526,26 @@ typedef struct hostInterfaces struct { uint64_t i_chipId; // processor chip ID plus ID type, - // always proc (0x0) + // always proc (0x0) uint32_t i_section; // runtime section to update - // (passthru to pore_gen_scom) + // (passthru to pore_gen_scom) uint32_t i_operation; // type of operation to perform - // (passthru to pore_gen_scom) + // (passthru to pore_gen_scom) uint64_t i_scomAddr; // fully qualified scom address uint64_t i_scomData; // data for operation } req_hcode_update; + + // This struct is sent from HBRT with + // io_type set to HBRT_FW_MSG_TYPE_ERR_LOG + // Send an error log to FSP + struct + { + uint32_t i_plid; // platform log identifier + uint32_t i_errlSize; // data size in bytes + uint8_t i_data; // the error log data + // uint8_t *myData = + // (uint8_t*)&l_req_fw_msg->error_log.i_data; + } __attribute__ ((packed)) error_log; }; }; diff --git a/src/usr/errl/runtime/rt_errlmanager.C b/src/usr/errl/runtime/rt_errlmanager.C index f690fded5fd..cea88de640f 100644 --- a/src/usr/errl/runtime/rt_errlmanager.C +++ b/src/usr/errl/runtime/rt_errlmanager.C @@ -172,23 +172,76 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err ) INFO_MRK"Send msg to FSP for errlogId [0x%08x]", io_err->plid() ); - uint32_t l_msgSize = io_err->flattenedSize(); - uint8_t * temp_buff = new uint8_t [l_msgSize ]; - io_err->flatten ( temp_buff, l_msgSize ); - - if(g_hostInterfaces && g_hostInterfaces->sendErrorLog) + if(g_hostInterfaces) { - int rc = g_hostInterfaces->sendErrorLog(io_err->plid(), - l_msgSize, - temp_buff); + uint32_t l_msgSize = io_err->flattenedSize(); + if (g_hostInterfaces->sendErrorLog) + { + uint8_t * temp_buff = new uint8_t [l_msgSize ]; + io_err->flatten ( temp_buff, l_msgSize ); + + size_t rc = g_hostInterfaces->sendErrorLog(io_err->plid(), + l_msgSize, + temp_buff); + + if(rc) + { + TRACFCOMP(g_trac_errl, ERR_MRK + "Failed sending error log to FSP via " + "sendErrorLog. rc: %d. plid: 0x%08x", + rc, + io_err->plid() ); + } - if(rc) + delete [] temp_buff; + } + else if (g_hostInterfaces->firmware_request) + { + // Get an accurate size of memory actually + // needed to transport the data + size_t l_req_fw_msg_size = + hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(hostInterfaces::hbrt_fw_msg::error_log) + + l_msgSize; + + // Create the firmware_request structure + // to carry the error log data + hostInterfaces::hbrt_fw_msg *l_req_fw_msg = + (hostInterfaces::hbrt_fw_msg *)malloc(l_req_fw_msg_size); + + memset(l_req_fw_msg, 0, l_req_fw_msg_size); + + // Populate the firmware_request structure with given data + l_req_fw_msg->io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG; + l_req_fw_msg->error_log.i_plid = io_err->plid(); + l_req_fw_msg->error_log.i_errlSize = l_msgSize; + io_err->flatten (&(l_req_fw_msg->error_log.i_data), l_msgSize); + + hostInterfaces::hbrt_fw_msg l_resp_fw_msg; + uint64_t l_resp_fw_msg_size = sizeof(l_resp_fw_msg); + size_t rc = g_hostInterfaces-> + firmware_request(l_req_fw_msg_size, l_req_fw_msg, + &l_resp_fw_msg_size, &l_resp_fw_msg); + + if(rc) + { + TRACFCOMP(g_trac_errl, ERR_MRK + "Failed sending error log to FSP " + "via firmware_request. rc: %d. plid: 0x%08x", + rc, + io_err->plid() ); + } + + free(l_req_fw_msg); + } + else { TRACFCOMP(g_trac_errl, ERR_MRK - "Failed sending error log to FSP. rc: %d. " - "plid: 0x%08x", - rc, - io_err->plid() ); + "Host interfaces sendErrorLog and firmware_request " + "not initialized, error log not sent. plid: 0x%08x", + io_err->plid() + ); } } else @@ -199,7 +252,6 @@ void ErrlManager::sendMboxMsg ( errlHndl_t& io_err ) io_err->plid() ); } - delete [] temp_buff; #endif delete io_err; io_err = NULL; diff --git a/src/usr/isteps/pm/runtime/test/firmwareRequestTest.H b/src/usr/isteps/pm/runtime/test/firmwareRequestTest.H index 2ac57ddd58e..73ae4b0a2a3 100644 --- a/src/usr/isteps/pm/runtime/test/firmwareRequestTest.H +++ b/src/usr/isteps/pm/runtime/test/firmwareRequestTest.H @@ -32,63 +32,134 @@ class FirmwareRequestTest : public CxxTest::TestSuite { public: /** - * @brief: testFirmwareRequest - * tests that the firmware_request is being accessed properly + * @brief: testFirmwareRequestHcodeUpdate + * test the firmware_request's HCODE update call */ - void testFirmwareRequest (void) + void testFirmwareRequestHcodeUpdate (void) { - TRACFCOMP(g_trac_pnor, ENTER_MRK - "FirmwareRequestTest::testFirmwareRequest" ); - - if (g_hostInterfaces == NULL || - g_hostInterfaces->firmware_request == NULL) - { - TS_FAIL("FirmwareRequestTest::testFirmwareRequest: " - "Hypervisor firmware_request interface not linked"); - } - else - { - hostInterfaces::hbrt_fw_msg l_req_fw_msg; - l_req_fw_msg.io_type = - hostInterfaces::HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE; - l_req_fw_msg.req_hcode_update.i_chipId = 0; - l_req_fw_msg.req_hcode_update.i_section = 0; - l_req_fw_msg.req_hcode_update.i_operation = 0; - l_req_fw_msg.req_hcode_update.i_scomAddr = 0; - l_req_fw_msg.req_hcode_update.i_scomData = 0; - - - hostInterfaces::hbrt_fw_msg l_resp_fw_msg; - uint64_t l_resp_fw_msg_size = sizeof(l_resp_fw_msg); - int rc = g_hostInterfaces->firmware_request(sizeof(l_resp_fw_msg), - &l_req_fw_msg, &l_resp_fw_msg_size, &l_resp_fw_msg); - - TRACFCOMP(g_trac_pnor, "FirmwareRequestTest::testFirmwareRequest: " - "rc:%d, type:%d, resp:%d", - rc, l_resp_fw_msg.io_type, - l_resp_fw_msg.resp_generic.o_status); - - if (rc != 1) - { - TS_FAIL("FirmwareRequestTest::testFirmwareRequest: " - "firware_request failed - returned wrong value"); - } - - if (l_resp_fw_msg.io_type != + TRACFCOMP(g_trac_pnor, ENTER_MRK + "FirmwareRequestTest::testFirmwareRequestHcodeUpdate"); + + if (g_hostInterfaces == NULL || + g_hostInterfaces->firmware_request == NULL) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestHcodeUpdate: " + "Hypervisor firmware_request interface not linked"); + } + else + { + // Test HCODE Update + // populate the firmware_request structure with arbitrary data + hostInterfaces::hbrt_fw_msg l_req_fw_msg; + l_req_fw_msg.io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE; + l_req_fw_msg.req_hcode_update.i_chipId = 0x100; + l_req_fw_msg.req_hcode_update.i_section = 20; + l_req_fw_msg.req_hcode_update.i_operation = 30; + l_req_fw_msg.req_hcode_update.i_scomAddr = 0x400; + l_req_fw_msg.req_hcode_update.i_scomData = 0x500; + + + hostInterfaces::hbrt_fw_msg l_resp_fw_msg; + uint64_t l_resp_fw_msg_size = sizeof(l_resp_fw_msg); + size_t rc = g_hostInterfaces->firmware_request( + sizeof(l_req_fw_msg), &l_req_fw_msg, + &l_resp_fw_msg_size, &l_resp_fw_msg); + + TRACFCOMP(g_trac_pnor, + "FirmwareRequestTest::testFirmwareRequestHcodeUpdate: " + "rc:%d, type:%d, resp:%d", + rc, l_resp_fw_msg.io_type, + l_resp_fw_msg.resp_generic.o_status); + + if (rc != 1) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestHcodeUpdate: " + "firware_request - hcode update failed - " + "returned wrong value"); + } + + if (l_resp_fw_msg.io_type != + hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestHcodeUpdate: " + "firware_request - hcode update failed - " + "received incorrect msg_type"); + } + + if (l_resp_fw_msg.resp_generic.o_status != 264) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestHcodeUpdate: " + "firware_request - hcode update failed - " + "received incorrect resp"); + } + } // end else + TRACFCOMP(g_trac_pnor, EXIT_MRK + "FirmwareRequestTest::testFirmwareRequestHcodeUpdate"); + + } // end testFirmwareRequestHcodeUpdate + + /** + * @brief: testFirmwareRequestErrLogToFsp + * test the firmware_request's error log to FSP + */ + void testFirmwareRequestErrLogToFsp (void) + { + TRACFCOMP(g_trac_pnor, ENTER_MRK + "FirmwareRequestTest::testFirmwareRequestErrLogToFsp"); + + if (g_hostInterfaces == NULL || + g_hostInterfaces->firmware_request == NULL) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestErrLogToFsp: " + "Hypervisor firmware_request interface not linked"); + } + else + { + // Test error log to FSP + // populate the firmware_request structure with arbitrary data + hostInterfaces::hbrt_fw_msg l_req_fw_msg; + l_req_fw_msg.io_type =hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG; + l_req_fw_msg.error_log.i_plid = 0x300; + l_req_fw_msg.error_log.i_errlSize = 1; + l_req_fw_msg.error_log.i_data = 0xAA; + + hostInterfaces::hbrt_fw_msg l_resp_fw_msg; + uint64_t l_resp_fw_msg_size = sizeof(l_resp_fw_msg); + size_t rc = g_hostInterfaces->firmware_request( + sizeof(l_req_fw_msg), &l_req_fw_msg, + &l_resp_fw_msg_size, &l_resp_fw_msg); + + TRACFCOMP(g_trac_pnor, + "FirmwareRequestTest::testFirmwareRequestErrLogToFsp: " + "rc:%d, type:%d, resp:%d", + rc, l_resp_fw_msg.io_type, + l_resp_fw_msg.resp_generic.o_status); + + if (rc != 0) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestErrLogToFsp: " + "firware_request - error log failed - " + "returned wrong value"); + } + + if (l_resp_fw_msg.io_type != hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC) - { - TS_FAIL("FirmwareRequestTest::testFirmwareRequest: " - "firware_request failed - received incorrect msg_type"); - } - - if (l_resp_fw_msg.resp_generic.o_status != 264) - { - TS_FAIL("FirmwareRequestTest::testFirmwareRequest: " - "firware_request failed - received incorrect resp"); - } - - TRACFCOMP(g_trac_pnor, EXIT_MRK - "FirmwareRequestTest::testFirmwareRequest"); - } - } -}; + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestErrLogToFsp: " + "firware_request - error log failed - " + "received incorrect msg_type"); + } + + if (l_resp_fw_msg.resp_generic.o_status != 20) + { + TS_FAIL("FirmwareRequestTest::testFirmwareRequestErrLogToFsp: " + "firware_request - error log failed - " + "received incorrect resp"); + } + } // end else + TRACFCOMP(g_trac_pnor, EXIT_MRK + "FirmwareRequestTest::testFirmwareRequestErrLogToFsp"); + + } // end testFirmwareRequestErrLogToFsp +}; // end class FirmwareRequestTest diff --git a/src/usr/testcore/rtloader/loader.H b/src/usr/testcore/rtloader/loader.H index 214411029e1..97efc782fb5 100644 --- a/src/usr/testcore/rtloader/loader.H +++ b/src/usr/testcore/rtloader/loader.H @@ -724,14 +724,8 @@ class RuntimeLoaderTest : public CxxTest::TestSuite hostInterfaces::hbrt_fw_msg* l_resp_fw_msg = (hostInterfaces::hbrt_fw_msg*) o_resp; - if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_req_fw_msg->req_hcode_update))) - { - retVal = -EINVAL; - break; - } - if (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + if (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + sizeof(l_resp_fw_msg->resp_generic))) { retVal = -EINVAL; @@ -741,6 +735,13 @@ class RuntimeLoaderTest : public CxxTest::TestSuite if (hostInterfaces::HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE == l_req_fw_msg->io_type) { + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(l_req_fw_msg->req_hcode_update))) + { + retVal = -EINVAL; + break; + } + TRACFCOMP(g_trac_hbrt, ENTER_MRK "rt_firmware_request for HCODE SCOM update: " "type:%d, chipId:0x%X, section:%d, " @@ -751,6 +752,51 @@ class RuntimeLoaderTest : public CxxTest::TestSuite l_req_fw_msg->req_hcode_update.i_operation, l_req_fw_msg->req_hcode_update.i_scomAddr, l_req_fw_msg->req_hcode_update.i_scomData); + + l_resp_fw_msg->io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; + + // dummy return value for testing + l_resp_fw_msg->resp_generic.o_status = 264; + + TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_firmware_request"); + retVal = 1; // just return 1 for testing + } + else if (hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG + == l_req_fw_msg->io_type) + { + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(l_req_fw_msg->error_log))) + { + retVal = -EINVAL; + break; + } + + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(l_req_fw_msg->error_log) + + l_req_fw_msg->error_log.i_errlSize - 1)) + { + retVal = -EINVAL; + break; + } + + + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request for error log: " + "type:%d, plid:0x%08x, size:%d, data:0x%02x", + l_req_fw_msg->io_type, + l_req_fw_msg->error_log.i_plid, + l_req_fw_msg->error_log.i_errlSize, + l_req_fw_msg->error_log.i_data); + + l_resp_fw_msg->io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; + + // dummy return value for testing + l_resp_fw_msg->resp_generic.o_status = 20; + + TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_firmware_request"); + retVal = 0; // just return 0 for testing } else { @@ -758,15 +804,6 @@ class RuntimeLoaderTest : public CxxTest::TestSuite "rt_firmware_request an unrecognized request: " "type:%d", l_req_fw_msg->io_type); } - - l_resp_fw_msg->io_type = - hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; - // dummy return value for testing - l_resp_fw_msg->resp_generic.o_status = 264; - - TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_firmware_request"); - retVal = 1; // just return 1 for testing - } while (0) ; return retVal; }