summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/runtime/interface.h6
-rw-r--r--src/include/usr/sbeio/runtime/sbe_msg_passing.H26
-rw-r--r--src/runtime/rt_main.C5
-rw-r--r--src/usr/sbeio/runtime/rt_sbeio.C167
-rw-r--r--src/usr/targeting/runtime/makefile3
-rw-r--r--src/usr/targeting/runtime/rt_startup.C110
6 files changed, 235 insertions, 82 deletions
diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h
index 2fa93a398..158e331dd 100644
--- a/src/include/runtime/interface.h
+++ b/src/include/runtime/interface.h
@@ -936,6 +936,12 @@ struct postInitCalls_t
*/
void (*callApplyTempOverrides)();
+ /**
+ * @brief Clear pending SBE messages
+ *
+ */
+ void (*callClearPendingSbeMsgs)();
+
};
extern hostInterfaces_t* g_hostInterfaces;
diff --git a/src/include/usr/sbeio/runtime/sbe_msg_passing.H b/src/include/usr/sbeio/runtime/sbe_msg_passing.H
index 53899d9f5..e50b4493e 100644
--- a/src/include/usr/sbeio/runtime/sbe_msg_passing.H
+++ b/src/include/usr/sbeio/runtime/sbe_msg_passing.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -168,6 +168,30 @@ namespace SBE_MSG
* @return int Return code.
*/
int eraseProcessCmdFunction(enum passThruCmds i_command);
+
+ //------------------------------------------------------------------------
+ // Constants for setting/clearing bits in SCOM_ADDR_5003B
+ //------------------------------------------------------------------------
+ const uint32_t SCOM_ADDR_5003B = 0x0005003B; // CFAM Reg 0x283B
+ const uint32_t SBE_MESSAGE_PROCESSING_IN_PROGRESS = 0x40000000;
+ const uint32_t SBE_MESSAGE_PROCESSING_COMPLETE = 0x80000000;
+
+ /**
+ * @brief SBE message update bit(s) in CFAM register
+ *
+ * @details This is a call that will update bit(s) in CFAM register 0x283B
+ * or SCOM_ADDR_5003B.
+ *
+ * @param[in] i_proc HB processor target
+ * @param[in] i_set_mask CFAM register mask (mark bits to set)
+ * @param[in] i_clear_mask CFAM register mask (mark bits to clear)
+ *
+ * @returns errlHndl_t NULL on success
+ */
+ errlHndl_t process_sbe_msg_update_cfam(TARGETING::TargetHandle_t i_proc,
+ const uint32_t i_set_mask,
+ const uint32_t i_clear_mask);
+
} // namespace SBE_MSG
diff --git a/src/runtime/rt_main.C b/src/runtime/rt_main.C
index d53901850..bb0d43d70 100644
--- a/src/runtime/rt_main.C
+++ b/src/runtime/rt_main.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2017 */
+/* Contributors Listed Below - COPYRIGHT 2013,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -132,6 +132,9 @@ runtimeInterfaces_t* rt_start(hostInterfaces_t* intf)
postInitCalls_t* rtPost = getPostInitCalls();
rtPost->callApplyTempOverrides();
+ // check for possible missed in-flight messages/interrupts
+ rtPost->callClearPendingSbeMsgs();
+
// do any version mismatch fixups
rt_version_fixup();
diff --git a/src/usr/sbeio/runtime/rt_sbeio.C b/src/usr/sbeio/runtime/rt_sbeio.C
index 30381c874..3adea4043 100644
--- a/src/usr/sbeio/runtime/rt_sbeio.C
+++ b/src/usr/sbeio/runtime/rt_sbeio.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017 */
+/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -57,80 +57,6 @@ namespace RT_SBEIO
// Map of process command functions for the pass-through commands
ProcessCmdMap_t g_processCmdMap;
- // Constants for setting bits in SCOM_ADDR_5003B
- const uint32_t SCOM_ADDR_5003B = 0x0005003B; // CFAM Reg 0x283B
- const uint32_t SBE_MESSAGE_PROCESSING_IN_PROGRESS = 0x40000000;
- const uint32_t SBE_MESSAGE_PROCESSING_COMPLETE = 0x80000000;
-
- //------------------------------------------------------------------------
-
- /**
- * @brief SBE message set bit(s) in CFAM register
- *
- * @details This is a call that will set bit(s) in CFAM register 0x283B
- * or SCOM_ADDR_5003B.
- *
- * @param[in] i_proc HB processor target
- * @param[in] i_set_mask CFAM register mask
- *
- * @returns errlHndl_t NULL on success
- */
- errlHndl_t process_sbe_msg_set_cfam(TargetHandle_t i_proc,
- const uint32_t i_set_mask)
- {
- errlHndl_t errl = nullptr;
-
- uint32_t l_read_reg = 0;
- size_t l_size = sizeof(uint64_t);
-
- do{
- // Read SCOM_ADDR_5003B for target proc
- errl = deviceRead(i_proc,
- &l_read_reg,
- l_size,
- DEVICE_SCOM_ADDRESS(SCOM_ADDR_5003B));
-
- if(errl)
- {
- TRACFCOMP(g_trac_sbeio, ERR_MRK"process_sbe_msg: read CFAM "
- "failed for target 0x%llX SCOM addr 0x%llX",
- get_huid(i_proc),
- SCOM_ADDR_5003B);
-
- errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_HIGH);
- errl->collectTrace(SBEIO_COMP_NAME);
-
- break;
- }
-
- // Set bit(s) in CFAM reg SCOM_ADDR_5003B based on mask
- l_read_reg |= i_set_mask;
-
- // Write SCOM_ADDR_5003B for target proc
- errl = deviceWrite(i_proc,
- &l_read_reg,
- l_size,
- DEVICE_SCOM_ADDRESS(SCOM_ADDR_5003B));
-
- if(errl)
- {
- TRACFCOMP(g_trac_sbeio, ERR_MRK"process_sbe_msg: write CFAM "
- "failed for target 0x%llX SCOM addr 0x%llX",
- get_huid(i_proc),
- SCOM_ADDR_5003B);
-
- errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_HIGH);
- errl->collectTrace(SBEIO_COMP_NAME);
-
- break;
- }
- }while(0);
-
- return errl;
- }
-
//------------------------------------------------------------------------
/**
@@ -624,8 +550,9 @@ namespace RT_SBEIO
// Set CFAM register - processing in progress
TRACFCOMP(g_trac_sbeio, "process_sbe_msg: set CFAM register - "
"processing in progress");
- errl = process_sbe_msg_set_cfam(l_proc,
- SBE_MESSAGE_PROCESSING_IN_PROGRESS);
+ errl = process_sbe_msg_update_cfam(l_proc,
+ SBE_MESSAGE_PROCESSING_IN_PROGRESS,
+ SBE_MESSAGE_PROCESSING_COMPLETE);
if(errl)
{
break;
@@ -702,8 +629,9 @@ namespace RT_SBEIO
// Set CFAM register - processing complete
TRACFCOMP(g_trac_sbeio, "process_sbe_msg: set CFAM register - "
"processing complete");
- errl = process_sbe_msg_set_cfam(l_proc,
- SBE_MESSAGE_PROCESSING_COMPLETE);
+ errl = process_sbe_msg_update_cfam(l_proc,
+ SBE_MESSAGE_PROCESSING_COMPLETE,
+ SBE_MESSAGE_PROCESSING_IN_PROGRESS);
if(errl)
{
break;
@@ -910,4 +838,85 @@ namespace SBE_MSG
return rc;
}
+
+
+ /**
+ * @brief SBE message update bit(s) in CFAM register
+ *
+ * @details This is a call that will update bit(s) in CFAM register 0x283B
+ * or SCOM_ADDR_5003B.
+ *
+ * @param[in] i_proc HB processor target
+ * @param[in] i_set_mask CFAM register mask (mark bits to set)
+ * @param[in] i_clear_mask CFAM register mask (mark bits to clear)
+ *
+ * @returns errlHndl_t NULL on success
+ */
+ errlHndl_t process_sbe_msg_update_cfam(TargetHandle_t i_proc,
+ const uint32_t i_set_mask,
+ const uint32_t i_clear_mask)
+ {
+ errlHndl_t errl = nullptr;
+
+
+ uint32_t l_read_reg = 0;
+ size_t l_size = sizeof(uint64_t);
+
+ do{
+ // Read SCOM_ADDR_5003B for target proc
+ errl = deviceRead(i_proc,
+ &l_read_reg,
+ l_size,
+ DEVICE_SCOM_ADDRESS(SCOM_ADDR_5003B));
+
+ if(errl)
+ {
+ TRACFCOMP(g_trac_sbeio, ERR_MRK"process_sbe_msg_update_cfam: "
+ "CFAM read failed for target 0x%llX SCOM addr 0x%llX",
+ get_huid(i_proc),
+ SCOM_ADDR_5003B);
+
+ errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_HIGH);
+ errl->collectTrace(SBEIO_COMP_NAME);
+
+ break;
+ }
+
+ TRACFCOMP(g_trac_sbeio, "process_sbe_msg_update_cfam: CFAM read "
+ "returned 0x%llX for target 0x%llX",
+ l_read_reg, get_huid(i_proc) );
+
+ // Set/clear bit(s) in CFAM reg SCOM_ADDR_5003B based on masks
+ l_read_reg |= i_set_mask;
+ l_read_reg &= (~i_clear_mask);
+
+ TRACFCOMP(g_trac_sbeio, "process_sbe_msg_update_cfam: "
+ "CFAM write 0x%llX to SCOM addr 0x%llX for target 0x%llX",
+ l_read_reg, SCOM_ADDR_5003B, get_huid(i_proc) );
+
+ // Write SCOM_ADDR_5003B for target proc
+ errl = deviceWrite(i_proc,
+ &l_read_reg,
+ l_size,
+ DEVICE_SCOM_ADDRESS(SCOM_ADDR_5003B));
+
+ if(errl)
+ {
+ TRACFCOMP(g_trac_sbeio, ERR_MRK"process_sbe_msg_update_cfam: "
+ "write CFAM failed for target 0x%llX SCOM addr 0x%llX",
+ get_huid(i_proc),
+ SCOM_ADDR_5003B);
+
+ errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_HIGH);
+ errl->collectTrace(SBEIO_COMP_NAME);
+
+ break;
+ }
+ }while(0);
+
+ return errl;
+ }
+
} // namespace SBE_MSG
diff --git a/src/usr/targeting/runtime/makefile b/src/usr/targeting/runtime/makefile
index c2279f8b2..ffb2e8a14 100644
--- a/src/usr/targeting/runtime/makefile
+++ b/src/usr/targeting/runtime/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2013,2017
+# Contributors Listed Below - COPYRIGHT 2013,2018
# [+] International Business Machines Corp.
#
#
@@ -41,6 +41,7 @@ HOSTBOOT_RUNTIME_SPECIFIC_OBJS += attrPlatOverride_rt.o
HOSTBOOT_RUNTIME_SPECIFIC_OBJS += errludattribute.o
HOSTBOOT_RUNTIME_SPECIFIC_OBJS += attributestrings.o
HOSTBOOT_RUNTIME_SPECIFIC_OBJS += attrsync.o
+HOSTBOOT_RUNTIME_SPECIFIC_OBJS += rt_startup.o
OBJS += ${COMMON_TARGETING_OBJS}
OBJS += ${HOSTBOOT_RT_IPL_COMMON_OBJS}
diff --git a/src/usr/targeting/runtime/rt_startup.C b/src/usr/targeting/runtime/rt_startup.C
new file mode 100644
index 000000000..578750006
--- /dev/null
+++ b/src/usr/targeting/runtime/rt_startup.C
@@ -0,0 +1,110 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/targeting/runtime/rt_startup.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 */
+#include <runtime/rt_targeting.H>
+#include <runtime/interface.h>
+#include <targeting/common/target.H>
+#include <targeting/common/targetservice.H>
+#include <targeting/common/trace.H>
+#include <targeting/common/utilFilter.H>
+#include <sbeio/runtime/sbe_msg_passing.H>
+#include <sbeio/sbeioreasoncodes.H>
+
+
+using namespace TARGETING;
+
+namespace RT_TARG
+{
+
+void clearPendingSbeMsgs()
+{
+ TRACFCOMP(g_trac_targeting, ENTER_MRK"clearPendingSbeMsgs");
+ errlHndl_t l_errl = nullptr;
+ do
+ {
+ //get runtime interfaces
+ runtimeInterfaces_t* l_rt = getRuntimeInterfaces();
+ if(nullptr == l_rt)
+ {
+ TRACFCOMP(g_trac_targeting,"clearPendingSbeMsgs: "
+ "Unable to get runtime interfaces.");
+ break;
+ }
+ else if(not l_rt->sbe_message_passing)
+ {
+ TRACFCOMP(g_trac_targeting,"clearPendingSbeMsgs: "
+ "sbe_message_passing runtime interface "
+ "has not been set.");
+ break;
+ }
+
+ TARGETING::TargetHandleList l_procList;
+ getAllChips(l_procList, TARGETING::TYPE_PROC, true);
+
+ if(0 == l_procList.size())
+ {
+ TRACFCOMP(g_trac_targeting,"clearPendingSbeMsgs: "
+ "Unable to get proc targets."
+ );
+ break;
+ }
+
+ for( const auto & l_procTarget : l_procList )
+ {
+ // clear out the two bits for this processor target
+ l_errl = SBE_MSG::process_sbe_msg_update_cfam( l_procTarget, 0x0,
+ (SBE_MSG::SBE_MESSAGE_PROCESSING_IN_PROGRESS |
+ SBE_MSG::SBE_MESSAGE_PROCESSING_COMPLETE) );
+
+ if (l_errl)
+ {
+ TRACFCOMP(g_trac_targeting,ERR_MRK"clearPendingSbeMsgs: "
+ "Failed to clear bits for processor 0x%04X, "
+ "EID %.8X:%.4X", TARGETING::get_huid(l_procTarget),
+ ERRL_GETEID_SAFE(l_errl),
+ ERRL_GETRC_SAFE(l_errl) );
+ errlCommit (l_errl, SBE_COMP_ID);
+ }
+ }
+ }
+ while(0);
+
+ TRACFCOMP(g_trac_targeting, EXIT_MRK"clearPendingSbeMsgs");
+}
+
+ //------------------------------------------------------------------------
+
+ struct registerRtStartup
+ {
+ registerRtStartup()
+ {
+ // Register interface for Host to call
+ postInitCalls_t * rt_post = getPostInitCalls();
+ rt_post->callClearPendingSbeMsgs = &clearPendingSbeMsgs;
+ }
+ };
+
+ registerRtStartup g_registerRtStartup;
+
+}; // End namespace RT_TARG
OpenPOWER on IntegriCloud