From 1434b8952e3a2dbd55a0876ec9d89fe3ffd21da6 Mon Sep 17 00:00:00 2001 From: Corey Swenson Date: Thu, 22 Aug 2019 13:00:39 -0500 Subject: [PATCH] NVDIMM: FW_UPDATE: New FFDC for SECURITY_ERROR For any command error or timeout during FW_UPDATE add regs to error log. Registers specified in NVDIMM IPL Error Handling Document. CQ:SW473060 Change-Id: I3ca8933b9c62f0b12bebefbae06357400e8e436e Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/83590 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Daniel M Crowell --- src/include/usr/isteps/nvdimm/nvdimm.H | 14 ++++++ src/usr/errl/errludlogregister.C | 1 + src/usr/errl/plugins/errludlogregister.H | 7 ++- src/usr/isteps/nvdimm/nvdimm.C | 61 ++++++++++++++++++++++++ src/usr/isteps/nvdimm/nvdimm_update.C | 13 ++++- 5 files changed, 94 insertions(+), 2 deletions(-) diff --git a/src/include/usr/isteps/nvdimm/nvdimm.H b/src/include/usr/isteps/nvdimm/nvdimm.H index ce79e902628..9ccfa0e7fa9 100644 --- a/src/include/usr/isteps/nvdimm/nvdimm.H +++ b/src/include/usr/isteps/nvdimm/nvdimm.H @@ -331,6 +331,7 @@ errlHndl_t notifyNvdimmProtectionChange(TARGETING::Target* i_target, errlHndl_t getOperOpsTimeout(TARGETING::Target* i_nvdimm, uint16_t& o_timeout); + /** * @brief Wait for operational unit operation to complete * @@ -411,6 +412,19 @@ errlHndl_t compareCksum(TARGETING::Target* i_nvdimm, void nvdimmAddVendorLog(TARGETING::Target *i_nvdimm, errlHndl_t& io_err); +/** + * @brief Add NVDIMM Update regs to FFDC for errors encountered + * during NVDIMM firmware update process + * Regs specified in NVDIMM IPL Error Handling Document + * + * @param[in] i_nvdimm - nvdimm target + * + * @param[in] io_err - error log to add FFDC data + * + */ +void nvdimmAddUpdateRegs(TARGETING::Target *i_nvdimm, errlHndl_t& io_err); + + /** * @brief Function to add some NVDIMM Page 4 status regs to errorlog FFDC * PANIC_CNT Counts FPGA firmware events diff --git a/src/usr/errl/errludlogregister.C b/src/usr/errl/errludlogregister.C index 0db5aaca907..e908b0d4d2d 100644 --- a/src/usr/errl/errludlogregister.C +++ b/src/usr/errl/errludlogregister.C @@ -223,6 +223,7 @@ void ErrlUserDetailsLogRegister::copyRegisterData( case DeviceFW::SCOM: // userif.H case DeviceFW::FSI: // userif.H case DeviceFW::SPD: // userif.H + case DeviceFW::NVDIMM: // userif.H case DeviceFW::XSCOM: // driverif.H case DeviceFW::FSISCOM: // driverif.H case DeviceFW::IBSCOM: // driverif.H diff --git a/src/usr/errl/plugins/errludlogregister.H b/src/usr/errl/plugins/errludlogregister.H index f795a9643b6..b201e05d916 100644 --- a/src/usr/errl/plugins/errludlogregister.H +++ b/src/usr/errl/plugins/errludlogregister.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -122,6 +122,11 @@ public: numArgs = 1; addrParams.push_back(" SPD keyword enumaration"); break; + case DeviceFW::NVDIMM: // userif.H + i_parser.PrintString("AccessType", "DeviceFW::NVDIMM"); + numArgs = 1; + addrParams.push_back(" NVDIMM address"); + break; case DeviceFW::XSCOM: // driverif.H i_parser.PrintString("AccessType", "DeviceFW::XSCOM"); numArgs = 1; diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C index 2c2629d222c..0a35b1151dc 100644 --- a/src/usr/isteps/nvdimm/nvdimm.C +++ b/src/usr/isteps/nvdimm/nvdimm.C @@ -4382,6 +4382,67 @@ void nvdimmAddPage4Regs( TARGETING::Target* i_nvdimm, errlHndl_t& io_err ) } +/* + * @brief Add NVDIMM Update regs to FFDC for errors encountered + * during NVDIMM update process + */ +void nvdimmAddUpdateRegs( TARGETING::Target* i_nvdimm, errlHndl_t& io_err ) +{ + errlHndl_t l_err = nullptr; + + ERRORLOG::ErrlUserDetailsLogRegister l_regUD(i_nvdimm); + const uint32_t l_regList[] = { + NVDIMM_READY, + FIRMWARE_OPS_STATUS, + NVDIMM_CMD_STATUS0, + FIRMWARE_OPS_TIMEOUT0, + FIRMWARE_OPS_TIMEOUT1, + FW_REGION_CRC0, + FW_REGION_CRC1, + MODULE_HEALTH, + MODULE_HEALTH_STATUS0, + MODULE_HEALTH_STATUS1, + ERROR_THRESHOLD_STATUS, + ENCRYPTION_CONFIG_STATUS, + FW_SLOT_INFO, + SLOT0_ES_FWREV0, + SLOT0_ES_FWREV1, + SLOT1_ES_FWREV0, + SLOT1_ES_FWREV1, + SLOT1_SUBFWREV, + CSAVE_INFO, + CSAVE_FAIL_INFO1, + RESTORE_STATUS, + RESTORE_FAIL_INFO, + }; + 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 + "nvdimmAddUpdateRegs() 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); +} + + /* * @brief Utility function to send the value of * ATTR_NVDIMM_ARMED to the FSP diff --git a/src/usr/isteps/nvdimm/nvdimm_update.C b/src/usr/isteps/nvdimm/nvdimm_update.C index 9cda59f8c3d..70ad7bcf1dc 100644 --- a/src/usr/isteps/nvdimm/nvdimm_update.C +++ b/src/usr/isteps/nvdimm/nvdimm_update.C @@ -407,6 +407,7 @@ errlHndl_t NvdimmInstalledImage::updateImage(NvdimmLidImage * i_lidImage) l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); break; } @@ -585,6 +586,7 @@ errlHndl_t NvdimmInstalledImage::updateImage(NvdimmLidImage * i_lidImage) l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); break; } @@ -794,6 +796,7 @@ errlHndl_t NvdimmInstalledImage::updateImageData(NvdimmLidImage * i_lidImage) ERRORLOG::ErrlEntry::ADD_SW_CALLOUT ); l_err->collectTrace( NVDIMM_COMP_NAME, 256 ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); break; } @@ -957,6 +960,7 @@ errlHndl_t NvdimmInstalledImage::updateImageData(NvdimmLidImage * i_lidImage) l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); break; } @@ -1028,6 +1032,7 @@ errlHndl_t NvdimmInstalledImage::changeFwUpdateMode(fw_update_mode i_mode) l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } } } @@ -1112,6 +1117,7 @@ errlHndl_t NvdimmInstalledImage::waitFwOpsBlockReceived() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } return l_err; @@ -1192,6 +1198,7 @@ errlHndl_t NvdimmInstalledImage::waitFwOpsComplete() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } } return l_err; @@ -1560,6 +1567,7 @@ errlHndl_t NvdimmInstalledImage::validateFwHeader() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } } } @@ -1611,6 +1619,7 @@ errlHndl_t NvdimmInstalledImage::commitFwRegion() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } } } @@ -1663,6 +1672,7 @@ errlHndl_t NvdimmInstalledImage::clearFwDataBlock() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); + nvdimmAddUpdateRegs(iv_dimm,l_err); } } } @@ -1714,7 +1724,7 @@ errlHndl_t NvdimmInstalledImage::validateFwImage() l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(iv_dimm,l_err); - + nvdimmAddUpdateRegs(iv_dimm,l_err); } } } @@ -2001,6 +2011,7 @@ bool NvdimmsUpdate::runUpdate(void) l_err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE, HWAS::SRCI_PRIORITY_LOW ); nvdimmAddPage4Regs(l_nvdimm,l_err); + nvdimmAddUpdateRegs(l_nvdimm,l_err); ERRORLOG::errlCommit(l_err, NVDIMM_COMP_ID); // Delete the unused NvdimmInstalledImage object