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.C103
1 files changed, 102 insertions, 1 deletions
diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C
index 06f666c5c..3e9867ebe 100644
--- a/src/usr/isteps/nvdimm/nvdimm.C
+++ b/src/usr/isteps/nvdimm/nvdimm.C
@@ -28,6 +28,7 @@
#include <errl/errlentry.H>
#include <errl/errlmanager.H>
#include <errl/errludtarget.H>
+#include <errl/errludlogregister.H>
#include <targeting/common/commontargeting.H>
#include <targeting/common/util.H>
#include <targeting/common/utilFilter.H>
@@ -293,6 +294,11 @@ errlHndl_t nvdimmReadReg(Target* i_nvdimm,
DEVICE_NVDIMM_RAW_ADDRESS(l_reg_addr));
}while(0);
+ if (l_err)
+ {
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
+ }
+
TRACUCOMP(g_trac_nvdimm, EXIT_MRK"NVDIMM Read HUID 0x%X, page 0x%X, addr 0x%X = 0x%X",
get_huid(i_nvdimm), l_reg_page, l_reg_addr, o_data);
@@ -363,6 +369,11 @@ errlHndl_t nvdimmWriteReg(Target* i_nvdimm,
DEVICE_NVDIMM_RAW_ADDRESS(l_reg_addr));
}while(0);
+ if (l_err)
+ {
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
+ }
+
TRACUCOMP(g_trac_nvdimm, EXIT_MRK"NVDIMM Write HUID 0x%X, page = 0x%X, addr 0x%X = 0x%X",
get_huid(i_nvdimm), l_reg_page, l_reg_addr, i_data);
@@ -563,6 +574,7 @@ errlHndl_t nvdimmReady(Target *i_nvdimm)
// Add Register Traces to error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
}while(0);
@@ -694,6 +706,7 @@ errlHndl_t nvdimmPollStatus ( Target *i_nvdimm,
ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
l_err->collectTrace(NVDIMM_COMP_NAME);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
return l_err;
@@ -746,6 +759,7 @@ errlHndl_t nvdimmPollBackupDone(Target* i_nvdimm,
// Collect register data for FFDC Traces
nvdimmTraceRegs ( i_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -809,6 +823,7 @@ errlHndl_t nvdimmPollRestoreDone(Target* i_nvdimm,
// Collect register data for FFDC Traces
nvdimmTraceRegs ( i_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -863,7 +878,7 @@ errlHndl_t nvdimmPollEraseDone(Target* i_nvdimm,
ERRORLOG::ErrlEntry::NO_SW_CALLOUT );
l_err->collectTrace( NVDIMM_COMP_NAME );
-
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
TRACUCOMP(g_trac_nvdimm, EXIT_MRK"nvdimmPollEraseDone() nvdimm[%X]",
@@ -1007,6 +1022,7 @@ errlHndl_t nvdimmSetESPolicy(Target* i_nvdimm)
// Read relevant regs for trace data
nvdimmTraceRegs(i_nvdimm, l_RegInfo);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -1246,6 +1262,7 @@ errlHndl_t nvdimmRestore(TargetHandleList& i_nvdimmList, uint8_t &i_mpipl)
get_huid(l_nvdimm),
0x0,
ERRORLOG::ErrlEntry::NO_SW_CALLOUT);
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
break;
}
@@ -1264,6 +1281,7 @@ errlHndl_t nvdimmRestore(TargetHandleList& i_nvdimmList, uint8_t &i_mpipl)
{
TRACFCOMP(g_trac_nvdimm, ERR_MRK"nvdimmRestore() HUID[%X] post_restore_transition failed!",
get_huid(l_nvdimm));
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
break;
}
else
@@ -1345,6 +1363,7 @@ errlHndl_t nvdimmEraseCheck(Target *i_nvdimm)
// Collect register data for FFDC Traces
nvdimmTraceRegs ( i_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -1487,6 +1506,7 @@ errlHndl_t nvdimmOpenPage(Target *i_nvdimm,
l_err->addPartCallout( i_nvdimm,
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
}while(0);
@@ -1606,6 +1626,7 @@ errlHndl_t nvdimmEpowSetup(TargetHandleList &i_nvdimmList)
get_huid(*it));
nvdimmSetStatusFlag(*it, NSTD_VAL_SR_FAILED);
+ nvdimmAddPage4Regs(*it,l_err);
break;
}
it++;
@@ -1720,6 +1741,7 @@ errlHndl_t nvdimm_restore(TargetHandleList &i_nvdimmList)
// Collect register data for FFDC Traces
nvdimmTraceRegs ( l_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -1867,6 +1889,7 @@ errlHndl_t nvdimm_factory_reset(Target *i_nvdimm)
l_err->addPartCallout( i_nvdimm,
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
} while(0);
@@ -1994,6 +2017,7 @@ errlHndl_t nvdimm_init(Target *i_nvdimm)
// Collect register data for FFDC Traces
nvdimmTraceRegs ( i_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -2064,6 +2088,7 @@ errlHndl_t nvdimm_init(Target *i_nvdimm)
// Collect register data for FFDC Traces
nvdimmTraceRegs ( i_nvdimm, l_RegInfo );
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
// Add reg traces to the error log
NVDIMM::UdNvdimmOPParms( l_RegInfo ).addToLog(l_err);
@@ -2435,6 +2460,7 @@ bool nvdimm_encrypt_unlock(TargetHandleList &i_nvdimmList)
HWAS::DELAYED_DECONFIG,
HWAS::GARD_NULL );
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
errlCommit( l_err, NVDIMM_COMP_ID );
nvdimmSetEncryptionError(l_nvdimm);
l_success = false;
@@ -2945,6 +2971,7 @@ errlHndl_t nvdimm_setKeyReg(Target* i_nvdimm,
l_err->addPartCallout( i_nvdimm,
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(i_nvdimm,l_err);
}
else
{
@@ -3121,6 +3148,7 @@ bool nvdimm_encrypt_enable(TargetHandleList &i_nvdimmList)
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
errlCommit( l_err, NVDIMM_COMP_ID );
nvdimmSetEncryptionError(l_nvdimm);
l_success = false;
@@ -3260,6 +3288,7 @@ bool nvdimm_crypto_erase(TargetHandleList &i_nvdimmList)
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
errlCommit( l_err, NVDIMM_COMP_ID );
nvdimmSetEncryptionError(l_nvdimm);
l_success = false;
@@ -3334,6 +3363,7 @@ bool nvdimm_crypto_erase(TargetHandleList &i_nvdimmList)
HWAS::NV_CONTROLLER_PART_TYPE,
HWAS::SRCI_PRIORITY_HIGH);
+ nvdimmAddPage4Regs(l_nvdimm,l_err);
errlCommit( l_err, NVDIMM_COMP_ID );
nvdimmSetEncryptionError(l_nvdimm);
l_success = false;
@@ -3623,6 +3653,77 @@ errlHndl_t notifyNvdimmProtectionChange(Target* i_target,
return l_err;
}
+
+/*
+ * @brief Add Page 4 regs to FFDC
+ * Added to all NVDIMM HW errors
+ */
+void nvdimmAddPage4Regs( TARGETING::Target* i_nvdimm, errlHndl_t& io_err )
+{
+ errlHndl_t l_err = nullptr;
+
+ do
+ {
+ // Get the page4 attribute, if set we are already
+ // reading the page4 regs, exit
+ auto l_page4 = i_nvdimm->getAttr<ATTR_NVDIMM_READING_PAGE4>();
+ if (l_page4)
+ {
+ break;
+ }
+
+ // Set the page4 attribute so we don't recursively
+ // execute the nvdimmAddPage4Regs function
+ l_page4 = 0x1;
+ i_nvdimm->setAttr<ATTR_NVDIMM_READING_PAGE4>(l_page4);
+
+ ERRORLOG::ErrlUserDetailsLogRegister l_regUD(i_nvdimm);
+ uint32_t l_regList[] = {
+ PANIC_CNT,
+ PARITY_ERROR_COUNT,
+ FLASH_ERROR_COUNT0,
+ FLASH_ERROR_COUNT1,
+ FLASH_ERROR_COUNT2,
+ FLASH_BAD_BLOCK_COUNT0,
+ FLASH_BAD_BLOCK_COUNT1,
+ SCAP_STATUS,
+ STATUS_EVENT_INT_INFO1,
+ STATUS_EVENT_INT_INFO2
+ };
+ uint8_t l_readData = 0;
+
+ for (auto l_reg : l_regList)
+ {
+ l_err = nvdimmReadReg(i_nvdimm,
+ l_regList[l_reg],
+ l_readData);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_nvdimm, ERR_MRK
+ "nvdimmAddPage4Regs() nvdimm[%X] error reading 0x%X",
+ get_huid(i_nvdimm), l_reg);
+
+ // Don't commit, just delete the error and continue
+ delete l_err;
+ l_err = nullptr;
+ continue;
+ }
+
+ l_regUD.addDataBuffer(&l_readData,
+ sizeof(l_readData),
+ DEVICE_NVDIMM_ADDRESS(l_reg));
+ }
+
+ l_regUD.addToLog(io_err);
+
+ // Clear the page4 attribute before exiting
+ l_page4 = 0x0;
+ i_nvdimm->setAttr<ATTR_NVDIMM_READING_PAGE4>(l_page4);
+
+ } while(0);
+}
+
+
/*
* @brief Utility function to send the value of
* ATTR_NVDIMM_ARMED to the FSP
OpenPOWER on IntegriCloud