summaryrefslogtreecommitdiffstats
path: root/src/usr/scom/runtime
diff options
context:
space:
mode:
authorChristian Geddes <crgeddes@us.ibm.com>2018-01-29 14:49:19 -0600
committerChristian R. Geddes <crgeddes@us.ibm.com>2018-02-17 16:26:17 -0500
commitb542fd6392999e7d521c5dff5a2a2add056db984 (patch)
tree9e3c9ff1d9c7e902afd65a3cfde7676da795db5f /src/usr/scom/runtime
parente7c2ef327998d6ab868776cdc2c2bb7592b8c17e (diff)
downloadtalos-hostboot-b542fd6392999e7d521c5dff5a2a2add056db984.tar.gz
talos-hostboot-b542fd6392999e7d521c5dff5a2a2add056db984.zip
Enable platSpecialWakeup during IPL time and add support
Previously we only supported platSpecialWakeup at runtime because we were not worried about needed special wakeup as the cores would not go into stop state during the IPL. However, now PM code is expecting bits to be set by the p9 special wakeup hwp so we need to call it during the IPL. This code makes the handleSpecialWakeup.C/H files compatible with IPL time build environment and enables the call on the IPL time path CQ: SW415949 Change-Id: I94cca8a84946bea464b21cb95cdbbb075f766c3d Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/52858 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: Christian R. Geddes <crgeddes@us.ibm.com> Tested-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/usr/scom/runtime')
-rw-r--r--src/usr/scom/runtime/handleSpecialWakeup.C309
-rw-r--r--src/usr/scom/runtime/handleSpecialWakeup.H45
-rw-r--r--src/usr/scom/runtime/makefile9
3 files changed, 1 insertions, 362 deletions
diff --git a/src/usr/scom/runtime/handleSpecialWakeup.C b/src/usr/scom/runtime/handleSpecialWakeup.C
deleted file mode 100644
index 0827c7054..000000000
--- a/src/usr/scom/runtime/handleSpecialWakeup.C
+++ /dev/null
@@ -1,309 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/scom/runtime/handleSpecialWakeup.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
-/* [+] 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 <stdint.h>
-#include <errl/errlentry.H>
-#include <errl/errlmanager.H>
-#include <errl/errludtarget.H>
-#include <trace/interface.H>
-
-#include <targeting/common/commontargeting.H>
-#include <targeting/common/targetservice.H>
-#include <targeting/common/utilFilter.H>
-#include <targeting/common/util.H>
-
-#include <scom/scomreasoncodes.H>
-#include <initservice/initserviceif.H>
-#include <runtime/rt_targeting.H>
-#include <runtime/interface.h>
-
-#include <fapi2/plat_hwp_invoker.H>
-#include <p9_cpu_special_wakeup.H>
-
-extern "C"
-{
-
-// Trace definition
-extern trace_desc_t* g_trac_scom;
-
-using namespace TARGETING;
-using namespace SCOM;
-
-/**
- * @brief Enable and disable special wakeup for SCOM operations
- * FSP: Call the Host interface wakeup function for all core
- * targets under the specified target, HOST wakeup bit is used
- * BMC: Call the wakeup HWP for the target type specified (EQ/EX/CORE),
- * Proc type calls the HWP for all cores, FSP wakeup bit is used
- */
-errlHndl_t handleSpecialWakeup(TARGETING::Target* i_target, bool i_enable)
-{
- errlHndl_t l_errl = NULL;
-
- TARGETING::TYPE l_type = i_target->getAttr<TARGETING::ATTR_TYPE>();
-
- // FSP
- if(INITSERVICE::spBaseServicesEnabled())
- {
- // Check for valid interface function
- if( g_hostInterfaces == NULL ||
- g_hostInterfaces->wakeup == NULL )
- {
- TRACFCOMP( g_trac_scom,
- ERR_MRK"Hypervisor wakeup interface not linked");
-
- /*@
- * @errortype
- * @moduleid SCOM_HANDLE_SPECIAL_WAKEUP
- * @reasoncode SCOM_RUNTIME_INTERFACE_ERR
- * @userdata1 Target HUID
- * @userdata2 Wakeup Enable
- * @devdesc Wakeup runtime interface not linked.
- */
- l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_INFORMATIONAL,
- SCOM_HANDLE_SPECIAL_WAKEUP,
- SCOM_RUNTIME_INTERFACE_ERR,
- get_huid(i_target),
- i_enable);
-
- l_errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_HIGH);
-
- return l_errl;
- }
-
- TargetHandleList pCoreList;
-
- // If the target is already a core just push it on the list
- if(l_type == TARGETING::TYPE_CORE)
- {
- pCoreList.clear();
- pCoreList.push_back(i_target);
- }
- else
- {
- getChildChiplets( pCoreList, i_target, TARGETING::TYPE_CORE );
- }
-
- // Call wakeup on all core targets
- // Wakeup may be called twice for fused cores
- for ( auto pCore_it = pCoreList.begin();
- pCore_it != pCoreList.end();
- ++pCore_it )
- {
- // Runtime target id
- RT_TARG::rtChipId_t rtTargetId = 0;
- l_errl = RT_TARG::getRtTarget(*pCore_it, rtTargetId);
- if(l_errl)
- {
- break;
- }
-
- uint32_t mode;
- if(i_enable)
- {
- mode = HBRT_WKUP_FORCE_AWAKE;
- }
- else
- {
- mode = HBRT_WKUP_CLEAR_FORCE;
- }
-
- // Do the special wakeup
- int l_rc = g_hostInterfaces->wakeup(rtTargetId,mode);
-
- if(l_rc)
- {
- TRACFCOMP( g_trac_scom,ERR_MRK
- "Hypervisor wakeup failed. "
- "rc 0x%X target_huid 0x%llX rt_target_id 0x%llX mode %d",
- l_rc, get_huid(*pCore_it), rtTargetId, mode );
-
- // convert rc to error log
- /*@
- * @errortype
- * @moduleid SCOM_HANDLE_SPECIAL_WAKEUP
- * @reasoncode SCOM_RUNTIME_WAKEUP_ERR
- * @userdata1 Hypervisor return code
- * @userdata2[0:31] Runtime Target ID
- * @userdata2[32:63] Wakeup Mode
- * @devdesc Hypervisor wakeup failed.
- */
- l_errl = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_INFORMATIONAL,
- SCOM_HANDLE_SPECIAL_WAKEUP,
- SCOM_RUNTIME_WAKEUP_ERR,
- l_rc,
- TWO_UINT32_TO_UINT64(
- rtTargetId, mode));
-
- l_errl->addHwCallout(i_target,
- HWAS::SRCI_PRIORITY_LOW,
- HWAS::NO_DECONFIG,
- HWAS::GARD_NULL);
-
- break;
- }
- }
- }
-
- // BMC
- else
- {
- if(l_type == TARGETING::TYPE_PROC)
- {
- // Call wakeup on all core targets
- TargetHandleList pCoreList;
- getChildChiplets( pCoreList, i_target, TARGETING::TYPE_CORE );
-
- for ( auto pCore_it = pCoreList.begin();
- pCore_it != pCoreList.end();
- ++pCore_it )
- {
- // To simplify, just call recursively with the core target
- l_errl = handleSpecialWakeup(*pCore_it, i_enable);
- if(l_errl)
- {
- break;
- }
- }
- return l_errl;
- }
-
- // Need to handle multiple calls to enable special wakeup
- // Count attribute will keep track and disable when zero
- // Assume HBRT is single-threaded, so no issues with concurrency
- uint32_t l_count = (i_target)->getAttr<ATTR_SPCWKUP_COUNT>();
-
- if((l_count==0) && !i_enable)
- {
- TRACFCOMP( g_trac_scom,ERR_MRK
- "Disabling special wakeup on target with SPCWKUP_COUNT=0");
-
- /*@
- * @errortype
- * @moduleid SCOM_HANDLE_SPECIAL_WAKEUP
- * @reasoncode SCOM_RUNTIME_SPCWKUP_COUNT_ERR
- * @userdata1 Target HUID
- * @userdata2[0:31] Wakeup Enable
- * @userdata2[32:63] Wakeup Count
- * @devdesc Disabling special wakeup when not enabled.
- */
- l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_INFORMATIONAL,
- SCOM_HANDLE_SPECIAL_WAKEUP,
- SCOM_RUNTIME_SPCWKUP_COUNT_ERR,
- get_huid(i_target),
- TWO_UINT32_TO_UINT64(
- i_enable, l_count));
-
- l_errl->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_LOW);
-
- errlCommit( l_errl, RUNTIME_COMP_ID );
- }
-
- // Only call the HWP if 0-->1 or 1-->0
- if( ((l_count==0) && i_enable) ||
- ((l_count==1) && !i_enable) )
- {
- // NOTE Regarding the entity type passed to the HWP:
- // There are 3 independent registers used to trigger a
- // special wakeup (FSP,HOST,OCC), we are using the FSP
- // bit because HOST/OCC are already in use.
-
- p9specialWakeup::PROC_SPCWKUP_OPS l_spcwkupType;
- if(i_enable)
- {
- l_spcwkupType = p9specialWakeup::SPCWKUP_ENABLE;
- }
- else
- {
- l_spcwkupType = p9specialWakeup::SPCWKUP_DISABLE;
- }
-
- if(l_type == TARGETING::TYPE_EQ)
- {
- fapi2::Target<fapi2::TARGET_TYPE_EQ>
- l_fapi_target(const_cast<TARGETING::Target*>(i_target));
-
- FAPI_INVOKE_HWP( l_errl,
- p9_cpu_special_wakeup_eq,
- l_fapi_target,
- l_spcwkupType,
- p9specialWakeup::FSP );
- }
- else if(l_type == TARGETING::TYPE_EX)
- {
- fapi2::Target<fapi2::TARGET_TYPE_EX_CHIPLET>
- l_fapi_target(const_cast<TARGETING::Target*>(i_target));
-
- FAPI_INVOKE_HWP( l_errl,
- p9_cpu_special_wakeup_ex,
- l_fapi_target,
- l_spcwkupType,
- p9specialWakeup::FSP );
- }
- else if(l_type == TARGETING::TYPE_CORE)
- {
- fapi2::Target<fapi2::TARGET_TYPE_CORE>
- l_fapi_target(const_cast<TARGETING::Target*>(i_target));
-
- FAPI_INVOKE_HWP( l_errl,
- p9_cpu_special_wakeup_core,
- l_fapi_target,
- l_spcwkupType,
- p9specialWakeup::FSP );
- }
-
- if(l_errl)
- {
- TRACFCOMP( g_trac_scom,
- "p9_cpu_special_wakeup ERROR :"
- " Returning errorlog, reason=0x%x",
- l_errl->reasonCode() );
-
- // Capture the target data in the elog
- ERRORLOG::ErrlUserDetailsTarget(i_target).addToLog( l_errl );
- }
- }
-
- // Update the counter
- if(!l_errl)
- {
- if(i_enable)
- {
- l_count++;
- }
- else
- {
- l_count--;
- }
- i_target->setAttr<ATTR_SPCWKUP_COUNT>(l_count);
- }
- }
-
- return l_errl;
-}
-
-}
diff --git a/src/usr/scom/runtime/handleSpecialWakeup.H b/src/usr/scom/runtime/handleSpecialWakeup.H
deleted file mode 100644
index 43d05f246..000000000
--- a/src/usr/scom/runtime/handleSpecialWakeup.H
+++ /dev/null
@@ -1,45 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/scom/runtime/handleSpecialWakeup.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
-/* [+] 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 */
-#ifndef __HANDLESPECIALWAKEUP_H
-#define __HANDLESPECIALWAKEUP_H
-
-#include <stdint.h>
-
-extern "C"
-{
-/**
- * @brief This function handles the enable and disable of the special
- * wakeup that allows scom operations on idle cores.
- *
- * @param[in] i_target - EQ/EX/Core target
- * @param[in] i_enable - enable (true), disable (false)
- *
- * @return errlHndl_t - error handle
- */
-errlHndl_t handleSpecialWakeup(TARGETING::Target* i_target, bool i_enable);
-
-}
-
-#endif
diff --git a/src/usr/scom/runtime/makefile b/src/usr/scom/runtime/makefile
index b7ae2cfac..af572116b 100644
--- a/src/usr/scom/runtime/makefile
+++ b/src/usr/scom/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.
#
#
@@ -29,14 +29,7 @@ MODULE = scom_rt
#include common ojects between hostboot and runtime hostboot
include ../scom.mk
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/pm/
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/utils/imageProcs/
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/
-EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc/
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2/
-
#include unique object modules - currently none
-OBJS += handleSpecialWakeup.o
SUBDIRS += test.d
OpenPOWER on IntegriCloud