diff options
author | MATTHEW I. HICKMAN <matthew.hickman@ibm.com> | 2019-09-09 15:04:51 -0500 |
---|---|---|
committer | Daniel M Crowell <dcrowell@us.ibm.com> | 2019-09-25 13:39:11 -0500 |
commit | b23632654208299109c98b42a30e3935424330ed (patch) | |
tree | 3c5c8b41562c49201cf9e7ae3a307e447a5fe15a | |
parent | 913c6fde1d0e495674c9560139615ade57e49349 (diff) | |
download | talos-hostboot-b23632654208299109c98b42a30e3935424330ed.tar.gz talos-hostboot-b23632654208299109c98b42a30e3935424330ed.zip |
Fixed pre-req check during NVDimm Arm
CQ:SW475280
Change-Id: I15634923e18dfecb18146e9ec33ed128111f517c
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/83484
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: TSUNG K YEUNG <tyeung@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
-rw-r--r-- | src/usr/isteps/nvdimm/runtime/nvdimm_rt.C | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C index 2e0903086..6ff35cf6b 100644 --- a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C +++ b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C @@ -62,7 +62,7 @@ namespace NVDIMM static constexpr uint64_t DARN_ERROR_CODE = 0xFFFFFFFFFFFFFFFFull; static constexpr uint32_t MAX_DARN_ERRORS = 10; - +static constexpr uint8_t FW_OPS_UPDATE = 0x04; /** * @brief This function polls the command status register for arm completion * (does not indicate success or fail) @@ -164,6 +164,8 @@ bool nvdimmArm(TargetHandleList &i_nvdimmTargetList) bool l_continue = true; bool l_arm_timeout = false; uint8_t l_data; + uint8_t l_ready; + uint8_t l_fwupdate; auto l_RegInfo = nvdimm_reg_t(); uint64_t l_writeData; uint32_t l_writeAddress; @@ -175,6 +177,64 @@ bool nvdimmArm(TargetHandleList &i_nvdimmTargetList) errlHndl_t l_err = nullptr; errlHndl_t l_err_t = nullptr; + // Prerequisite Arm Checks + for (auto const l_nvdimm : i_nvdimmTargetList) + { + do + { + // Read out the Module Health status register + l_err = nvdimmReadReg(l_nvdimm, MODULE_HEALTH_STATUS0, l_data); + if (l_err) + { + TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmArm() nvdimm[%X] - failed to read Module Health Status", + get_huid(l_nvdimm)); + errlCommit( l_err, NVDIMM_COMP_ID ); + l_continue = false; + break; + } + // Read out the NVDimm Ready register + l_err = nvdimmReadReg(l_nvdimm, NVDIMM_READY, l_ready); + if (l_err) + { + TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmArm() nvdimm[%X] - failed to read NVDimm Ready register", + get_huid(l_nvdimm)); + errlCommit( l_err, NVDIMM_COMP_ID ); + l_continue = false; + break; + } + // Read out the FW OPs Status register + l_err = nvdimmReadReg(l_nvdimm, FIRMWARE_OPS_STATUS, l_fwupdate); + if (l_err) + { + TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmArm() nvdimm[%X] - failed to read Firmware OPs Status register", + get_huid(l_nvdimm)); + errlCommit( l_err, NVDIMM_COMP_ID ); + l_continue = false; + } + + }while(0); + + // Check ARM pre-requisites + if ((!l_continue) || (l_data & NVM_LIFETIME_ERROR) + || (l_ready != NV_READY) + || (l_fwupdate & FW_OPS_UPDATE)) + { + TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmArm() nvdimm[%X] - failed NVDimm Arm prechecks", + get_huid(l_nvdimm)); + + // Disarming all dimms due to error + nvdimmDisarm(i_nvdimmTargetList); + + l_err = notifyNvdimmProtectionChange(l_nvdimm, NVDIMM_DISARMED); + if (l_err) + { + errlCommit( l_err, NVDIMM_COMP_ID ); + } + + return false; + } + } + // Mask MBACALFIR EventN to separate ARM handling for (TargetHandleList::iterator it = i_nvdimmTargetList.begin(); it != i_nvdimmTargetList.end();) |