summaryrefslogtreecommitdiffstats
path: root/src/usr/runtime/customize_attrs_for_payload.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/runtime/customize_attrs_for_payload.C')
-rw-r--r--src/usr/runtime/customize_attrs_for_payload.C283
1 files changed, 220 insertions, 63 deletions
diff --git a/src/usr/runtime/customize_attrs_for_payload.C b/src/usr/runtime/customize_attrs_for_payload.C
index 1846512b7..273596b12 100644
--- a/src/usr/runtime/customize_attrs_for_payload.C
+++ b/src/usr/runtime/customize_attrs_for_payload.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2018 */
+/* Contributors Listed Below - COPYRIGHT 2012,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -36,10 +36,10 @@
#include <targeting/common/target.H>
#include <targeting/common/targetservice.H>
#include <targeting/common/utilFilter.H>
+#include <targeting/runtime/rt_targeting.H>
#include <runtime/runtime_reasoncodes.H>
#include <runtime/runtime.H>
#include <errl/errlmanager.H>
-#include <runtime/rt_targeting.H>
#include <arch/pirformat.H>
#include <targeting/common/util.H>
#include <errl/errludtarget.H>
@@ -78,7 +78,8 @@ errlHndl_t createProcNotFoundError(
* @reasoncode RUNTIME::RT_NO_PROC_TARGET
* @userdata1 Input targeting target's HUID
* @devdesc No processor targeting target was found for the given
- * targeting target
+ * targeting target
+ * @custdesc Unexpected internal firmware error
*/
pError = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_INFORMATIONAL,
@@ -86,7 +87,7 @@ errlHndl_t createProcNotFoundError(
RUNTIME::RT_NO_PROC_TARGET,
huid,
0,
- true);
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
ERRORLOG::ErrlUserDetailsTarget(i_pTarget,"Targeting target").
addToLog(pError);
@@ -109,7 +110,7 @@ errlHndl_t createProcNotFoundError(
*/
errlHndl_t computeNonPhypRtTarget(
const TARGETING::Target* i_pTarget,
- RT_TARG::rtChipId_t& o_rtTargetId)
+ TARGETING::rtChipId_t& o_rtTargetId)
{
assert(i_pTarget != NULL);
@@ -165,6 +166,7 @@ errlHndl_t computeNonPhypRtTarget(
* @userdata1 MEMBUF targeting target's HUID
* @devdesc No associated DMI targeting target(s) found for
* given MEMBUF targeting target
+ * @custdesc Unexpected internal firmware error
*/
pError = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_INFORMATIONAL,
@@ -172,7 +174,7 @@ errlHndl_t computeNonPhypRtTarget(
RUNTIME::RT_UNIT_TARGET_NOT_FOUND,
huid,
0,
- true);
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
ERRORLOG::ErrlUserDetailsTarget(i_pTarget,"Targeting Target").
addToLog(pError);
@@ -229,6 +231,80 @@ errlHndl_t computeNonPhypRtTarget(
o_rtTargetId = PIR_t::createCoreId(o_rtTargetId,pos);
o_rtTargetId |= HBRT_CORE_TYPE;
}
+ else if( targetingTargetType == TARGETING::TYPE_OCMB_CHIP)
+ {
+ // OCMB (This layout mimics MEMBUF)
+ // 0b1000.0000.0000.0000.0000.0GGG.GCCC.UUUU
+ // where GGGG is group, CCC is chip, UUUU is OMI chip unit
+ //
+ TARGETING::TargetHandleList targetList;
+
+ getParentAffinityTargets(targetList,
+ i_pTarget,
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_OMI,
+ TARGETING::UTIL_FILTER_ALL);
+
+ if( targetList.empty() )
+ {
+ auto huid = get_huid(i_pTarget);
+ TRACFCOMP(g_trac_runtime, ERR_MRK
+ "No associated OMI targeting target(s) found for OCMB_CHIP "
+ "targeting target with HUID of 0x%08X",
+ huid);
+ /*@
+ * @error
+ * @moduleid RUNTIME::MOD_CUST_COMP_NON_PHYP_RT_TARGET
+ * @reasoncode RUNTIME::RT_NO_OMI_TARGET_FOUND
+ * @userdata1 OCMB targeting target's HUID
+ * @devdesc No associated OMI targeting target(s) found for
+ * given OCMB targeting target
+ * @custdesc Unexpected internal firmware error
+ */
+ pError = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_INFORMATIONAL,
+ RUNTIME::MOD_CUST_COMP_NON_PHYP_RT_TARGET,
+ RUNTIME::RT_NO_OMI_TARGET_FOUND,
+ huid,
+ 0,
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
+
+ ERRORLOG::ErrlUserDetailsTarget(i_pTarget,"Targeting Target").
+ addToLog(pError);
+
+ break;
+ }
+
+ auto target = targetList[0];
+ auto pos = target->getAttr<TARGETING::ATTR_CHIP_UNIT>();
+
+ targetList.clear();
+ getParentAffinityTargets(targetList,
+ target,
+ TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_PROC,
+ TARGETING::UTIL_FILTER_ALL);
+
+ if(targetList.empty())
+ {
+ pError = createProcNotFoundError(target);
+ break;
+ }
+
+ auto procTarget = targetList[0];
+ pError = computeNonPhypRtTarget(procTarget, o_rtTargetId);
+ if(pError)
+ {
+ break;
+ }
+
+ // GGGG = 0 by default, CCC = o_rtTargetId, UUUU = pos
+ // HBRT_MEMBUF_TYPE distinguishes this target as a MEMBUF/OCMB
+ // Reusing MEMBUF for OCMB type as the two can't coexist
+ o_rtTargetId = (o_rtTargetId << RT_TARG::MEMBUF_ID_SHIFT);
+ o_rtTargetId += pos; // OMI chip unit acts as unique target position
+ o_rtTargetId |= HBRT_MEMBUF_TYPE;
+ }
else
{
auto huid = get_huid(i_pTarget);
@@ -246,6 +322,7 @@ errlHndl_t computeNonPhypRtTarget(
* @userdata2 Targeting target's type
* @devdesc The targeting type of the input targeting target is
* not supported by runtime code
+ * @custdesc Unexpected internal firmware error
*/
pError = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_INFORMATIONAL,
@@ -253,7 +330,7 @@ errlHndl_t computeNonPhypRtTarget(
RUNTIME::RT_TARGET_TYPE_NOT_SUPPORTED,
huid,
targetingTargetType,
- true);
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
ERRORLOG::ErrlUserDetailsTarget(i_pTarget,"Targeting Target").
addToLog(pError);
@@ -277,7 +354,7 @@ errlHndl_t computeNonPhypRtTarget(
*/
errlHndl_t getRtTypeForTarget(
const TARGETING::Target* i_pTarget,
- RT_TARG::rtChipId_t& o_rtType)
+ TARGETING::rtChipId_t& o_rtType)
{
assert(i_pTarget != NULL);
@@ -305,6 +382,10 @@ errlHndl_t getRtTypeForTarget(
case TARGETING::TYPE_CORE:
rtType = HBRT_CORE_TYPE;
break;
+ case TARGETING::TYPE_OCMB_CHIP:
+ // reusing MEMBUF type as it is not present
+ rtType = HBRT_MEMBUF_TYPE;
+ break;
default:
found = false;
break;
@@ -325,6 +406,7 @@ errlHndl_t getRtTypeForTarget(
* @userdata1 Target's HUID
* @userdata2 Target's targeting type
* @devdesc Targeting target's type not supported by runtime code
+ * @custdesc Unexpected internal firmware error
*/
pError = new ERRORLOG::ErrlEntry(
ERRORLOG::ERRL_SEV_INFORMATIONAL,
@@ -332,7 +414,7 @@ errlHndl_t getRtTypeForTarget(
RUNTIME::RT_TARGET_TYPE_NOT_SUPPORTED,
huid,
targetingTargetType,
- true);
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
ERRORLOG::ErrlUserDetailsTarget(i_pTarget,"Targeting Target").
addToLog(pError);
@@ -355,13 +437,15 @@ errlHndl_t configureHbrtHypIds(const bool i_configForPhyp)
TARGETING::CLASS_CHIP, TARGETING::TYPE_MEMBUF);
TARGETING::PredicateCTM isaCore(
TARGETING::CLASS_UNIT, TARGETING::TYPE_CORE);
- TARGETING::PredicatePostfixExpr isaProcMembufOrCore;
- isaProcMembufOrCore.push(&isaProc).push(&isaMembuf).Or()
- .push(&isaCore).Or();
+ TARGETING::PredicateCTM isanOcmbChip(
+ TARGETING::CLASS_CHIP, TARGETING::TYPE_OCMB_CHIP);
+ TARGETING::PredicatePostfixExpr isaProcMembufCoreorOcmb;
+ isaProcMembufCoreorOcmb.push(&isaProc).push(&isaMembuf).Or()
+ .push(&isaCore).Or().push(&isanOcmbChip).Or();
TARGETING::TargetRangeFilter pIt(
TARGETING::targetService().begin(),
TARGETING::targetService().end(),
- &isaProcMembufOrCore);
+ &isaProcMembufCoreorOcmb);
for (; pIt; ++pIt)
{
auto hbrtHypId = HBRT_HYP_ID_UNKNOWN;
@@ -376,61 +460,128 @@ errlHndl_t configureHbrtHypIds(const bool i_configForPhyp)
break;
}
- if( (*pIt)->getAttr<TARGETING::ATTR_TYPE>()
- == TARGETING::TYPE_CORE)
+ switch ((*pIt)->getAttr<TARGETING::ATTR_TYPE>())
{
- if(TARGETING::is_fused_mode())
+ case TARGETING::TYPE_CORE:
{
- // If we're in fused core mode, all core ID's must
- // match that of the parent EX
- auto type = TARGETING::TYPE_EX;
- const TARGETING::Target* pEx =
- TARGETING::getParent(*pIt,type);
-
- // If this fails, everything is already hosed
- assert(pEx != NULL);
-
- hbrtHypId = (pEx)->getAttr<TARGETING::ATTR_ORDINAL_ID>();
- }else
+ if(TARGETING::is_fused_mode())
+ {
+ // If we're in fused core mode, all core ID's must
+ // match that of the parent EX
+ auto type = TARGETING::TYPE_EX;
+ const TARGETING::Target* pEx =
+ TARGETING::getParent(*pIt,type);
+
+ // If this fails, everything is already hosed
+ assert(pEx != NULL);
+
+ hbrtHypId = (pEx)->getAttr<TARGETING::ATTR_ORDINAL_ID>();
+ }
+ else
+ {
+ hbrtHypId = (*pIt)->getAttr<TARGETING::ATTR_ORDINAL_ID>();
+ }
+ break;
+ }
+ case TARGETING::TYPE_MEMBUF:
+ {
+ //MEMBUF
+ // 0b1000.0000.0000.0000.0000.0PPP.PPPP.MMMM
+ // where PP is the parent proc's id, MMMM is memory channel
+ //
+ TARGETING::TargetHandleList targetList;
+
+ getParentAffinityTargets(targetList,
+ (*pIt),
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_DMI, false);
+ assert( !targetList.empty() );
+
+ auto dmi_target = targetList[0];
+ auto pos = dmi_target->getAttr<TARGETING::ATTR_CHIP_UNIT>();
+
+ targetList.clear();
+ getParentAffinityTargets(targetList,
+ dmi_target,
+ TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_PROC, false);
+ assert( !targetList.empty() );
+
+ auto procTarget = targetList[0];
+ hbrtHypId = procTarget->getAttr<TARGETING::ATTR_ORDINAL_ID>();
+ hbrtHypId = (hbrtHypId << RT_TARG::MEMBUF_ID_SHIFT);
+ hbrtHypId += pos;
+ break;
+ }
+ case TARGETING::TYPE_OCMB_CHIP:
+ {
+ TRACDCOMP( g_trac_runtime, "configureHbrtHypIds> "
+ "Set ATTR_HBRT_HYP_ID attribute for OCMB target "
+ "with HUID of 0x%08X", TARGETING::get_huid(*pIt));
+
+ // TYPE_OCMB_CHIP (mimics MEMBUF layout)
+ // 0b1000.0000.0000.0000.0000.0PPP.PPPP.UUUU
+ // where PP is the parent proc's id, UUUU is OMI chip unit
+ //
+ TARGETING::TargetHandleList targetList;
+
+ getParentAffinityTargets(targetList,
+ (*pIt),
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_OMI, false);
+ assert( !targetList.empty() );
+
+ auto omi_target = targetList[0];
+ auto pos = omi_target->getAttr<TARGETING::ATTR_CHIP_UNIT>();
+
+ targetList.clear();
+ getParentAffinityTargets(targetList,
+ omi_target,
+ TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_PROC, false);
+ assert( !targetList.empty() );
+
+ auto procTarget = targetList[0];
+ // Reusing MEMBUF for OCMB Chip communication
+ hbrtHypId = procTarget->getAttr<TARGETING::ATTR_ORDINAL_ID>();
+ hbrtHypId = (hbrtHypId << RT_TARG::MEMBUF_ID_SHIFT);
+ hbrtHypId += pos; // Add OMI chip unit to end
+ break;
+ }
+ case TARGETING::TYPE_PROC:
{
hbrtHypId = (*pIt)->getAttr<TARGETING::ATTR_ORDINAL_ID>();
+ break;
}
- }
- else if( (*pIt)->getAttr<TARGETING::ATTR_TYPE>()
- == TARGETING::TYPE_MEMBUF )
- {
- //MEMBUF
- // 0b1000.0000.0000.0000.0000.0PPP.PPPP.MMMM
- // where PP is the parent proc's id, MMMM is memory channel
- //
- TARGETING::TargetHandleList targetList;
-
- getParentAffinityTargets(targetList,
- (*pIt),
- TARGETING::CLASS_UNIT,
- TARGETING::TYPE_DMI, false);
- assert( !targetList.empty() );
-
- auto dmi_target = targetList[0];
- auto pos = dmi_target->getAttr<TARGETING::ATTR_CHIP_UNIT>();
-
- targetList.clear();
- getParentAffinityTargets(targetList,
- dmi_target,
- TARGETING::CLASS_CHIP,
- TARGETING::TYPE_PROC, false);
- assert( !targetList.empty() );
-
- auto procTarget = targetList[0];
- hbrtHypId = procTarget->getAttr<TARGETING::ATTR_ORDINAL_ID>();
- hbrtHypId = (hbrtHypId << RT_TARG::MEMBUF_ID_SHIFT);
- hbrtHypId += pos;
- }
- else // just PROC
- {
- hbrtHypId = (*pIt)->getAttr<TARGETING::ATTR_ORDINAL_ID>();
- }
-
+ default:
+ {
+ auto huid = get_huid(*pIt);
+ auto targetType = (*pIt)->getAttr<TARGETING::ATTR_TYPE>();
+ TRACFCOMP(g_trac_runtime, ERR_MRK
+ "configureHbrtHypIds> 0x%08X is not a supported type. "
+ "HUID: 0x%08X", targetType, huid);
+ /*@
+ * @errortype
+ * @moduleid RUNTIME::MOD_CONFIGURE_HBRT_HYP_IDS
+ * @reasoncode RUNTIME::RT_TARGET_TYPE_NOT_SUPPORTED
+ * @userdata1 Target's HUID
+ * @userdata2 Target's targeting type
+ * @devdesc Targeting target's type not supported by runtime code
+ * @custdesc Unexpected internal firmware error
+ */
+ pError = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_INFORMATIONAL,
+ RUNTIME::MOD_CONFIGURE_HBRT_HYP_IDS,
+ RUNTIME::RT_TARGET_TYPE_NOT_SUPPORTED,
+ huid,
+ targetType,
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
+
+ ERRORLOG::ErrlUserDetailsTarget(*pIt,"Targeting Target").
+ addToLog(pError);
+ break;
+ }
+ } // end of ATTR_TYPE switch
hbrtHypId |= rtType;
}
else
@@ -442,6 +593,12 @@ errlHndl_t configureHbrtHypIds(const bool i_configForPhyp)
}
}
+ // Only set HBRT_HYP_ID attribute if no error found
+ if (pError)
+ {
+ break;
+ }
+
(*pIt)->setAttr<TARGETING::ATTR_HBRT_HYP_ID>(hbrtHypId);
TRACDCOMP( g_trac_runtime, "configureHbrtHypIds> "
"Set ATTR_HBRT_HYP_ID attribute to 0x%016llX on targeting target "
OpenPOWER on IntegriCloud