Skip to content

Commit

Permalink
PRD: Add additional FFDC to runtime NVDIMM analysis
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
cnpalmer authored and zane131 committed Oct 4, 2019
1 parent aea300c commit 9d750b3
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/usr/diag/prdf/plat/mem/prdfP9Mca.C
Expand Up @@ -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 );
Expand Down
74 changes: 72 additions & 2 deletions src/usr/diag/prdf/plat/prdfPlatServices.C
Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions src/usr/diag/prdf/plat/prdfPlatServices.H
Expand Up @@ -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

Expand Down

0 comments on commit 9d750b3

Please sign in to comment.