diff options
-rw-r--r-- | src/usr/isteps/nvdimm/bpm_update.C | 79 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/attribute_types.xml | 56 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/target_types.xml | 3 |
3 files changed, 131 insertions, 7 deletions
diff --git a/src/usr/isteps/nvdimm/bpm_update.C b/src/usr/isteps/nvdimm/bpm_update.C index 445ad0b63..09b9adf4c 100644 --- a/src/usr/isteps/nvdimm/bpm_update.C +++ b/src/usr/isteps/nvdimm/bpm_update.C @@ -33,10 +33,12 @@ #include <sys/time.h> #include <hbotcompid.H> #include <trace/interface.H> -#include <targeting/common/targetservice.H> #include <initservice/istepdispatcherif.H> #include <isteps/nvdimm/bpmreasoncodes.H> +#include <targeting/common/targetservice.H> +#include <attributeenums.H> + namespace NVDIMM { namespace BPM @@ -847,6 +849,17 @@ errlHndl_t Bpm::runUpdate(BpmFirmwareLidImage i_fwImage, break; } + // Get the sys target to check for attribute overrides. + TARGETING::Target* sys = nullptr; + TARGETING::targetService().getTopLevelTarget(sys); + + auto updateOverride = + sys->getAttr<TARGETING::ATTR_BPM_UPDATE_OVERRIDE>(); + + // Determine if updates are necessary and save that decision to + // influence attribute override behavior. + bool shouldPerformUpdate = true; + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " "Firmware version on the BPM 0x%.4X, " "Firmware version of image 0x%.4X.", @@ -854,6 +867,21 @@ errlHndl_t Bpm::runUpdate(BpmFirmwareLidImage i_fwImage, if (i_fwImage.getVersion() == bpmFwVersion) { + shouldPerformUpdate = false; + if (updateOverride == TARGETING::BPM_UPDATE_BEHAVIOR_DEFAULT_ALL) + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "Firmware version on the BPM matches the version in " + "the image. Skipping update."); + break; + } + } + + if (updateOverride == TARGETING::BPM_UPDATE_BEHAVIOR_SKIP_ALL) + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "ATTR_BPM_UPDATE_OVERRIDE set to SKIP_ALL. " + "Skipping update."); break; } @@ -876,16 +904,53 @@ errlHndl_t Bpm::runUpdate(BpmFirmwareLidImage i_fwImage, break; } - errl = runConfigUpdates(i_configImage); - if (errl != nullptr) + uint16_t configOverrideFlag = (updateOverride & 0x00FF); + if ((shouldPerformUpdate + || (configOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_FORCE_CONFIG)) + && !(configOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_SKIP_CONFIG)) { - break; + if (configOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_FORCE_CONFIG) + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "ATTR_BPM_UPDATE_OVERRIDE set to force config " + "portion of BPM updates. Running Config Update..."); + } + errl = runConfigUpdates(i_configImage); + if (errl != nullptr) + { + break; + } + } + else + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "ATTR_BPM_UPDATE_OVERRIDE set to skip config " + "portion of BPM updates. Skipping Config Update..."); } - errl = runFirmwareUpdates(i_fwImage); - if (errl != nullptr) + uint16_t firmwareOverrideFlag = (updateOverride & 0xFF00); + if ((shouldPerformUpdate + || (firmwareOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_FORCE_FW)) + && !(firmwareOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_SKIP_FW)) { - break; + if (firmwareOverrideFlag == TARGETING::BPM_UPDATE_BEHAVIOR_FORCE_FW) + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "ATTR_BPM_UPDATE_OVERRIDE set to force firmware " + "portion of BPM updates. Running Firmware Update..."); + } + + errl = runFirmwareUpdates(i_fwImage); + if (errl != nullptr) + { + break; + } + } + else + { + TRACFCOMP(g_trac_bpm, INFO_MRK"Bpm::runUpdate(): " + "ATTR_BPM_UPDATE_OVERRIDE set to skip firmware " + "portion of BPM updates. Skipping Firmware Update..."); } } while(0); diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml index b000c92d5..aae8b7e1f 100644 --- a/src/usr/targeting/common/xmltohb/attribute_types.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types.xml @@ -187,6 +187,62 @@ </simpleType> </attribute> + <enumerationType> + <default>DEFAULT_ALL</default> + <description>Enumeration for the various BPM update behaviors</description> + <enumerator> + <name>DEFAULT_ALL</name> + <value>0x0000</value> + </enumerator> + <enumerator> + <name>SKIP_ALL</name> + <value>0x1010</value> + </enumerator> + <enumerator> + <name>FORCE_ALL</name> + <value>0x1111</value> + </enumerator> + <enumerator> + <name>SKIP_FW</name> + <value>0x1000</value> + </enumerator> + <enumerator> + <name>FORCE_FW</name> + <value>0x1100</value> + </enumerator> + <enumerator> + <name>SKIP_CONFIG</name> + <value>0x0010</value> + </enumerator> + <enumerator> + <name>FORCE_CONFIG</name> + <value>0x0011</value> + </enumerator> + <enumerator> + <name>FORCE_CONFIG_SKIP_FW</name> + <value>0x1011</value> + </enumerator> + <enumerator> + <name>SKIP_CONFIG_FORCE_FW</name> + <value>0x1110</value> + </enumerator> + <id>BPM_UPDATE_BEHAVIOR</id> + </enumerationType> + + <attribute> + <id>BPM_UPDATE_OVERRIDE</id> + <description> + If non-zero then use value to determine which portion of BPM updates to + skip/force/default behavior. + </description> + <simpleType> + <uint16_t/> + </simpleType> + <persistency>volatile-zeroed</persistency> + <readable/> + <no_export/> + </attribute> + <attribute> <id>BRAZOS_RX_FIFO_OVERRIDE</id> <description> diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index 0e1ea2fdb..c5b466ebf 100644 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -1799,6 +1799,9 @@ <id>BOOT_FREQ_MHZ</id> </attribute> <attribute> + <id>BPM_UPDATE_OVERRIDE</id> + </attribute> + <attribute> <id>BRAZOS_RX_FIFO_OVERRIDE</id> </attribute> <attribute> |