diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2019-09-23 15:36:49 -0500 |
---|---|---|
committer | Zane C Shelley <zshelle@us.ibm.com> | 2019-10-04 12:57:36 -0500 |
commit | 9d750b3d919830c1813fbcf2e7797a10c9075928 (patch) | |
tree | 00428b0b01266b78e3d49b73c505e8434f548ca0 /src | |
parent | aea300c8e6a596170fc44d06571798b5116e47a0 (diff) | |
download | talos-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.C | 2 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.C | 74 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.H | 3 |
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 |