summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/isteps/nvdimm/bpm_update.C79
-rw-r--r--src/usr/targeting/common/xmltohb/attribute_types.xml56
-rw-r--r--src/usr/targeting/common/xmltohb/target_types.xml3
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>
OpenPOWER on IntegriCloud