From 45cb275198bbb6bd2bbd25ec9eaa4a40dbdfeb86 Mon Sep 17 00:00:00 2001 From: Matt Derksen Date: Tue, 24 Sep 2019 13:34:16 -0500 Subject: NVDIMM: Mask mbacalfir at the beginning of restore step during mpipl Mask MBACALFIR[8]: EVENT_N: MBACALFIR_MASK_OR = 0x0080000000000000 at the beginning of nvdimm_restore() to avoid PRD errors. This mask is normal for non-mpipl path, so just needed for mpipl. CQ: SW477028 Change-Id: I3368b89af67f58edecb42dd0a99ca7799679e84d Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84190 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Reviewed-by: TSUNG K YEUNG Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Corey V Swenson Reviewed-by: Daniel M Crowell --- src/usr/isteps/nvdimm/nvdimm.C | 34 ++++++++++++++++++++++++++++++++-- src/usr/isteps/nvdimm/nvdimm.H | 10 +++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C index 6576b5a63..273aa04e9 100644 --- a/src/usr/isteps/nvdimm/nvdimm.C +++ b/src/usr/isteps/nvdimm/nvdimm.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2019 */ +/* Contributors Listed Below - COPYRIGHT 2014,2020 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -1134,6 +1134,32 @@ errlHndl_t nvdimmValidImage(Target *i_nvdimm, bool &o_imgValid) return l_err; } +void maskMbacalfir_eventn(TARGETING::Target* i_nvdimm) +{ + errlHndl_t l_err = nullptr; + TargetHandleList l_mcaList; + uint64_t l_writeData; + uint32_t l_writeAddress; + size_t l_writeSize = sizeof(l_writeData); + + getParentAffinityTargets(l_mcaList, i_nvdimm, CLASS_UNIT, TYPE_MCA); + assert(l_mcaList.size(), "maskMbacalfir_eventn() failed to find parent MCA."); + + l_writeAddress = MBACALFIR_OR_MASK_REG; + l_writeData = MBACALFIR_EVENTN_OR_BIT; + l_err = deviceWrite(l_mcaList[0], &l_writeData, l_writeSize, + DEVICE_SCOM_ADDRESS(l_writeAddress)); + if(l_err) + { + TRACFCOMP(g_trac_nvdimm, + ERR_MRK "Failed to mask MBACALFIR EventN using address " + "0x%08x on NVDIMM 0x%08X MCA 0x%08X", + l_writeAddress, get_huid(i_nvdimm), get_huid(l_mcaList[0])); + l_err->collectTrace(NVDIMM_COMP_NAME); + errlCommit( l_err, NVDIMM_COMP_ID ); + } +} + #ifndef __HOSTBOOT_RUNTIME /** * @brief This function handles all the restore related operations. @@ -1175,6 +1201,11 @@ errlHndl_t nvdimmRestore(TargetHandleList& io_nvdimmList, uint8_t &i_mpipl) if (i_mpipl) { TRACFCOMP(g_trac_nvdimm, "nvdimmRestore(): in MPIPL"); + + // To avoid PRD error during mpipl need to Mask MBACALFIR EventN + // Note: a regular IPL will already have this masked + maskMbacalfir_eventn(*it); + FAPI_INVOKE_HWP(l_err, mss::ddr_resetn, l_fapi_mca, HIGH); if (l_err) @@ -1755,7 +1786,6 @@ errlHndl_t nvdimmEpowSetup(TargetHandleList &i_nvdimmList) } - /** * @brief Entry function to NVDIMM restore * - Restore image from NVDIMM NAND flash to DRAM diff --git a/src/usr/isteps/nvdimm/nvdimm.H b/src/usr/isteps/nvdimm/nvdimm.H index 683763087..1e4e1596c 100644 --- a/src/usr/isteps/nvdimm/nvdimm.H +++ b/src/usr/isteps/nvdimm/nvdimm.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2019 */ +/* Contributors Listed Below - COPYRIGHT 2014,2020 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -513,6 +513,14 @@ enum mbacal_bitmask_values : uint64_t MBACALFIR_UNMASK_BIT = 0xff7fffffffffffff, }; + +/** + * @brief Mask MCBACALFIR Event N to prevent PRD from handling event + * + * @param[in] - i_nvdimm - nvdimm target for operation on its parent MCA + */ +void maskMbacalfir_eventn(TARGETING::Target* i_nvdimm); + /** * @brief Wrapper to call deviceOp to read the NV controller via I2C * -- cgit v1.2.1