summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/runtime/interface.h20
-rw-r--r--src/usr/errl/runtime/rt_errlmanager.C80
-rw-r--r--src/usr/isteps/pm/runtime/test/firmwareRequestTest.H185
-rw-r--r--src/usr/testcore/rtloader/loader.H69
4 files changed, 264 insertions, 90 deletions
diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h
index f3d67f69a..7fa1e86fb 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 f690fded5..cea88de64 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 2ac57ddd5..73ae4b0a2 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 214411029..97efc782f 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;
}
OpenPOWER on IntegriCloud