diff --git a/src/usr/isteps/expupd/expupd.C b/src/usr/isteps/expupd/expupd.C index 74231b5a5b9..3f63ac19150 100644 --- a/src/usr/isteps/expupd/expupd.C +++ b/src/usr/isteps/expupd/expupd.C @@ -132,6 +132,10 @@ void updateAll(IStepError& o_stepError) TARGETING::TargetHandleList l_ocmbTargetList; getAllChips(l_ocmbTargetList, TYPE_OCMB_CHIP); + Target* l_pTopLevel = nullptr; + targetService().getTopLevelTarget( l_pTopLevel ); + assert(l_pTopLevel, "expupd::updateAll: no TopLevelTarget"); + TRACFCOMP(g_trac_expupd, ENTER_MRK "updateAll: %d ocmb chips found", l_ocmbTargetList.size()); @@ -144,6 +148,18 @@ void updateAll(IStepError& o_stepError) break; } + // Check if we have any overrides to force our behavior + auto l_forced_behavior = + l_pTopLevel->getAttr(); + + // Exit now if told to + if( TARGETING::OCMB_FW_UPDATE_BEHAVIOR_PREVENT_UPDATE + == l_forced_behavior ) + { + TRACFCOMP(g_trac_expupd, INFO_MRK "Skipping update due to override (PREVENT_UPDATE)"); + break; + } + // Read explorer fw image from pnor PNOR::SectionInfo_t l_pnorSectionInfo; rawImageInfo_t l_imageInfo; @@ -269,6 +285,14 @@ void updateAll(IStepError& o_stepError) "updateAll: SHA512 hash for ocmb[0x%08x]" " matches SHA512 hash of PNOR image.", TARGETING::get_huid(l_ocmbTarget)); + + // Add every OCMB to the update list if told to + if( TARGETING::OCMB_FW_UPDATE_BEHAVIOR_FORCE_UPDATE + == l_forced_behavior ) + { + TRACFCOMP(g_trac_expupd, INFO_MRK "Forcing update due to override (FORCE_UPDATE)"); + l_flashUpdateList.push_back(l_ocmbTarget); + } } } @@ -276,6 +300,14 @@ void updateAll(IStepError& o_stepError) "updateAll: updating flash for %d OCMB chips", l_flashUpdateList.size()); + // Exit now if we were asked to only do the check portion + if( TARGETING::OCMB_FW_UPDATE_BEHAVIOR_CHECK_BUT_NO_UPDATE + == l_forced_behavior ) + { + TRACFCOMP(g_trac_expupd, INFO_MRK "Skipping update due to override (CHECK_BUT_NO_UPDATE)"); + break; + } + // update each explorer in the list of chips needing updates for(const auto & l_ocmb : l_flashUpdateList) { @@ -344,9 +376,6 @@ void updateAll(IStepError& o_stepError) { TRACFCOMP(g_trac_expupd, "updateAll: OCMB chip(s) was updated. Requesting reboot..."); - Target* l_pTopLevel = nullptr; - targetService().getTopLevelTarget( l_pTopLevel ); - assert(l_pTopLevel, "expupd::updateAll: no TopLevelTarget"); auto l_reconfigAttr = l_pTopLevel->getAttr(); l_reconfigAttr |= RECONFIGURE_LOOP_OCMB_FW_UPDATE; diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml index 9b4d6764e82..72842c83d38 100644 --- a/src/usr/targeting/common/xmltohb/attribute_types.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types.xml @@ -5446,6 +5446,48 @@ + + DEFAULT_ALL + Enumeration for the various OCMB Firmware update behaviors + + + CHECK_VERSIONS + 0 + + + + FORCE_UPDATE + 1 + + + + PREVENT_UPDATE + 2 + + + + CHECK_BUT_NO_UPDATE + 3 + + OCMB_FW_UPDATE_BEHAVIOR + + + + + Force specific behavior for the OCMB Firmware update function. + + OCMB_FW_UPDATE_OVERRIDE + + volatile + + + + + 2 + + + + Physical entity path an OMI's associated OMIC parent target diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index bc0858b5d15..737929ab933 100644 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -2124,6 +2124,9 @@ NVDIMM_ENCRYPTION_KEYS_FW + + OCMB_FW_UPDATE_OVERRIDE + O_EREPAIR_THRESHOLD_FIELD