Skip to content

Commit

Permalink
NVDIMM: Load warning thresholds, after FW_UPDATE, on every IPL
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
cvswen authored and dcrowell77 committed Aug 26, 2019
1 parent 4b8fb56 commit 2ad648b
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/include/usr/isteps/nvdimm/nvdimm.H
Expand Up @@ -72,6 +72,15 @@ errlHndl_t nvdimm_restore(TARGETING::TargetHandleList &i_nvdimmList);
bool nvdimm_update(TARGETING::TargetHandleList &i_nvdimmList);


/**
* @brief Entry function to set NVDIMM thresholds
*
* @param[in] i_nvdimmList - list of nvdimm targets
*
**/
void nvdimm_thresholds(TARGETING::TargetHandleList &i_nvdimmList);


#endif


Expand Down
3 changes: 3 additions & 0 deletions src/usr/isteps/istep21/call_nvdimm_update.C
Expand Up @@ -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()");
Expand Down
109 changes: 109 additions & 0 deletions src/usr/isteps/nvdimm/nvdimm.C
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 2ad648b

Please sign in to comment.