summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H3
-rw-r--r--src/usr/isteps/nvdimm/nvdimm_update.C80
-rwxr-xr-xsrc/usr/targeting/common/genHwsvMrwXml.pl5
3 files changed, 46 insertions, 42 deletions
diff --git a/src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H b/src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H
index 142d36bd9..0b1680d92 100644
--- a/src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H
+++ b/src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H
@@ -84,6 +84,7 @@ enum nvdimmModuleId
CLEAR_FW_DATA_BLOCK = 0x22,
VALIDATE_FW_IMAGE = 0x23,
WAIT_FW_OPS_BLOCK_RECEIVED = 0x24,
+ NVDIMM_IS_UPDATE_NEEDED = 0x25,
};
/**
@@ -133,7 +134,7 @@ enum nvdimmReasonCode
NVDIMM_DATA_SIZE_INVALID = NVDIMM_COMP_ID | 0x24, // Data size is invalid
NVDIMM_BLOCK_NOT_RECEIVED = NVDIMM_COMP_ID | 0x25, // Block data not received
NVDIMM_FW_OPS_NOT_SUCCESSFUL = NVDIMM_COMP_ID | 0x26, // Unsuccessful Firmware Operation
- NVDIMM_BASE_SERVICES_NOT_READY = NVDIMM_COMP_ID | 0x27, // spBaseServices not ready for LID access
+ NVDIMM_UPDATE_NOT_SUPPORTED = NVDIMM_COMP_ID | 0x27, // NV controller cannot be updated
};
enum UserDetailsTypes
diff --git a/src/usr/isteps/nvdimm/nvdimm_update.C b/src/usr/isteps/nvdimm/nvdimm_update.C
index 7dea83740..8f95fb27f 100644
--- a/src/usr/isteps/nvdimm/nvdimm_update.C
+++ b/src/usr/isteps/nvdimm/nvdimm_update.C
@@ -785,13 +785,8 @@ errlHndl_t NvdimmInstalledImage::updateImageData(NvdimmLidImage * i_lidImage)
fw_img_data_len,
region_size,
0x00000000),
- ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT );
l_err->collectTrace( NVDIMM_COMP_NAME, 256 );
- l_err->addPartCallout( iv_dimm,
- HWAS::NV_CONTROLLER_PART_TYPE,
- HWAS::SRCI_PRIORITY_HIGH );
- l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_LOW );
break;
}
@@ -1344,13 +1339,7 @@ errlHndl_t NvdimmInstalledImage::byteRegionBlockTransfer(const uint8_t * i_data,
max_blocks_per_region*BYTES_PER_BLOCK,
blocks_per_region,
max_blocks_per_region),
- ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
- l_err->collectTrace(NVDIMM_COMP_NAME, 256 );
- l_err->addPartCallout( iv_dimm,
- HWAS::NV_CONTROLLER_PART_TYPE,
- HWAS::SRCI_PRIORITY_HIGH );
- l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_LOW );
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT );
break;
}
}
@@ -1385,13 +1374,7 @@ errlHndl_t NvdimmInstalledImage::byteRegionBlockTransfer(const uint8_t * i_data,
BYTES_PER_BLOCK*blocks_per_region,
blocks_per_region,
BYTES_PER_BLOCK),
- ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
- l_err->collectTrace(NVDIMM_COMP_NAME, 256 );
- l_err->addPartCallout( iv_dimm,
- HWAS::NV_CONTROLLER_PART_TYPE,
- HWAS::SRCI_PRIORITY_HIGH );
- l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_LOW );
+ ERRORLOG::ErrlEntry::ADD_SW_CALLOUT );
break;
}
@@ -1999,25 +1982,7 @@ bool NvdimmsUpdate::runUpdate(void)
TRACFCOMP(g_trac_nvdimm_upd, "NvdimmsUpdate::runUpdate() - "
"spBaseServices not running, therefore NVDIMM LID images "
"cannot be accessed");
- /*
- *@errortype
- *@reasoncode NVDIMM_BASE_SERVICES_NOT_READY
- *@moduleid NVDIMM_RUN_UPDATE
- *@userdata1 NVDIMM_16GB_type list size
- *@userdata2 NVDIMM_32GB_type list size
- *@devdesc spBaseServices not available
- *@custdesc NVDIMM not updated
- */
- l_err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_PREDICTIVE,
- NVDIMM_RUN_UPDATE,
- NVDIMM_BASE_SERVICES_NOT_READY,
- v_NVDIMM_16GB_list.size(),
- v_NVDIMM_32GB_list.size(),
- ERRORLOG::ErrlEntry::ADD_SW_CALLOUT );
- l_err->collectTrace(NVDIMM_COMP_NAME, 256 );
- l_err->collectTrace(NVDIMM_UPD, 256);
- ERRORLOG::errlCommit(l_err, NVDIMM_COMP_ID);
- o_no_error_found = false;
+ // potential openpower support in future, so don't throw an error
break;
}
} while (0); // end of flash update section
@@ -2063,6 +2028,43 @@ errlHndl_t NvdimmsUpdate::isUpdateNeeded(bool & o_update_needed,
break;
}
+ // Put a check here for non-updateable SMART NVDIMMs.
+ // Anything before 0x0030 should bypass the update, as update
+ // would fail due to a bug in the backlevel firmware on the
+ // nvdimm card
+ if (le16toh(curVersion) < 0x0030)
+ {
+ TRACFCOMP(g_trac_nvdimm_upd,
+ "isUpdateNeeded(): non-updatable SMART NVDIMM 0x%.8X "
+ "(0x%04X)",
+ TARGETING::get_huid(l_dimm), le16toh(curVersion));
+ /*
+ *@errortype
+ *@reasoncode NVDIMM_UPDATE_NOT_SUPPORTED
+ *@moduleid NVDIMM_IS_UPDATE_NEEDED
+ *@userdata1[0:31] NVDIMM version level
+ *@userdata1[32:63] NVDIMM Target Huid
+ *@userdata2 NVDIMM type (manufacturer and product)
+ *@devdesc Unable to update an NVDIMM at this code level
+ *@custdesc NVDIMM not updated
+ */
+ l_err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_PREDICTIVE,
+ NVDIMM_IS_UPDATE_NEEDED,
+ NVDIMM_UPDATE_NOT_SUPPORTED,
+ TWO_UINT32_TO_UINT64(
+ curVersion,
+ TARGETING::get_huid(l_dimm)),
+ curType,
+ ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
+ l_err->collectTrace( NVDIMM_UPD, 256 );
+ l_err->addPartCallout( l_dimm,
+ HWAS::NV_CONTROLLER_PART_TYPE,
+ HWAS::SRCI_PRIORITY_HIGH );
+ l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_LOW );
+ break;
+ }
+
if (curVersion != lidVersion)
{
// verify we are updating with a good version
diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl
index 72e5e9b05..adc8d179a 100755
--- a/src/usr/targeting/common/genHwsvMrwXml.pl
+++ b/src/usr/targeting/common/genHwsvMrwXml.pl
@@ -6142,6 +6142,7 @@ sub generate_is_dimm
# Add EEPROM_NV_INFO i2c config
# Base address for the NV controller is 0x80
# piggybacking the last nibble of devAddr from $dimmI2C to build the device address
+ # NOTE: writeCycleTime is not used for NV as code update needs it at a faster rate then msec
print "
<attribute>
<id>EEPROM_NV_INFO</id>
@@ -6154,7 +6155,7 @@ sub generate_is_dimm
<field><id>maxMemorySizeKB</id><value>0x01</value></field>
<field><id>chipCount</id><value>0x01</value></field>
<field><id>writePageSize</id><value>0x01</value></field>
- <field><id>writeCycleTime</id><value>0x05</value></field>
+ <field><id>writeCycleTime</id><value>0xFFBADFFBADFFBADF</value></field>
</default>
</attribute>
";
@@ -7125,7 +7126,7 @@ sub addI2cBusSpeedArray
my $tmp_ct eq "";
# bus_speed_array[engine][port] is 4x13 array
- # Hardcoding speed_array[3][1] for nvdimm as NVDIMM is current
+ # Hardcoding speed_array[3][1] for nvdimm as NVDIMM is current
# not in mrw for ZZ (last gen of serverwiz1)
my @speed_array = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
OpenPOWER on IntegriCloud