summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2019-09-23 15:36:49 -0500
committerZane C Shelley <zshelle@us.ibm.com>2019-10-04 12:57:36 -0500
commit9d750b3d919830c1813fbcf2e7797a10c9075928 (patch)
tree00428b0b01266b78e3d49b73c505e8434f548ca0 /src
parentaea300c8e6a596170fc44d06571798b5116e47a0 (diff)
downloadtalos-hostboot-9d750b3d919830c1813fbcf2e7797a10c9075928.tar.gz
talos-hostboot-9d750b3d919830c1813fbcf2e7797a10c9075928.zip
PRD: Add additional FFDC to runtime NVDIMM analysis
Change-Id: I7472a883a27c30315c01f2722f98fe40d42c1070 CQ: SW476683 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84181 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamen G Tyner <ben.tyner@ibm.com> Reviewed-by: Brian J Stegmiller <bjs@us.ibm.com> Reviewed-by: Zane C Shelley <zshelle@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84182 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>
Diffstat (limited to 'src')
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfP9Mca.C2
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C74
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.H3
3 files changed, 74 insertions, 5 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
index fc32c557b..fac29fce3 100644
--- a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
+++ b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
@@ -1359,7 +1359,7 @@ int32_t AnalyzeNvdimmHealthStatRegs( ExtensibleChip * i_chip,
PRDF_ERR( PRDF_FUNC "Failed to get the global error log." );
continue;
}
- PlatServices::nvdimmAddPage4Ffdc( dimm, mainErrl );
+ PlatServices::nvdimmAddFfdc( dimm, mainErrl );
// De-assert the EVENT_N pin by setting bit 2 in NVDIMM_MGT_CMD1
l_rc = __deassertEventN( dimm );
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C
index e4b122ab5..491cc344d 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.C
@@ -59,6 +59,11 @@
#include <p9c_mss_maint_cmds.H>
#include <prdfParserUtils.H>
#include <p9c_mss_rowRepairFuncs.H>
+#include <errl/errludlogregister.H>
+
+#ifdef CONFIG_NVDIMM
+#include <nvdimm.H>
+#endif
using namespace TARGETING;
@@ -765,10 +770,75 @@ uint32_t nvdimmNotifyProtChange( TARGETING::TargetHandle_t i_target,
}
-void nvdimmAddPage4Ffdc( TARGETING::TargetHandle_t i_nvdimm,
- errlHndl_t & io_errl )
+void nvdimmAddFfdc( TARGETING::TargetHandle_t i_nvdimm, errlHndl_t & io_errl )
{
+ #define PRDF_FUNC "[PlatServices::nvdimmAddFfdc] "
+ // Add Page 4 Regs and Vendor Log using external Hostboot interfaces.
NVDIMM::nvdimmAddPage4Regs( i_nvdimm, io_errl );
+ NVDIMM::nvdimmAddVendorLog( i_nvdimm, io_errl );
+
+ // Add PRD specific registers relevant to runtime NVDIMM analysis.
+ const uint16_t regList[] =
+ {
+ // Module health registers
+ NVDIMM::i2cReg::MODULE_HEALTH,
+ NVDIMM::i2cReg::MODULE_HEALTH_STATUS0,
+ NVDIMM::i2cReg::MODULE_HEALTH_STATUS1,
+
+ // Threshold status registers
+ NVDIMM::i2cReg::ERROR_THRESHOLD_STATUS,
+ NVDIMM::i2cReg::WARNING_THRESHOLD_STATUS,
+
+ // ES_TEMP registers
+ NVDIMM::i2cReg::ES_TEMP0,
+ NVDIMM::i2cReg::ES_TEMP1,
+ NVDIMM::i2cReg::ES_TEMP_WARNING_HIGH_THRESHOLD0,
+ NVDIMM::i2cReg::ES_TEMP_WARNING_HIGH_THRESHOLD1,
+ NVDIMM::i2cReg::ES_TEMP_WARNING_LOW_THRESHOLD0,
+ NVDIMM::i2cReg::ES_TEMP_WARNING_LOW_THRESHOLD1,
+
+ // NVM Lifetime registers
+ NVDIMM::i2cReg::NVM_LIFETIME,
+ NVDIMM::i2cReg::NVM_LIFETIME_ERROR_THRESHOLD,
+ NVDIMM::i2cReg::NVM_LIFETIME_WARNING_THRESHOLD,
+
+ // ES Lifetime registers
+ NVDIMM::i2cReg::ES_LIFETIME,
+ NVDIMM::i2cReg::ES_LIFETIME_ERROR_THRESHOLD,
+ NVDIMM::i2cReg::ES_LIFETIME_WARNING_THRESHOLD,
+
+ // Status registers
+ NVDIMM::i2cReg::ERASE_STATUS,
+ NVDIMM::i2cReg::ARM_STATUS,
+ NVDIMM::i2cReg::SET_EVENT_NOTIFICATION_STATUS,
+ };
+
+ ERRORLOG::ErrlUserDetailsLogRegister regUd( i_nvdimm );
+ for ( auto const & reg : regList )
+ {
+ // NVDIMM register size = 1 byte
+ size_t NVDIMM_SIZE = 1;
+
+ uint8_t data = 0;
+ errlHndl_t errl = deviceRead( i_nvdimm, &data, NVDIMM_SIZE,
+ DEVICE_NVDIMM_ADDRESS(reg) );
+ if ( errl )
+ {
+ PRDF_ERR( PRDF_FUNC "Failed to read register 0x%X on "
+ "NVDIMM HUID: 0x%08x", reg, getHuid(i_nvdimm) );
+ // Don't commit, just delete the error and continue
+ delete errl; errl = nullptr;
+ continue;
+ }
+ // Only add registers that have non-zero data.
+ if ( 0 == data ) continue;
+
+ regUd.addDataBuffer( &data, sizeof(data), DEVICE_NVDIMM_ADDRESS(reg) );
+ }
+
+ regUd.addToLog( io_errl );
+
+ #undef PRDF_FUNC
}
#endif
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.H b/src/usr/diag/prdf/plat/prdfPlatServices.H
index 540742fd7..b99c20bed 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.H
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.H
@@ -189,8 +189,7 @@ uint32_t nvdimmNotifyProtChange( TARGETING::TargetHandle_t i_target,
* @param i_nvdimm An nvdimm target
* @param io_errl Error log to add the FFDC to
*/
-void nvdimmAddPage4Ffdc( TARGETING::TargetHandle_t i_nvdimm,
- errlHndl_t & io_errl );
+void nvdimmAddFfdc( TARGETING::TargetHandle_t i_nvdimm, errlHndl_t & io_errl );
#endif
OpenPOWER on IntegriCloud