Skip to content

Commit

Permalink
Deconfig EC/EX/EQ at runtime
Browse files Browse the repository at this point in the history
Applied the normal parent/child rules for EC/EX/EQ logic to be done in
the runtime deconfig logic.

After applying the deconfig logic, then reset the PM for the parent
proc of the EX/EX/EQ.

To facilitate the code changes, modified the return value of the
TARGETING::getParent(...) call.  It no longer returns a const * Target,
considering 5 times out of 7 of it's usage, users were just
staic_cast(ing) away the const.

Clear out the HB reset attribute in the mpipl path.

Modify PRD logic to use runtime deconfig call in malfunction alert
path.

CMVC-Prereq: 1066157
Change-Id: If81f2f15c6e84bf2adb6fd66c1321b8f1ddf1a86
CQ: SW443157
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/64873
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>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Roland Veloz <rveloz@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
velozr authored and dcrowell77 committed Aug 30, 2018
1 parent 1dd6d76 commit c8448c3
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 78 deletions.
8 changes: 4 additions & 4 deletions src/include/usr/hwas/common/deconfigGard.H
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ public:
*
* NOTE: Currently only core targets are supported
*
* @param[in] i_pTarget const pointer to the core target to deconfigure
* @param[in] i_pTarget pointer to the target to deconfigure
* @param[in] i_deconfigureAction Deconfigure options -
* FULLY_AT_RUNTIME
* @param[in] i_deconfigErrl - error log assocated with this deconfig
Expand All @@ -500,7 +500,7 @@ public:
* @return errlHndl_t. Error log handle.
*/
errlHndl_t deconfigureTargetAtRuntime(
TARGETING::ConstTargetHandle_t const i_pTarget,
TARGETING::TargetHandle_t i_pTarget,
const DeconfigureFlags i_deconfigureAction,
const errlHndl_t i_deconfigErrl);

Expand All @@ -515,7 +515,7 @@ public:
* child targets. Any errors deconfiguring targets are committed and
* the function continues. The only errors returned are usage errors.
*
* @param[in] i_pTarget const pointer to Target to deconfigure.
* @param[in] i_pTarget pointer to Target to deconfigure.
* @param[in] i_deconfigureAction Deconfigure options -
* FULLY_AT_RUNTIME
* @param[in] i_deconfigErrl - error log assocated with this deconfig
Expand All @@ -529,7 +529,7 @@ public:

#ifdef __HOSTBOOT_RUNTIME
errlHndl_t platDeconfigureTargetAtRuntime(
TARGETING::ConstTargetHandle_t const i_pTarget,
TARGETING::TargetHandle_t i_pTarget,
const DeconfigureFlags i_deconfigureAction,
const errlHndl_t i_deconfigErrl);
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/include/usr/targeting/common/utilFilter.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2016 */
/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -300,7 +300,7 @@ const Target * getParentChip( const Target * i_pChiplet );
*
* @return Parent target pointer or NULL if error
*/
const Target * getParent( const Target * i_unit , TARGETING::TYPE &i_pType);
Target * getParent( const Target * i_unit , TARGETING::TYPE &i_pType);

/**
* @brief return the EX target of the specified input core chiplet
Expand Down
7 changes: 4 additions & 3 deletions src/usr/diag/prdf/plat/p9/prdfP9PmRecovery.C
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ int32_t pmRecovery( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
// Get the Global Errorlog PLID and EID
errlHndl_t globalErrl =
ServiceGeneratorClass::ThisServiceGenerator().getErrl();
uint32_t eid = globalErrl->eid();
uint32_t plid = globalErrl->plid();

// Runtime deconfig lost cores
Expand All @@ -86,8 +85,10 @@ int32_t pmRecovery( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )

// Call Deconfig
errlHndl_t errl = nullptr;
errl = HWAS::theDeconfigGard().deconfigureTarget( *coreTgt, eid,
NULL, HWAS::DeconfigGard::FULLY_AT_RUNTIME );
errl = HWAS::theDeconfigGard().deconfigureTargetAtRuntime(
coreTgt,
HWAS::DeconfigGard::FULLY_AT_RUNTIME,
globalErrl );

if (errl)
{
Expand Down
2 changes: 2 additions & 0 deletions src/usr/errl/runtime/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/include

## support for pm_common
EXTRAINCDIR += ${ROOTPATH}/src/usr/isteps

# need find the source for this hwp in runtime env
VPATH += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/pm
Expand Down
17 changes: 13 additions & 4 deletions src/usr/hwas/common/deconfigGard.C
Original file line number Diff line number Diff line change
Expand Up @@ -1640,15 +1640,24 @@ void DeconfigGard::_deconfigureByAssoc(
_deconfigureByAssoc(*pChild, i_errlEid, i_deconfigRule);
} // for CHILD

if ((i_deconfigRule == NOT_AT_RUNTIME)||
(i_deconfigRule == SPEC_DECONFIG))
// Retrieve the target type from the given target
TYPE l_targetType = i_target.getAttr<ATTR_TYPE>();

if ((i_deconfigRule == NOT_AT_RUNTIME) ||
(i_deconfigRule == SPEC_DECONFIG) ||
(l_targetType == TYPE_EQ) ||
(l_targetType == TYPE_EX) ||
(l_targetType == TYPE_CORE))
{
// if the rule is NOT_AT_RUNTIME and we got here, then we are
// not at runtime.
// only do these 'by association' checks if we are NOT at runtime
// reason is, we're not really deconfigureing anything, we're just
// marking them as non-functional. we only want to do that for the
// desired target and it's CHILD
// Except for target EQ, EX, CORE. Deconfigure these regardless of the
// runtime status


// find all CHILD_BY_AFFINITY targets and deconfigure them
targetService().getAssociated(pChildList, &i_target,
Expand All @@ -1673,7 +1682,7 @@ void DeconfigGard::_deconfigureByAssoc(
// chip (TYPE_EQ, TYPE_EX, TYPE_CORE)
// deconfigureByAssociation rules

switch (i_target.getAttr<ATTR_TYPE>())
switch (l_targetType)
{
case TYPE_CORE:
{
Expand Down Expand Up @@ -3069,7 +3078,7 @@ bool DeconfigGard::anyChildFCO (Target & i_parent)
// deconfigureTargetAtRuntime
/******************************************************************************/
errlHndl_t DeconfigGard::deconfigureTargetAtRuntime(
TARGETING::ConstTargetHandle_t const i_pTarget,
TARGETING::TargetHandle_t i_pTarget,
const DeconfigGard::DeconfigureFlags i_deconfigureAction,
const errlHndl_t i_deconfigErrl)

Expand Down
9 changes: 3 additions & 6 deletions src/usr/hwas/common/hwas.C
Original file line number Diff line number Diff line change
Expand Up @@ -1500,8 +1500,7 @@ bool isDescFunctional(const TARGETING::TargetHandle_t &i_desc,
if (i_desc->getAttr<ATTR_TYPE>() == TYPE_OBUS_BRICK)
{
auto obusType = TARGETING::TYPE_OBUS;
TARGETING::Target* l_obus_ptr = const_cast<TARGETING::Target*>(
getParent(i_desc, obusType));
TARGETING::Target* l_obus_ptr = getParent(i_desc, obusType);

//If NPU is bad and OBUS is non-SMP, then mark them bad
// Bit does not matter unless not in SMP mode
Expand Down Expand Up @@ -1590,8 +1589,7 @@ void forceEcExEqDeconfig(const TARGETING::TargetHandle_t i_core,
auto exType = TARGETING::TYPE_EX;
auto eqType = TARGETING::TYPE_EQ;

TARGETING::Target* l_ex = const_cast<TARGETING::Target*>(
getParent(i_core, exType));
TARGETING::Target* l_ex = getParent(i_core, exType);
getChildChiplets(pECList, l_ex, TYPE_CORE, true);
if(pECList.size() == 0)
{
Expand All @@ -1600,8 +1598,7 @@ void forceEcExEqDeconfig(const TARGETING::TargetHandle_t i_core,
l_ex->getAttr<ATTR_HUID>(), i_present ? "" : "NOT ");

//Now get the parent EQ and check to see if it should be deconfigured
TARGETING::Target* l_eq = const_cast<TARGETING::Target*>(
getParent(l_ex, eqType));
TARGETING::Target* l_eq = getParent(l_ex, eqType);
getChildChiplets(pEXList, l_eq, TYPE_EX, true);
if(pEXList.size() == 0)
{
Expand Down
123 changes: 92 additions & 31 deletions src/usr/hwas/hwasPlatDeconfigGard.C
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
#include <initservice/initserviceif.H>

#include <pnor/pnorif.H>
#include <pm/pm_common.H> // HBPM::resetPMComplex

#ifdef __HOSTBOOT_RUNTIME
#include <runtime/interface.h> // g_hostInterfaces
Expand Down Expand Up @@ -733,7 +734,7 @@ errlHndl_t hwasError(const uint8_t i_sev,
// platDeconfigureTargetAtRuntime
/******************************************************************************/
errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
TARGETING::ConstTargetHandle_t const i_pTarget,
TARGETING::TargetHandle_t i_pTarget,
const DeconfigureFlags i_deconfigureAction,
const errlHndl_t i_deconfigErrl)
{
Expand Down Expand Up @@ -762,16 +763,23 @@ errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
break;
}

if(i_pTarget->getAttr<TARGETING::ATTR_TYPE>() !=
TARGETING::TYPE_CORE)
// Retrieve the target type from the given target
TYPE l_targetType = i_pTarget->getAttr<ATTR_TYPE>();

// Make sure we are only working with the following types
if( (l_targetType != TYPE_EQ) &&
(l_targetType != TYPE_EX) &&
(l_targetType != TYPE_CORE) )
{
HWAS_ERR("Caller passed invalid type: 0x%08X", l_targetType);

// only supporting cores
/*@
* @errortype
* @moduleid MOD_RUNTIME_DECONFIG
* @reasoncode RC_INVALID_TARGET
* @devdesc Target is not a TYPE_CORE
* userdata1 target huid
* @devdesc Target is neiter TYPE_EQ, TYPE_EX nor TYPE_CORE
* @userdata1 target huid
* @custdesc Host Firmware encountered an internal
* error
*/
Expand All @@ -786,7 +794,7 @@ errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
{
case DeconfigGard::FULLY_AT_RUNTIME:

HWAS_INF(" Deconfig action FULLY_AT_RUNTIME :0x%08X",
HWAS_INF("Deconfig action FULLY_AT_RUNTIME :0x%08X",
DeconfigGard::FULLY_AT_RUNTIME);

break;
Expand All @@ -813,10 +821,12 @@ errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
break;
}

}while(0);
// If an error then exit while loop
if (l_errl)
{
break;
}

if(l_errl == nullptr)
{
uint32_t l_deconfigReason = (i_deconfigErrl) ? i_deconfigErrl->eid() :
DeconfigGard::DECONFIGURED_BY_PRD;

Expand All @@ -826,7 +836,6 @@ errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
get_huid(i_pTarget),i_deconfigureAction,
l_deconfigReason);


bool l_isTargetDeconfigured = false;
// deconfigureTarget() checks for targets that can be deconfigured at
// runtime
Expand All @@ -836,38 +845,90 @@ errlHndl_t DeconfigGard::platDeconfigureTargetAtRuntime(
&l_isTargetDeconfigured,
i_deconfigureAction);

if(l_errl == nullptr && l_isTargetDeconfigured)
// If there was an error OR the target was not deconfigured, then
// do not continue and exit
if (l_errl || !l_isTargetDeconfigured)
{
HWAS_INF("platDeconfigureTargetAtRuntime() - "
"deconfigure successful");
HWAS_INF("platDeconfigureTargetAtRuntime() - deconfigure failed");
break;
}

HWAS_INF("platDeconfigureTargetAtRuntime() - "
"deconfigure successful");

TARGETING::TYPE l_type = TARGETING::TYPE_PROC;
const TARGETING::Target * l_parent =
TARGETING::getParent(i_pTarget,l_type);
// get the parent proc and call the hwp to alert
// pm not to attempt to manage this core anymore
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_proc(const_cast<TARGETING::Target *>(l_parent));
TARGETING::TYPE l_type = TARGETING::TYPE_PROC;
TARGETING::Target * l_parent =
TARGETING::getParent(i_pTarget,l_type);

HWAS_INF("platDeconfigureTargetAtRuntime() - "
"calling p9_update_ec_eq_state");
FAPI_INVOKE_HWP( l_errl,p9_update_ec_eq_state,l_proc);
// There might be a recursion possible with PRD and PM Reset so
// don't call into reset twice
auto l_pmResetInProgress =
l_parent->getAttr<ATTR_HB_INITIATED_PM_RESET>();
if( HB_INITIATED_PM_RESET_IN_PROGRESS != l_pmResetInProgress )
{
// set ATTR_HB_INITIATED_PM_RESET to IN_PROGRESS to allow
// special handling for PRD
l_parent->setAttr<ATTR_HB_INITIATED_PM_RESET>
(HB_INITIATED_PM_RESET_IN_PROGRESS);

HWAS_INF("platDeconfigureTargetAtRuntime() - Calling resetPMComplex");
l_errl = HBPM::resetPMComplex(l_parent);

if(l_errl)
{
HWAS_ERR("platDeconfigureTargetAtRuntime() - "
"call to p9_update_ec_eq_state() failed on proc "
"with HUID : %d",TARGETING::get_huid(l_proc));
ERRORLOG::ErrlUserDetailsTarget(l_proc).addToLog(l_errl);
}
HWAS_ERR("Failed call to HBPM::resetPMComplex on target "
"with HUID : %d",TARGETING::get_huid(l_parent));
ERRORLOG::ErrlUserDetailsTarget(l_parent).addToLog(l_errl);

// set ATTR_HB_INITIATED_PM_RESET back to INACTIVE to allow
// future recoveries to completely run
l_parent->setAttr<ATTR_HB_INITIATED_PM_RESET>
(HB_INITIATED_PM_RESET_INACTIVE);

// If an error then exit while loop
break;
}
else
{
HWAS_INF("Successful call to HBPM::resetPMComplex on target"
" with HUID : %.8X, setting ATTR_HB_INITIATED_PM_RESET to"
" COMPLETE(%d)",
TARGETING::get_huid(l_parent),
HB_INITIATED_PM_RESET_COMPLETE);
// set ATTR_HB_INITIATED_PM_RESET to ACTIVE (reset IS in progress)
// and continue
l_parent->setAttr<ATTR_HB_INITIATED_PM_RESET>
(HB_INITIATED_PM_RESET_COMPLETE);
}
}
else
{
HWAS_INF("platDeconfigureTargetAtRuntime() - deconfigure failed");
HWAS_INF("platDeconfigureTargetAtRuntime() - skippign call to resetPMComplex - ATTR_HB_INITIATED_PM_RESET=%d", l_pmResetInProgress );
}
}
HWAS_INF(">>>platDeconfigureTargetAtRuntime()" );

// get the parent proc and call the hwp to alert
// pm not to attempt to manage this core anymore
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
l_proc(l_parent);

HWAS_INF("platDeconfigureTargetAtRuntime() - "
"calling p9_update_ec_eq_state");
FAPI_INVOKE_HWP( l_errl,p9_update_ec_eq_state,
l_proc,true/*skip qssr*/);

if(l_errl)
{
HWAS_ERR("platDeconfigureTargetAtRuntime() - "
"call to p9_update_ec_eq_state() failed on proc "
"with HUID : %d",TARGETING::get_huid(l_proc));
ERRORLOG::ErrlUserDetailsTarget(l_proc).addToLog(l_errl);

// If an error then exit while loop
break;
}
}while(0);

HWAS_INF("<<<platDeconfigureTargetAtRuntime()" );

return l_errl ;
}
Expand Down
9 changes: 8 additions & 1 deletion src/usr/hwas/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2011,2016
# Contributors Listed Below - COPYRIGHT 2011,2018
# [+] International Business Machines Corp.
#
#
Expand All @@ -31,6 +31,13 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwas/common
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/ecmddatabuffer
EXTRAINCDIR += ${ROOTPATH}/src/usr/sbe

## support for pm_common
EXTRAINCDIR += ${ROOTPATH}/src/usr/isteps
EXTRAINCDIR += ${ROOTPATH}/src/import/hwpf/fapi2/include/
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc

VPATH += ${ROOTPATH}/src/usr/hwas/plat
VPATH += ${ROOTPATH}/src/usr/hwas/common

Expand Down
6 changes: 2 additions & 4 deletions src/usr/hwas/test/hwas1test.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* Contributors Listed Below - COPYRIGHT 2011,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -1660,9 +1660,7 @@ public:

// get parent OBUS and check OPTICS_CONFIG_MODE
auto obusType = TARGETING::TYPE_OBUS;
TARGETING::Target* l_obus_ptr =
const_cast<TARGETING::Target*>(
getParent(pDesc, obusType));
TARGETING::Target* l_obus_ptr = getParent(pDesc, obusType);
ATTR_OPTICS_CONFIG_MODE_type config_mode =
l_obus_ptr->getAttr<ATTR_OPTICS_CONFIG_MODE>();

Expand Down

0 comments on commit c8448c3

Please sign in to comment.