summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatt Derksen <mderkse1@us.ibm.com>2018-01-31 10:28:57 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-02-07 17:40:16 -0500
commitd5bdfe28f46fe9b68994b77212497c25bddcdc93 (patch)
treea776781b9c35bc7ca6abfae3c8e2725bbec71522 /src
parent975d6f745c830cb54cff7a2cf751d57b44db83c0 (diff)
downloadtalos-hostboot-d5bdfe28f46fe9b68994b77212497c25bddcdc93.tar.gz
talos-hostboot-d5bdfe28f46fe9b68994b77212497c25bddcdc93.zip
Initialize SBE message communication on HBRT start
Need to clear first 2 bits in CFAM register 0x283B. This basically resets our SBE communication stream just incase HBRT restarts after processing SBE interrupt. Clearing these bits tells the sender to resend the command. Change-Id: I1a1c5b80cc99414649d38c06b93428c87299f242 RTC:186334 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/53225 Reviewed-by: Martin Gloff <mgloff@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> Reviewed-by: Brian E. Bakke <bbakke@us.ibm.com> Reviewed-by: Roland Veloz <rveloz@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')
-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