diff options
-rw-r--r-- | src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H | 3 | ||||
-rw-r--r-- | src/usr/isteps/nvdimm/nvdimm_update.C | 80 | ||||
-rwxr-xr-x | src/usr/targeting/common/genHwsvMrwXml.pl | 5 |
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, |