summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorCorey Swenson <cswenson@us.ibm.com>2019-08-16 14:29:03 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-08-26 09:23:13 -0500
commit2ad648b984b367565f74ae529fd619c0d11f7982 (patch)
treebb93ae57ba42f240dea80bfb5e8774d2ab2c1a75 /src/usr
parent4b8fb565e85f97cb9c803988a51db0f93b2d5e8d (diff)
downloadtalos-hostboot-2ad648b984b367565f74ae529fd619c0d11f7982.tar.gz
talos-hostboot-2ad648b984b367565f74ae529fd619c0d11f7982.zip
NVDIMM: Load warning thresholds, after FW_UPDATE, on every IPL
See defect for register list and hard-coded values Change-Id: Ibc32ddfcb4719388dd744aa946df62e27066a05c CQ:SW472435 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/82348 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Glenn Miles <milesg@ibm.com> Reviewed-by: Matt Derksen <mderkse1@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: Roland Veloz <rveloz@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/isteps/istep21/call_nvdimm_update.C3
-rw-r--r--src/usr/isteps/nvdimm/nvdimm.C109
2 files changed, 112 insertions, 0 deletions
diff --git a/src/usr/isteps/istep21/call_nvdimm_update.C b/src/usr/isteps/istep21/call_nvdimm_update.C
index 1204adb61..be1f5b22d 100644
--- a/src/usr/isteps/istep21/call_nvdimm_update.C
+++ b/src/usr/isteps/istep21/call_nvdimm_update.C
@@ -68,6 +68,9 @@ void call_nvdimm_update()
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"call_nvdimm_update(): nvdimm update failed");
}
+
+ // Set the threshold warnings
+ NVDIMM::nvdimm_thresholds(l_nvdimmTargetList);
}
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,EXIT_MRK"call_nvdimm_update()");
diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C
index 3e0d712ff..2858dc53c 100644
--- a/src/usr/isteps/nvdimm/nvdimm.C
+++ b/src/usr/isteps/nvdimm/nvdimm.C
@@ -130,6 +130,24 @@ static constexpr size_t MAX_TPM_SIZE = 34;
static constexpr uint8_t KEY_TERMINATE_BYTE = 0x00;
static constexpr uint8_t KEY_ABORT_BYTE = 0xFF;
+#ifndef __HOSTBOOT_RUNTIME
+// Warning thresholds
+static constexpr uint8_t THRESHOLD_ES_LIFETIME = 0x07; // 7%
+static constexpr uint8_t THRESHOLD_NVM_LIFETIME = 0x31; // 49%
+
+// 12 bit fixed point temperature in celsius degrees
+// with following bit format:
+// [15:13]Reserved
+// [12]Sign 0 = positive, 1 = negative The value of 0 C should be expressed as a positive value
+// [11]128 [10]64 [9]32 [8]16 [7]8 [6]4 [5]2 [4]1 [3]0.5 [2]0.25
+// [1]0.125 Optional for temperature reporting fields; not used for temperature threshold fields
+// [0]0.0625 Optional for temperature reporting fields; not used for temperature threshold fields
+static constexpr uint8_t THRESHOLD_ES_TEMP_HIGH_1 = 0x03; // 52.5 C
+static constexpr uint8_t THRESHOLD_ES_TEMP_HIGH_0 = 0x48; // 52.5 C
+static constexpr uint8_t THRESHOLD_ES_TEMP_LOW_1 = 0x00; // 2.5 C
+static constexpr uint8_t THRESHOLD_ES_TEMP_LOW_0 = 0x28; // 2.5 C
+#endif
+
// Definition of ENCRYPTION_KEY_VALIDATION -- page 5 offset 0x2A
typedef union {
uint8_t whole;
@@ -2080,6 +2098,97 @@ errlHndl_t nvdimm_init(Target *i_nvdimm)
}
+void nvdimm_thresholds(TARGETING::TargetHandleList &i_nvdimmList)
+{
+ TRACUCOMP(g_trac_nvdimm, ENTER_MRK"nvdimm_thresholds()");
+
+ errlHndl_t l_err = nullptr;
+
+ for (const auto & l_nvdimm : i_nvdimmList)
+ {
+ // ES_LIFETIME_WARNING_THRESHOLD
+ l_err = nvdimmWriteReg(l_nvdimm,
+ ES_LIFETIME_WARNING_THRESHOLD,
+ THRESHOLD_ES_LIFETIME);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting ES_LIFETIME_WARNING_THRESHOLD",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+
+ // NVM_LIFETIME_WARNING_THRESHOLD
+ l_err = nvdimmWriteReg(l_nvdimm,
+ NVM_LIFETIME_WARNING_THRESHOLD,
+ THRESHOLD_NVM_LIFETIME);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting NVM_LIFETIME_WARNING_THRESHOLD",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+
+ // ES_TEMP_WARNING_HIGH_THRESHOLD1
+ l_err = nvdimmWriteReg(l_nvdimm,
+ ES_TEMP_WARNING_HIGH_THRESHOLD1,
+ THRESHOLD_ES_TEMP_HIGH_1);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting ES_TEMP_WARNING_HIGH_THRESHOLD1",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+
+ // ES_TEMP_WARNING_HIGH_THRESHOLD0
+ l_err = nvdimmWriteReg(l_nvdimm,
+ ES_TEMP_WARNING_HIGH_THRESHOLD0,
+ THRESHOLD_ES_TEMP_HIGH_0);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting ES_TEMP_WARNING_HIGH_THRESHOLD0",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+
+ // ES_TEMP_WARNING_LOW_THRESHOLD1
+ l_err = nvdimmWriteReg(l_nvdimm,
+ ES_TEMP_WARNING_LOW_THRESHOLD1,
+ THRESHOLD_ES_TEMP_LOW_1);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting ES_TEMP_WARNING_LOW_THRESHOLD1",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+
+ // ES_TEMP_WARNING_LOW_THRESHOLD0
+ l_err = nvdimmWriteReg(l_nvdimm,
+ ES_TEMP_WARNING_LOW_THRESHOLD0,
+ THRESHOLD_ES_TEMP_LOW_0);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm,
+ ERR_MRK"nvdimm_thresholds() nvdimm[%X] "
+ "error setting ES_TEMP_WARNING_LOW_THRESHOLD0",
+ get_huid(l_nvdimm));
+ errlCommit( l_err, NVDIMM_COMP_ID );
+ }
+ }
+
+ TRACUCOMP(g_trac_nvdimm, EXIT_MRK"nvdimm_thresholds()");
+}
+
+
errlHndl_t nvdimm_getRandom(uint8_t* o_genData)
{
errlHndl_t l_err = nullptr;
OpenPOWER on IntegriCloud