diff options
| -rw-r--r-- | src/include/usr/hwas/common/deconfigGard.H | 11 | ||||
| -rw-r--r-- | src/usr/hwas/common/deconfigGard.C | 484 |
2 files changed, 262 insertions, 233 deletions
diff --git a/src/include/usr/hwas/common/deconfigGard.H b/src/include/usr/hwas/common/deconfigGard.H index c1288978e..c76ee740f 100644 --- a/src/include/usr/hwas/common/deconfigGard.H +++ b/src/include/usr/hwas/common/deconfigGard.H @@ -239,7 +239,7 @@ public: * * @return uint32_t 'counter' of deconfigure events */ - uint32_t getDeconfigureStatus(); + uint32_t getDeconfigureStatus() const; /** * @brief Registers a Deferred Deconfigure @@ -248,9 +248,8 @@ public: * by hwasCallout when the user requests a * Deferred Deconfigure request. * - * For now, just put a mark on the wall indicating that we got a deferred - * deconfigure callout - * TODO RTC: 45781 + * Create a deconfigure record, which will be handled in the function + * processDeferredDeconfig(). * * @param[in] i_target Reference to Target to deconfigure. * @param[in] i_errlEid Error log EID to store in Deconfigure Record. @@ -405,9 +404,11 @@ private: * * @param[in] i_target Reference to base Target. * @param[in] i_errlEid Error log EID to store in Deconfigure Record. + * @param[in] i_atRunTime if true, at runtime - bypass some associations */ void _deconfigureByAssoc(TARGETING::Target & i_target, - const uint32_t i_errlEid); + const uint32_t i_errlEid, + bool i_atRunTime = false); /** * @brief Deconfigures a Target. diff --git a/src/usr/hwas/common/deconfigGard.C b/src/usr/hwas/common/deconfigGard.C index a23c49398..87ee897c8 100644 --- a/src/usr/hwas/common/deconfigGard.C +++ b/src/usr/hwas/common/deconfigGard.C @@ -580,10 +580,28 @@ errlHndl_t DeconfigGard::deconfigureTarget(Target & i_target, // the is System is at runtime if (!i_evenAtRunTime && platSystemIsAtRuntime()) { - HWAS_INF("Skipping deconfigTarget - System at Runtime"); + HWAS_ERR("Skipping deconfigureTarget: System at Runtime; target %.8X", + get_huid(&i_target)); break; } + // just to make sure that we haven't missed anything in development + // AT RUNTIME: we should only be called to deconfigure types: + // NX, EX, MEMBUF. + if (i_evenAtRunTime) + { + TYPE target_type = i_target.getAttr<ATTR_TYPE>(); + // TODO RTC 88471: use attribute vs hardcoded list. + if (!((target_type == TYPE_MEMBUF) || + (target_type == TYPE_NX) || + (target_type == TYPE_EX))) + { + HWAS_ERR("Skipping deconfigureTarget: eventAtRunTime with unexpected target %.8X type %d -- SKIPPING", + get_huid(&i_target), target_type); + break; + } + } + const ATTR_DECONFIG_GARDABLE_type lDeconfigGardable = i_target.getAttr<ATTR_DECONFIG_GARDABLE>(); const uint8_t lPresent = @@ -624,7 +642,7 @@ errlHndl_t DeconfigGard::deconfigureTarget(Target & i_target, _deconfigureTarget(i_target, i_errlEid); // Deconfigure other Targets by association - _deconfigureByAssoc(i_target, i_errlEid); + _deconfigureByAssoc(i_target, i_errlEid, i_evenAtRunTime); HWAS_MUTEX_UNLOCK(iv_mutex); @@ -1026,9 +1044,11 @@ errlHndl_t DeconfigGard::_invokeDeconfigureAssocProc() //****************************************************************************** void DeconfigGard::_deconfigureByAssoc(Target & i_target, - const uint32_t i_errlEid) + const uint32_t i_errlEid, + bool i_atRunTime) { - HWAS_INF("deconfigByAssoc for %.8X", get_huid(&i_target)); + HWAS_INF("deconfigByAssoc for %.8X (atRunTime %d)", + get_huid(&i_target), i_atRunTime); // some common variables used below TargetHandleList pChildList; @@ -1067,268 +1087,276 @@ void DeconfigGard::_deconfigureByAssoc(Target & i_target, _deconfigureByAssoc(*pChild, i_errlEid); } // for CHILD_BY_AFFINITY - // Handles bus endpoint (TYPE_XBUS, TYPE_ABUS) and - // memory (TYPE_MEMBUF, TYPE_MBA, TYPE_DIMM) - // deconfigureByAssociation rules - switch (i_target.getAttr<ATTR_TYPE>()) + if (!i_atRunTime) { - case TYPE_MEMBUF: + // 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 + + // Handles bus endpoint (TYPE_XBUS, TYPE_ABUS) and + // memory (TYPE_MEMBUF, TYPE_MBA, TYPE_DIMM) + // deconfigureByAssociation rules + switch (i_target.getAttr<ATTR_TYPE>()) { - // get parent MCS - TargetHandleList pParentMcsList; - getParentAffinityTargets(pParentMcsList, &i_target, - CLASS_UNIT, TYPE_MCS, true /*functional*/); - HWAS_ASSERT((pParentMcsList.size() <= 1), - "HWAS deconfigByAssoc: pParentMcsList > 1"); - - // done if parent is already deconfigured - if (pParentMcsList.empty()) + case TYPE_MEMBUF: { - break; - } + // get parent MCS + TargetHandleList pParentMcsList; + getParentAffinityTargets(pParentMcsList, &i_target, + CLASS_UNIT, TYPE_MCS, true /*functional*/); + HWAS_ASSERT((pParentMcsList.size() <= 1), + "HWAS _deconfigureByAssoc: pParentMcsList > 1"); + + // done if parent is already deconfigured + if (pParentMcsList.empty()) + { + break; + } - // deconfigure the parent - const Target *l_parentMcs = pParentMcsList[0]; - HWAS_INF("deconfigByAssoc MEMBUF parent MCS: %.8X", - get_huid(l_parentMcs)); - _deconfigureTarget(const_cast<Target &> (*l_parentMcs), - i_errlEid); - _deconfigureByAssoc(const_cast<Target &> (*l_parentMcs), - i_errlEid); - - Target *pSys; - targetService().getTopLevelTarget(pSys); - HWAS_ASSERT(pSys, "HWAS _deconfigureByAssoc: no TopLevelTarget"); - - // done if not in interleaved mode - if (!pSys->getAttr<ATTR_ALL_MCS_IN_INTERLEAVING_GROUP>()) - { - break; - } + // deconfigure the parent + const Target *l_parentMcs = pParentMcsList[0]; + HWAS_INF("deconfigByAssoc MEMBUF parent MCS: %.8X", + get_huid(l_parentMcs)); + _deconfigureTarget(const_cast<Target &> (*l_parentMcs), + i_errlEid); + _deconfigureByAssoc(const_cast<Target &> (*l_parentMcs), + i_errlEid); - // if paired mode (interleaved) - // deconfigure paired MCS and MEMBUF (Centaur) - // find paired MCS / MEMBUF (Centaur) - TargetHandleList pMcsList; - findMcsInGroup(l_parentMcs, pMcsList); + Target *pSys; + targetService().getTopLevelTarget(pSys); + HWAS_ASSERT(pSys, "HWAS _deconfigureByAssoc: no TopLevelTarget"); - // deconfigure each paired MCS - for (TargetHandleList::iterator pMcs_it = pMcsList.begin(); - pMcs_it != pMcsList.end(); - ++pMcs_it) - { - TargetHandle_t pMcs = *pMcs_it; + // done if not in interleaved mode + if (!pSys->getAttr<ATTR_ALL_MCS_IN_INTERLEAVING_GROUP>()) + { + break; + } - HWAS_INF("deconfigByAssoc MCS (& MEMBUF) paired: %.8X", - get_huid(pMcs)); - _deconfigureTarget(*pMcs, i_errlEid); - _deconfigureByAssoc(*pMcs, i_errlEid); - } // for - break; - } // TYPE_MEMBUF + // if paired mode (interleaved) + // deconfigure paired MCS and MEMBUF (Centaur) + // find paired MCS / MEMBUF (Centaur) + TargetHandleList pMcsList; + findMcsInGroup(l_parentMcs, pMcsList); - case TYPE_MBA: - { - // get parent MEMBUF (Centaur) - const Target *l_parentMembuf = getParentChip(&i_target); - - // get children DIMM that are functional - PredicateCTM predDimm(CLASS_LOGICAL_CARD, TYPE_DIMM); - PredicatePostfixExpr checkExpr; - checkExpr.push(&predDimm).push(&isFunctional).And(); - TargetHandleList pDimmList; - targetService().getAssociated(pDimmList, l_parentMembuf, - TargetService::CHILD_BY_AFFINITY, TargetService::ALL, - &checkExpr); - - // if parent MEMBUF (Centaur) has no functional memory - if (pDimmList.empty()) - { - // deconfigure parent MEMBUF (Centaur) - HWAS_INF("deconfigByAssoc MEMBUF parent with no memory: %.8X", - get_huid(l_parentMembuf)); - _deconfigureTarget(const_cast<Target &> (*l_parentMembuf), - i_errlEid); - _deconfigureByAssoc(const_cast<Target &> (*l_parentMembuf), - i_errlEid); + // deconfigure each paired MCS + for (TargetHandleList::iterator pMcs_it = pMcsList.begin(); + pMcs_it != pMcsList.end(); + ++pMcs_it) + { + TargetHandle_t pMcs = *pMcs_it; - // and we're done, so break; + HWAS_INF("deconfigByAssoc MCS (& MEMBUF) paired: %.8X", + get_huid(pMcs)); + _deconfigureTarget(*pMcs, i_errlEid); + _deconfigureByAssoc(*pMcs, i_errlEid); + } // for break; - } - - // parent MEMBUF still has functional memory - Target *pSys; - targetService().getTopLevelTarget(pSys); - HWAS_ASSERT(pSys, "HWAS _deconfigureByAssoc: no TopLevelTarget"); + } // TYPE_MEMBUF - // done if not in interleaved mode - if (!pSys->getAttr<ATTR_ALL_MCS_IN_INTERLEAVING_GROUP>()) + case TYPE_MBA: { - break; - } + // get parent MEMBUF (Centaur) + const Target *l_parentMembuf = getParentChip(&i_target); - // we need to make sure that MBA memory is balanced. + // get children DIMM that are functional + PredicateCTM predDimm(CLASS_LOGICAL_CARD, TYPE_DIMM); + PredicatePostfixExpr checkExpr; + checkExpr.push(&predDimm).push(&isFunctional).And(); + TargetHandleList pDimmList; + targetService().getAssociated(pDimmList, l_parentMembuf, + TargetService::CHILD_BY_AFFINITY, TargetService::ALL, + &checkExpr); - // find parent MCS - TargetHandleList pParentMcsList; - getParentAffinityTargets(pParentMcsList, l_parentMembuf, - CLASS_UNIT, TYPE_MCS, true /*functional*/); - HWAS_ASSERT((pParentMcsList.size() <= 1), - "HWAS deconfigByAssoc: pParentMcsList > 1"); + // if parent MEMBUF (Centaur) has no functional memory + if (pDimmList.empty()) + { + // deconfigure parent MEMBUF (Centaur) + HWAS_INF("deconfigByAssoc MEMBUF parent with no memory: %.8X", + get_huid(l_parentMembuf)); + _deconfigureTarget(const_cast<Target &> (*l_parentMembuf), + i_errlEid); + _deconfigureByAssoc(const_cast<Target &> (*l_parentMembuf), + i_errlEid); + + // and we're done, so break; + break; + } - if (pParentMcsList.empty()) - { - // MCS is already deconfigured, we're done - break; - } + // parent MEMBUF still has functional memory + Target *pSys; + targetService().getTopLevelTarget(pSys); + HWAS_ASSERT(pSys, "HWAS _deconfigureByAssoc: no TopLevelTarget"); + + // done if not in interleaved mode + if (!pSys->getAttr<ATTR_ALL_MCS_IN_INTERLEAVING_GROUP>()) + { + break; + } - // MEMBUF only has 1 parent - const Target *l_parentMcs = pParentMcsList[0]; + // we need to make sure that MBA memory is balanced. - // find paired MCS / MEMBUF (Centaur) - TargetHandleList pMcsList; - findMcsInGroup(l_parentMcs, pMcsList); + // find parent MCS + TargetHandleList pParentMcsList; + getParentAffinityTargets(pParentMcsList, l_parentMembuf, + CLASS_UNIT, TYPE_MCS, true /*functional*/); + HWAS_ASSERT((pParentMcsList.size() <= 1), + "HWAS _deconfigureByAssoc: pParentMcsList > 1"); - // how much memory does this MBA have - ATTR_EFF_DIMM_SIZE_type l_dimmSize; - i_target.tryGetAttr<ATTR_EFF_DIMM_SIZE>(l_dimmSize); - const uint64_t l_mbaDimmSize = - l_dimmSize[0][0] + l_dimmSize[0][1] + - l_dimmSize[1][0] + l_dimmSize[1][1]; + if (pParentMcsList.empty()) + { + // MCS is already deconfigured, we're done + break; + } - if (l_mbaDimmSize == 0) - { // before this attribute has been set, so don't check - break; - } + // MEMBUF only has 1 parent + const Target *l_parentMcs = pParentMcsList[0]; - // now we'll walk thru MCS targets in the group, find MBAs - // that match in memory size, and deconfigure them, and add - // them to this list to do the deconfigByAssoc afterward. - TargetHandleList l_deconfigList; + // find paired MCS / MEMBUF (Centaur) + TargetHandleList pMcsList; + findMcsInGroup(l_parentMcs, pMcsList); - // for each paired MCS in the group - for (TargetHandleList::iterator pMcs_it = pMcsList.begin(); - pMcs_it != pMcsList.end(); - ++pMcs_it) - { - TargetHandle_t pMcs = *pMcs_it; + // how much memory does this MBA have + ATTR_EFF_DIMM_SIZE_type l_dimmSize; + i_target.tryGetAttr<ATTR_EFF_DIMM_SIZE>(l_dimmSize); + const uint64_t l_mbaDimmSize = + l_dimmSize[0][0] + l_dimmSize[0][1] + + l_dimmSize[1][0] + l_dimmSize[1][1]; - if (pMcs == l_parentMcs) - { // this is 'my' MCS - continue - continue; + if (l_mbaDimmSize == 0) + { // before this attribute has been set, so don't check + break; } - // search for memory on EITHER of its MBA that matchs - TargetHandleList pMbaList; - PredicateCTM predMba(CLASS_UNIT, TYPE_MBA); - PredicatePostfixExpr checkExpr; - checkExpr.push(&predMba).push(&isFunctional).And(); - targetService().getAssociated(pMbaList, pMcs, - TargetService::CHILD_BY_AFFINITY, TargetService::ALL, - &checkExpr); - - // if there are 2 functional MBA, then one of them matches - // the MBA we just deconfigured, so we need to find the - // match and deconfigure it. + // now we'll walk thru MCS targets in the group, find MBAs + // that match in memory size, and deconfigure them, and add + // them to this list to do the deconfigByAssoc afterward. + TargetHandleList l_deconfigList; - // assumes 2 MBA per MEMBUF. if this changes, then instead - // of '1', count the number of MBAs under this MEMBUF and - // use that as the comparison. - if (pMbaList.size() != 1) // this != myMbaCount + // for each paired MCS in the group + for (TargetHandleList::iterator pMcs_it = pMcsList.begin(); + pMcs_it != pMcsList.end(); + ++pMcs_it) { - // unbalanced, so lets find one to deconfigure - for (TargetHandleList::iterator - pMba_it = pMbaList.begin(); - pMba_it != pMbaList.end(); - ++pMba_it) + TargetHandle_t pMcs = *pMcs_it; + + if (pMcs == l_parentMcs) + { // this is 'my' MCS - continue + continue; + } + + // search for memory on EITHER of its MBA that matchs + TargetHandleList pMbaList; + PredicateCTM predMba(CLASS_UNIT, TYPE_MBA); + PredicatePostfixExpr checkExpr; + checkExpr.push(&predMba).push(&isFunctional).And(); + targetService().getAssociated(pMbaList, pMcs, + TargetService::CHILD_BY_AFFINITY, TargetService::ALL, + &checkExpr); + + // if there are 2 functional MBA, then one of them matches + // the MBA we just deconfigured, so we need to find the + // match and deconfigure it. + + // assumes 2 MBA per MEMBUF. if this changes, then instead + // of '1', count the number of MBAs under this MEMBUF and + // use that as the comparison. + if (pMbaList.size() != 1) // this != myMbaCount { - TargetHandle_t pMba = *pMba_it; - pMba->tryGetAttr<ATTR_EFF_DIMM_SIZE>(l_dimmSize); - const uint64_t l_thisDimmSize = - l_dimmSize[0][0] + l_dimmSize[0][1] + - l_dimmSize[1][0] + l_dimmSize[1][1]; - - // if this MBA matches, deconfigure it. - if (l_mbaDimmSize == l_thisDimmSize) + // unbalanced, so lets find one to deconfigure + for (TargetHandleList::iterator + pMba_it = pMbaList.begin(); + pMba_it != pMbaList.end(); + ++pMba_it) { - HWAS_INF("deconfigByAssoc MBA matched: %.8X", - get_huid(pMba)); - _deconfigureTarget(*pMba, i_errlEid); - l_deconfigList.push_back(pMba); - break; // only need to do 1 MBA - we're done. - } - } // for MBA - } // if 2 functional MBA - } // for paired MCS - - // now loop thru and do the ByAssoc deconfig for each of the - // MBA targets. this should get the CHILD associations, but - // won't cause any pair deconfigs, since we coverered that - // already. - for (TargetHandleList::iterator - pMba_it = l_deconfigList.begin(); - pMba_it != l_deconfigList.end(); - ++pMba_it) - { - TargetHandle_t pMba = *pMba_it; - HWAS_INF("deconfigByAssoc MBA matched (bA): %.8X", - get_huid(pMba)); - _deconfigureByAssoc(*pMba, i_errlEid); - } // for - break; - } // TYPE_MBA + TargetHandle_t pMba = *pMba_it; + pMba->tryGetAttr<ATTR_EFF_DIMM_SIZE>(l_dimmSize); + const uint64_t l_thisDimmSize = + l_dimmSize[0][0] + l_dimmSize[0][1] + + l_dimmSize[1][0] + l_dimmSize[1][1]; + + // if this MBA matches, deconfigure it. + if (l_mbaDimmSize == l_thisDimmSize) + { + HWAS_INF("deconfigByAssoc MBA matched: %.8X", + get_huid(pMba)); + _deconfigureTarget(*pMba, i_errlEid); + l_deconfigList.push_back(pMba); + break; // only need to do 1 MBA - we're done. + } + } // for MBA + } // if 2 functional MBA + } // for paired MCS + + // now loop thru and do the ByAssoc deconfig for each of the + // MBA targets. this should get the CHILD associations, but + // won't cause any pair deconfigs, since we coverered that + // already. + for (TargetHandleList::iterator + pMba_it = l_deconfigList.begin(); + pMba_it != l_deconfigList.end(); + ++pMba_it) + { + TargetHandle_t pMba = *pMba_it; + HWAS_INF("deconfigByAssoc MBA matched (bA): %.8X", + get_huid(pMba)); + _deconfigureByAssoc(*pMba, i_errlEid); + } // for + break; + } // TYPE_MBA - case TYPE_DIMM: - { - // get deconfigure parent MBA - TargetHandleList pParentMbaList; - getParentAffinityTargets(pParentMbaList, &i_target, - CLASS_UNIT, TYPE_MBA, true /*functional*/); - HWAS_ASSERT((pParentMbaList.size() <= 1), - "HWAS deconfigByAssoc: pParentMbaList > 1"); - - // if parent MBA hasn't already been deconfigured - if (!pParentMbaList.empty()) + case TYPE_DIMM: { - const Target *l_parentMba = pParentMbaList[0]; - HWAS_INF("deconfigByAssoc DIMM parent MBA: %.8X", - get_huid(l_parentMba)); - _deconfigureTarget(const_cast<Target &> (*l_parentMba), - i_errlEid); - _deconfigureByAssoc(const_cast<Target &> (*l_parentMba), - i_errlEid); - } - break; - } // TYPE_DIMM + // get deconfigure parent MBA + TargetHandleList pParentMbaList; + getParentAffinityTargets(pParentMbaList, &i_target, + CLASS_UNIT, TYPE_MBA, true /*functional*/); + HWAS_ASSERT((pParentMbaList.size() <= 1), + "HWAS _deconfigureByAssoc: pParentMbaList > 1"); + + // if parent MBA hasn't already been deconfigured + if (!pParentMbaList.empty()) + { + const Target *l_parentMba = pParentMbaList[0]; + HWAS_INF("deconfigByAssoc DIMM parent MBA: %.8X", + get_huid(l_parentMba)); + _deconfigureTarget(const_cast<Target &> (*l_parentMba), + i_errlEid); + _deconfigureByAssoc(const_cast<Target &> (*l_parentMba), + i_errlEid); + } + break; + } // TYPE_DIMM - // If target is a bus endpoint, deconfigure its peer - case TYPE_XBUS: - case TYPE_ABUS: - { - // Get peer endpoint target - const Target * l_pDstTarget = i_target. - getAttr<ATTR_PEER_TARGET>(); - // If target is valid - if (l_pDstTarget) + // If target is a bus endpoint, deconfigure its peer + case TYPE_XBUS: + case TYPE_ABUS: { - // Deconfigure peer endpoint - HWAS_INF("deconfigByAssoc BUS Peer: %.8X", - get_huid(l_pDstTarget)); - _deconfigureTarget(const_cast<Target &> (*l_pDstTarget), - i_errlEid); - } + // Get peer endpoint target + const Target * l_pDstTarget = i_target. + getAttr<ATTR_PEER_TARGET>(); + // If target is valid + if (l_pDstTarget) + { + // Deconfigure peer endpoint + HWAS_INF("deconfigByAssoc BUS Peer: %.8X", + get_huid(l_pDstTarget)); + _deconfigureTarget(const_cast<Target &> (*l_pDstTarget), + i_errlEid); + } + break; + } // TYPE_XBUS, TYPE_ABUS + default: + // no action break; - } // TYPE_XBUS, TYPE_ABUS - default: - // no action - break; - } // switch + } // switch + } // !i_atRunTime //HWAS_INF("deconfigByAssoc exiting: %.8X", get_huid(&i_target)); } // _deconfigByAssoc //****************************************************************************** -uint32_t DeconfigGard::getDeconfigureStatus() +uint32_t DeconfigGard::getDeconfigureStatus() const { // no lock needed - just return the value. uint32_t l_deconfigCount = iv_deconfigCount; |

