From b221671e58f5acf1d088e31d3706b11ed7602f3d Mon Sep 17 00:00:00 2001 From: Matt Derksen Date: Wed, 2 Oct 2019 13:24:01 -0500 Subject: [PATCH] NVDIMM Erase error handle not working in IPL Arm handling NVDIMM erase error handling is failing because nvdimmDisarm() checks ATTR_NVDIMM_ARMED before disarming the nvdimm. Disarming an nvdimm that is already disarmed should not be harmful. Also erase error should correctly set the error status as 0x01 (memory unable to preserve future content) Change-Id: I8a710343478691c87f1570fd30074c2543d3373c CQ: SW477541 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84662 Reviewed-by: TSUNG K YEUNG Tested-by: Jenkins Server Reviewed-by: Corey V Swenson Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Tested-by: Jenkins OP HW Reviewed-by: Nicholas E Bofferding --- src/usr/isteps/nvdimm/nvdimm.C | 6 +++--- src/usr/isteps/nvdimm/runtime/nvdimm_rt.C | 9 --------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C index bf2af1cde60..b8f9ad3551b 100644 --- a/src/usr/isteps/nvdimm/nvdimm.C +++ b/src/usr/isteps/nvdimm/nvdimm.C @@ -1402,7 +1402,7 @@ errlHndl_t nvdimmEraseCheck(Target *i_nvdimm, bool i_statusOnly) l_err = nvdimmReadReg ( i_nvdimm, ERASE_STATUS, l_data); if (l_err) { - nvdimmSetStatusFlag(i_nvdimm, NSTD_ERR); + nvdimmSetStatusFlag(i_nvdimm, NSTD_VAL_DISARMED); TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm[%X], failed to read erase status", get_huid(i_nvdimm)); break; @@ -1421,7 +1421,7 @@ errlHndl_t nvdimmEraseCheck(Target *i_nvdimm, bool i_statusOnly) l_err = nvdimmValidImage( i_nvdimm, l_valid ); if (l_err) { - nvdimmSetStatusFlag(i_nvdimm, NSTD_ERR); + nvdimmSetStatusFlag(i_nvdimm, NSTD_VAL_DISARMED); TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm[%X] Failed to detect valid image", get_huid(i_nvdimm)); break; @@ -1430,7 +1430,7 @@ errlHndl_t nvdimmEraseCheck(Target *i_nvdimm, bool i_statusOnly) if ( (l_data & ERASE_ERROR) || l_valid ) { - nvdimmSetStatusFlag(i_nvdimm, NSTD_ERR); + nvdimmSetStatusFlag(i_nvdimm, NSTD_VAL_DISARMED); TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm[%X] NVDimm Erase failed due to error (ERASE_STATUS: 0x%02X, Image %s)", get_huid(i_nvdimm), l_data, l_valid?"not erased":"erased"); /*@ diff --git a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C index defcdd626a1..b0e20d46eb7 100644 --- a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C +++ b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C @@ -844,15 +844,6 @@ bool nvdimmDisarm(TargetHandleList &i_nvdimmTargetList) for (auto const l_nvdimm : i_nvdimmTargetList) { - // skip if the nvdimm is already disarmed - ATTR_NVDIMM_ARMED_type l_armed_state = {}; - l_armed_state = l_nvdimm->getAttr(); - if (!l_armed_state.armed) - { - TRACFCOMP(g_trac_nvdimm, "nvdimmDisarm() nvdimm[%X] called when already disarmed", get_huid(l_nvdimm)); - continue; - } - l_err = NVDIMM::nvdimmChangeArmState(l_nvdimm, DISARM_TRIGGER); // If we run into any error here we will just // commit the error log and move on. Let the