Skip to content

Commit

Permalink
PRD: Power Management Recovery
Browse files Browse the repository at this point in the history
Change-Id: I10b1fc4898b6a72331b27aedb8f80544e8a8c4fb
RTC: 145749
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/52757
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/52998
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>
  • Loading branch information
bweisenb authored and zane131 committed Feb 1, 2018
1 parent ae1ac07 commit f46a515
Show file tree
Hide file tree
Showing 13 changed files with 379 additions and 8 deletions.
6 changes: 5 additions & 1 deletion src/include/usr/diag/prdf/common/prdf_service_codes.H
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2015 */
/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -67,6 +67,7 @@ enum ModuleId
PRDF_SYNC_SVC = 0x0F,
PRDF_CS_FIRDATA_READ = 0x10,
PRDF_CS_FIRDATA_WRITE = 0x11,
PRDF_PM_RECOVERY_FFDC = 0x12,
};

/******************************************************************************/
Expand Down Expand Up @@ -124,6 +125,9 @@ enum ReasonCode
PRDF_INVALID_CONFIG = PRDF_COMP_ID | 0x82,
PRDF_NULL_VALUE_RETURNED = PRDF_COMP_ID | 0x83,

// Extra FFDC errorlog linked to a PRD log
PRDF_EXTRA_FFDC = PRDF_COMP_ID | 0x90,

PRDF_LAST_REASONCODE = PRDF_COMP_ID | 0xFF,
};

Expand Down
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plat/p9/p9_cumulus.rule
Expand Up @@ -2283,7 +2283,7 @@ group gOCCFIR filter singlebit, cs_root_cause
/** OCCFIR[3]
* STOP_RECOVERY_NOTIFY_PRD
*/
(rOCCFIR, bit(3)) ? threshold_and_mask_self;
(rOCCFIR, bit(3)) ? pmRecovery;

/** OCCFIR[4]
* OCC_HB_ERROR
Expand Down
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/common/plat/p9/p9_nimbus.rule
Expand Up @@ -2342,7 +2342,7 @@ group gOCCFIR filter singlebit, cs_root_cause
/** OCCFIR[3]
* STOP_RECOVERY_NOTIFY_PRD
*/
(rOCCFIR, bit(3)) ? threshold_and_mask_self;
(rOCCFIR, bit(3)) ? pmRecovery;

/** OCCFIR[4]
* OCC_HB_ERROR
Expand Down
5 changes: 5 additions & 0 deletions src/usr/diag/prdf/common/plat/p9/p9_proc_common_actions.rule
Expand Up @@ -109,3 +109,8 @@ actionclass sbe_vital_attn
funccall("handleSbeVital");
};

actionclass pmRecovery
{
funccall("PmRecovery");
threshold1;
};
38 changes: 38 additions & 0 deletions src/usr/diag/prdf/common/plat/p9/prdfP9Proc.C
Expand Up @@ -40,6 +40,10 @@
#include <sbeio/sbeioif.H>
#endif

#ifdef __HOSTBOOT_RUNTIME
#include <prdfP9PmRecovery.H>
#endif

// Platform includes

using namespace TARGETING;
Expand Down Expand Up @@ -439,6 +443,40 @@ PRDF_PLUGIN_DEFINE_NS( p9_cumulus, Proc, CheckForUnitCs );

//------------------------------------------------------------------------------

/**
* @brief Recovery actions for a power management STOP failure. Collects FFDC,
* runtime deconfigures lost cores, and makes appropriate callouts as
* determined by the p9_pm_callout procedure.
* @param i_chip A P9 chip.
* @param io_sc step code data struct
* @return SUCCESS
*/
int32_t PmRecovery( ExtensibleChip * i_chip,
STEP_CODE_DATA_STRUCT & io_sc )
{

#ifdef __HOSTBOOT_RUNTIME

if ( pmRecovery(i_chip, io_sc) != SUCCESS )
{
PRDF_ERR("[PmRecovery] failed for 0x%08x", i_chip->GetId());
}

#else

PRDF_ERR( "[PmRecovery] not expected outside of HB runtime" );
io_sc.service_data->SetCallout(LEVEL2_SUPPORT, MRU_HIGH);
io_sc.service_data->SetCallout(i_chip->getTrgt());

#endif

return SUCCESS;
}
PRDF_PLUGIN_DEFINE_NS( p9_nimbus, Proc, PmRecovery );
PRDF_PLUGIN_DEFINE_NS( p9_cumulus, Proc, PmRecovery );

//------------------------------------------------------------------------------

} // end namespace Proc

} // end namespace PRDF
153 changes: 153 additions & 0 deletions src/usr/diag/prdf/plat/p9/prdfP9PmRecovery.C
@@ -0,0 +1,153 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/diag/prdf/plat/p9/prdfP9PmRecovery.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 <iipServiceDataCollector.h>
#include <prdfExtensibleChip.H>
#include <prdfP9PmRecovery.H>
#include <prdfErrlUtil.H>

#include <hwas/common/hwas.H>
#include <hwas/common/deconfigGard.H>


using namespace TARGETING;

namespace PRDF
{

using namespace PlatServices;

int32_t pmRecovery( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
{
#define PRDF_FUNC "[pmRecovery] "
int32_t o_rc = SUCCESS;
TargetHandle_t target = i_chip->getTrgt();

// p9_pm_callout HWP parameters
RasAction ra = PROC_CHIP_CALLOUT;
uint32_t deadCores = 0;
std::vector < StopErrLogSectn > ffdcList;

do {

o_rc = pmCallout( target, ra, deadCores, ffdcList );

if (o_rc != SUCCESS)
{
PRDF_ERR(PRDF_FUNC "pmCallout failed huid %x", getHuid(target));
io_sc.service_data->SetCallout(LEVEL2_SUPPORT, MRU_HIGH);
io_sc.service_data->SetCallout(target);
break;
}

PRDF_TRAC(PRDF_FUNC "lost cores vector %x", deadCores);

// 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
for ( uint32_t pos = 0; pos < MAX_EC_PER_PROC; ++pos )
{
if ( deadCores & (0x80000000 >> pos) )
{
// Get the core
TargetHandle_t coreTgt = getConnectedChild( target, TYPE_CORE, pos);
if (coreTgt == nullptr)
{
PRDF_ERR(PRDF_FUNC "Failed to get child core for huid %x "
"core pos %d", getHuid(target), pos);
continue;
}

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

if (errl)
{
PRDF_ERR( PRDF_FUNC "Deconfig failed on core %x",
getHuid(coreTgt));
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
}
}
}

// Make callout indicated by p9_pm_callout
switch (ra) {
case PROC_CHIP_CALLOUT:
PRDF_TRAC(PRDF_FUNC "HUID 0x%08x PROC_CHIP_CALLOUT",
getHuid(target));
io_sc.service_data->SetCallout(target);
break;
default:
PRDF_TRAC(PRDF_FUNC "HUID 0x%08x Unexpected callout enum",
getHuid(target));
io_sc.service_data->SetCallout(LEVEL2_SUPPORT, MRU_HIGH);
io_sc.service_data->SetCallout(target);
break;
}

// Create errorlog to contain HWP FFDC
/*@
* @errortype
* @reasoncode PRDF_EXTRA_FFDC
* @severity ERRL_SEV_INFORMATIONAL
* @moduleid PRDF_PM_RECOVERY_FFDC
* @userdata1 Proc HUID
* @userdata2 deadCores bit vector
* @devdesc An errorlog containing extra FFDC collected by the HWP
*/
errlHndl_t ffdcErrl = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_INFORMATIONAL,
PRDF_PM_RECOVERY_FFDC,
PRDF_EXTRA_FFDC,
getHuid(target),
deadCores );

// Add FFDC sections
for ( auto & ffdcSctn : ffdcList )
{
ffdcErrl->addFFDC(PRDF_COMP_ID, ffdcSctn.iv_pBufPtr,
ffdcSctn.iv_bufSize, 0, 0);
}

// Commit
ffdcErrl->plid(plid);
ERRORLOG::errlCommit(ffdcErrl, PRDF_COMP_ID);

} while (0);

return o_rc;

#undef PRDF_FUNC
}


} // end namespace PRDF

50 changes: 50 additions & 0 deletions src/usr/diag/prdf/plat/p9/prdfP9PmRecovery.H
@@ -0,0 +1,50 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/diag/prdf/plat/p9/prdfP9PmRecovery.H $ */
/* */
/* 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 */
/** @file prdfP9PmRecovery.H
* @brief Power management STOP failure recovery actions
*/

#ifndef __prdfP9PmRecovery_H
#define __prdfP9PmRecovery_H

// Framework includes
#include <prdfExtensibleChip.H>
#include <prdfPlatServices.H>
#include <prdfTrace.H>

namespace PRDF
{

/**
* @brief Power management STOP failure recovery actions
* @param i_chip P9 extensible chip
* @param io_sc Step code data structure
* @param return SUCCESS/FAIL
*/
int32_t pmRecovery( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc );

} // end namespace PRDF

#endif // __prdfP9PmRecovery_H
64 changes: 64 additions & 0 deletions src/usr/diag/prdf/plat/p9/prdf_plat_p9_hb_only.mk
@@ -0,0 +1,64 @@
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/usr/diag/prdf/plat/p9/prdf_plat_p9_hb_only.mk $
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2016,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

# NOTE: PRD_SRC_PATH and PRD_INC_PATH must be defined before including this file

################################################################################
# Paths common to both IPL and runtime
################################################################################

prd_vpath += ${PRD_SRC_PATH}/plat/p9

prd_incpath += ${PRD_SRC_PATH}/plat/p9

################################################################################
# Hostboot only object files common to both IPL and runtime
################################################################################

# plat/p9/ (non-rule plugin related)

# plat/p9/ (rule plugin related)

################################################################################
# Hostboot only object files (IPL only)
################################################################################

ifneq (${HOSTBOOT_RUNTIME},1)

# plat/p9/ (non-rule plugin related)

endif

################################################################################
# Hostboot only object files (runtime only)
################################################################################

ifeq (${HOSTBOOT_RUNTIME},1)

# plat/p9/ (non-rule plugin related)
prd_obj += prdfP9PmRecovery.o

endif

0 comments on commit f46a515

Please sign in to comment.