diff options
Diffstat (limited to 'src/usr/runtime/customize_attrs_for_payload.C')
-rw-r--r-- | src/usr/runtime/customize_attrs_for_payload.C | 283 |
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 " |