summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMATTHEW I. HICKMAN <matthew.hickman@ibm.com>2019-09-09 15:04:51 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-09-25 13:39:11 -0500
commitb23632654208299109c98b42a30e3935424330ed (patch)
tree3c5c8b41562c49201cf9e7ae3a307e447a5fe15a
parent913c6fde1d0e495674c9560139615ade57e49349 (diff)
downloadtalos-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.C62
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();)
OpenPOWER on IntegriCloud