summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/nvdimm
diff options
context:
space:
mode:
authorTsung Yeung <tyeung@us.ibm.com>2019-07-17 15:43:48 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-07-24 14:36:36 -0500
commitd97b70655dd205e4c9dea2c731acbd100404c3d1 (patch)
tree37cd3bfe9421558ab193a1089c89ea4f915d4ad7 /src/usr/isteps/nvdimm
parent8cc600d326917bda81cbfabc28efc3482b3dbe12 (diff)
downloadtalos-hostboot-d97b70655dd205e4c9dea2c731acbd100404c3d1.tar.gz
talos-hostboot-d97b70655dd205e4c9dea2c731acbd100404c3d1.zip
Invalidate BAR during MPIPL NVDIMM restore
This is a preventive measure to avoid access from the proc to step on the restore. Change-Id: I8d190f1cf2d49663ee40caaae56cb3b63e7b5d0c CQ:SW470208 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/80571 Reviewed-by: Matt Derksen <mderkse1@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Corey V Swenson <cswenson@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/isteps/nvdimm')
-rw-r--r--src/usr/isteps/nvdimm/nvdimm.C45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C
index 53f5ae5fd..984105408 100644
--- a/src/usr/isteps/nvdimm/nvdimm.C
+++ b/src/usr/isteps/nvdimm/nvdimm.C
@@ -972,6 +972,7 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList, uint8_t &i_mpipl)
// is de-asserted before kicking off the restore
if (i_mpipl)
{
+ TRACFCOMP(g_trac_nvdimm, "nvdimmRestore(): in MPIPL");
FAPI_INVOKE_HWP(l_err, mss::ddr_resetn, l_fapi_mca, HIGH);
if (l_err)
@@ -987,6 +988,23 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList, uint8_t &i_mpipl)
// Leaving this comment here as a reminder, will remove later
break;
}
+
+ // In MPIPL, invalidate the BAR to prevent any traffic from stepping on
+ // the restore
+ FAPI_INVOKE_HWP(l_err, mss::nvdimm::change_bar_valid_state, l_fapi_mca, LOW);
+
+ // This should not fail at all (scom read/write). If it does, post an informational log
+ // to leave some breadcrumbs
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmRestore() HUID[%X] i_mpipl[%u] failed to invalidate BAR!",
+ get_huid(*it), i_mpipl);
+
+ l_err->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
+ l_err->collectTrace(NVDIMM_COMP_NAME, 256);
+ ERRORLOG::errlCommit(l_err, NVDIMM_COMP_ID);
+ }
+
}
// Self-refresh is done at the port level
@@ -1141,6 +1159,33 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList, uint8_t &i_mpipl)
}
}
+ if (i_mpipl)
+ {
+ for (const auto & l_nvdimm : i_nvdimmList)
+ {
+ TargetHandleList l_mcaList;
+ errlHndl_t err = nullptr;
+ getParentAffinityTargets(l_mcaList, l_nvdimm, CLASS_UNIT, TYPE_MCA);
+ assert(l_mcaList.size(), "nvdimmRestore() failed to find parent MCA.");
+
+ // Re-validate the BAR after restore
+ fapi2::Target<fapi2::TARGET_TYPE_MCA> l_fapi_mca(l_mcaList[0]);
+ FAPI_INVOKE_HWP(err, mss::nvdimm::change_bar_valid_state, l_fapi_mca, HIGH);
+
+ // This should not fail at all (scom read/write). If it does, post an informational log
+ // to leave some breadcrumbs
+ if (err)
+ {
+ TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmRestore() HUID[%X] i_mpipl[%u] failed to invalidate BAR!",
+ get_huid(l_nvdimm), i_mpipl);
+
+ err->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
+ err->collectTrace(NVDIMM_COMP_NAME, 256);
+ ERRORLOG::errlCommit(err, NVDIMM_COMP_ID);
+ }
+ }
+ }
+
}while(0);
TRACUCOMP(g_trac_nvdimm, EXIT_MRK"nvdimmRestore() restore completed!!");
OpenPOWER on IntegriCloud