diff options
-rw-r--r-- | src/include/runtime/interface.h | 6 | ||||
-rw-r--r-- | src/include/usr/sbeio/runtime/sbe_msg_passing.H | 26 | ||||
-rw-r--r-- | src/runtime/rt_main.C | 5 | ||||
-rw-r--r-- | src/usr/sbeio/runtime/rt_sbeio.C | 167 | ||||
-rw-r--r-- | src/usr/targeting/runtime/makefile | 3 | ||||
-rw-r--r-- | src/usr/targeting/runtime/rt_startup.C | 110 |
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 |