summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/nvdimm/nvdimm.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/isteps/nvdimm/nvdimm.C')
-rw-r--r--src/usr/isteps/nvdimm/nvdimm.C94
1 files changed, 32 insertions, 62 deletions
diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C
index d98397edb..13ecf0af5 100644
--- a/src/usr/isteps/nvdimm/nvdimm.C
+++ b/src/usr/isteps/nvdimm/nvdimm.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2014,2018 */
+/* Contributors Listed Below - COPYRIGHT 2014,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -32,12 +32,12 @@
#include <targeting/common/commontargeting.H>
#include <targeting/common/util.H>
#include <targeting/common/utilFilter.H>
-#include <kernel/timemgr.H>
#include <sys/time.h>
#include <usr/devicefw/userif.H>
#include <fapi2.H>
#include <fapi2/plat_hwp_invoker.H>
#include <lib/dimm/ddr4/nvdimm_utils.H>
+#include <lib/mc/port.H>
#include <isteps/nvdimm/nvdimm.H>
using namespace TARGETING;
@@ -45,7 +45,7 @@ using namespace DeviceFW;
using namespace EEPROM;
trace_desc_t* g_trac_nvdimm = NULL;
-TRAC_INIT(&g_trac_nvdimm, "NVDIMM", 2*KILOBYTE);
+TRAC_INIT(&g_trac_nvdimm, NVDIMM_COMP_NAME, 2*KILOBYTE);
// Easy macro replace for unit testing
// #define TRACUCOMP(args...) TRACFCOMP(args)
@@ -61,19 +61,6 @@ namespace NVDIMM
#define NVDIMM_SET_USER_DATA_2_TIMEOUT(left_32_polled, right_32_timeout) \
NVDIMM_SET_USER_DATA_1(left_32_polled, right_32_timeout)
-enum
-{
- NSTD_VAL_NOPRSV = 0x08, // memory valid, contents not preserved (genesis)
- NSTD_VAL_NOPRSV_MASK = 0xF7,
- NSTD_VAL_PRSV = 0x04, // memory contents preserved
- NSTD_VAL_PRSV_MASK = 0xFB,
- NSTD_ERR_NOPRSV = 0x02, // memory failed to preserve contents
- NSTD_ERR_NOPRSV_MASK = 0xFD,
- NSTD_ERR_NOBKUP = 0x01, // memory unable to preserve future content
- NSTD_ERR_NOBKUP_MASK = 0xFE,
- NSTD_ERR = 0x03, // NSTD_ERR_NOPRSV+NSTD_ERR_NOBKUP
-};
-
typedef struct ops_timeoutInfo{
const char * desc;
uint8_t page;
@@ -83,7 +70,10 @@ typedef struct ops_timeoutInfo{
uint8_t status_progress;
} ops_timeoutInfo_t;
-static bool init = true;
+#ifndef __HOSTBOOT_RUNTIME
+// Init flag to be used upon initial entry to initialize NV_OPS_TIMEOUT_MSEC
+static bool init_nv_timeout = true;
+#endif
// Table containing register info on the timeout registers for different ops
constexpr ops_timeoutInfo_t timeoutInfoTable[] =
@@ -686,7 +676,10 @@ errlHndl_t nvdimmCheckArmSuccess(Target *i_nvdimm)
/**
* @brief This function arms the trigger to enable backup in the event
- * of power loss (DDR Reset_n goes low)
+ * of power loss (DDR Reset_n goes low) in conjunction with
+ * ATOMIC_SAVE_AND_ERASE. A separate erase command is not required
+ * as the image will get erased immediately before backup on the
+ * next catastrophic event.
*
* @param[in] i_nvdimm - nvdimm target with NV controller
*
@@ -700,7 +693,10 @@ errlHndl_t nvdimmArmResetN(Target *i_nvdimm)
errlHndl_t l_err = nullptr;
- l_err = nvdimmWriteReg(i_nvdimm, ARM_CMD, ARM_DIMM);
+ // Setting ATOMIC_SAVE_AND_ERASE in conjunction with ARM_RESETN. With this,
+ // the content of the persistent data is not erased until immediately after
+ // the next catastrophic event has occurred.
+ l_err = nvdimmWriteReg(i_nvdimm, ARM_CMD, ARM_RESETN_AND_ATOMIC_SAVE_AND_ERASE);
if (l_err)
{
@@ -760,6 +756,7 @@ errlHndl_t nvdimmValidImage(Target *i_nvdimm, bool &o_imgValid)
return l_err;
}
+#ifndef __HOSTBOOT_RUNTIME
/**
* @brief This function handles all the restore related operations.
* SRE -> restore -> SRX/RCD/MRS
@@ -775,6 +772,8 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList)
bool l_imgValid;
uint8_t l_rstrValid;
uint32_t l_poll = 0;
+ TARGETING::Target* l_sys = NULL;
+ targetService().getTopLevelTarget(l_sys);
do
{
@@ -864,9 +863,9 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList)
//@TODO RTC 199645 - add HW callout on dimm target
//Restore is taking longer than the allotted time here.
nvdimmSetStatusFlag(l_nvdimm, NSTD_ERR_NOPRSV);
- errlCommit(l_err, NVDIMM_COMP_ID);
TRACFCOMP(g_trac_nvdimm, ERR_MRK"NDVIMM HUID[%X], error restoring!",
TARGETING::get_huid(l_nvdimm));
+ errlCommit(l_err, NVDIMM_COMP_ID);
break;
}
}
@@ -963,6 +962,7 @@ errlHndl_t nvdimmRestore(TargetHandleList i_nvdimmList)
return l_err;
}
+#endif
/**
* @brief This function checks the erase status register to make sure
@@ -1249,6 +1249,7 @@ errlHndl_t nvdimmGetTimeoutVal(Target* i_nvdimm)
return l_err;
}
+#ifndef __HOSTBOOT_RUNTIME
/**
* @brief Entry function to NVDIMM management
* - Restore image from NVDIMM NAND flash to DRAM
@@ -1261,7 +1262,7 @@ errlHndl_t nvdimmGetTimeoutVal(Target* i_nvdimm)
*/
void nvdimm_restore(TargetHandleList &i_nvdimmList)
{
- TRACUCOMP(g_trac_nvdimm, ENTER_MRK"nvdimm_restore()");
+ TRACFCOMP(g_trac_nvdimm, ENTER_MRK"nvdimm_restore()");
errlHndl_t l_err = nullptr;
do
@@ -1283,13 +1284,12 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
if (l_err)
{
- errlCommit( l_err, NVDIMM_COMP_ID );
-
// @TODO-RTC:200275-Make logic generic for all system configs
// Because of interleaving, if one is garded the other one
// in the pair should be garded by association. So, let's
// move on since there is nothing else to do.
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing open page");
+ errlCommit( l_err, NVDIMM_COMP_ID );
break;
}
@@ -1310,9 +1310,8 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
// If this failing right off the bat,
// something isn't quite right with
// the module
- errlCommit(l_err, NVDIMM_COMP_ID);
-
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing nvdimmReady()");
+ errlCommit(l_err, NVDIMM_COMP_ID);
break;
}
@@ -1328,13 +1327,13 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
// This will prevent future backup, but let's continue
// since we can still restore the data if there is any
nvdimmSetStatusFlag(l_nvdimm, NSTD_ERR_NOBKUP);
- errlCommit( l_err, NVDIMM_COMP_ID );
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing nvdimmSetESPolicy()");
+ errlCommit( l_err, NVDIMM_COMP_ID );
}
}
// Get the timeout values for the major ops at init
- if (init){
+ if (init_nv_timeout){
for (const auto & l_nvdimm : i_nvdimmList){
l_err = nvdimmGetTimeoutVal(l_nvdimm);
if (l_err)
@@ -1343,13 +1342,13 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
break;
}
}
- init = false;
+ init_nv_timeout = false;
}
if (l_err)
{
- errlCommit( l_err, NVDIMM_COMP_ID );
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing nvdimmGetTimeoutVal()");
+ errlCommit( l_err, NVDIMM_COMP_ID );
break;
}
@@ -1368,8 +1367,8 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
if (l_err)
{
- errlCommit( l_err, NVDIMM_COMP_ID );
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing open page");
+ errlCommit( l_err, NVDIMM_COMP_ID );
break;
}
@@ -1378,8 +1377,8 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
if (l_err)
{
- errlCommit( l_err, NVDIMM_COMP_ID );
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimm_restore() - Failing nvdimmRestore()");
+ errlCommit( l_err, NVDIMM_COMP_ID );
break;
}
@@ -1397,39 +1396,10 @@ void nvdimm_restore(TargetHandleList &i_nvdimmList)
}
}
- // @TODO move arm and erase to pm_common.C, after occ has started
-
- // From this point forward, we only want to set up the trigger on the
- // nvdimm that is not in error state. Any nvdimm in error state will
- // get to preserve the data previously saved and recover if needed.
-
- // Arm the nvdimm to trigger save on RESET_n
- // and erase the image
- for (const auto & l_nvdimm : i_nvdimmList)
- {
- // skip if the nvdimm is in error state
- if (nvdimmInErrorState(l_nvdimm))
- {
- continue;
- }
-
- l_err = nvdimmArmResetN(l_nvdimm);
- if (l_err)
- {
- nvdimmSetStatusFlag(l_nvdimm, NSTD_ERR_NOBKUP);
- errlCommit( l_err, NVDIMM_COMP_ID );
- continue;
- }
-
- l_err = nvdimmEraseNF(l_nvdimm);
- if (l_err){
- errlCommit( l_err, NVDIMM_COMP_ID );
- nvdimmSetStatusFlag(l_nvdimm, NSTD_ERR_NOBKUP);
- }
- }
}while(0);
- TRACUCOMP(g_trac_nvdimm, EXIT_MRK"nvdimm_restore()");
+ TRACFCOMP(g_trac_nvdimm, EXIT_MRK"nvdimm_restore()");
}
+#endif
} // end NVDIMM namespace
OpenPOWER on IntegriCloud