From fcf2fc04cfa705d3beb138edfe379ab0c228aad6 Mon Sep 17 00:00:00 2001 From: Shakeeb Date: Thu, 22 Sep 2016 02:02:41 -0500 Subject: SBE plat scom error handling Change-Id: Iffc9686fa745040a0d0f1c3a6b5f0dacc89a1c66 RTC:158016 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/30078 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Sachin Gupta --- src/hwpf/include/plat/plat_hw_access.H | 14 +++++---- src/hwpf/src/plat/plat_hw_access.C | 55 ++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 22 deletions(-) (limited to 'src/hwpf') diff --git a/src/hwpf/include/plat/plat_hw_access.H b/src/hwpf/include/plat/plat_hw_access.H index cd0078f9..23637c10 100644 --- a/src/hwpf/include/plat/plat_hw_access.H +++ b/src/hwpf/include/plat/plat_hw_access.H @@ -140,22 +140,24 @@ namespace fapi2 /// /// @brief Platform wrapper over PK getscom_abs /// - /// @param [in] i_addr The SCOM address + /// @param [in] i_addr The SCOM address /// @param [out] o_data The data read /// - /// @return PCB-PIB return code + /// @return fapi::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. /// - uint32_t getscom_abs_wrap(const void *i_target, const uint32_t i_addr, uint64_t *o_data); + fapi2::ReturnCode getscom_abs_wrap(const void *i_target, + const uint32_t i_addr, uint64_t *o_data); /// /// @brief Platform wrapper over PK putscom_abs /// /// @param [in] i_addr The SCOM address - /// @param [in] i_data The data read + /// @param [in] i_data The data to write /// - /// @return PCB-PIB return code + /// @return fapi::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. /// - uint32_t putscom_abs_wrap(const void *i_target, const uint32_t i_addr, uint64_t i_data); + fapi2::ReturnCode putscom_abs_wrap(const void *i_target, + const uint32_t i_addr, uint64_t i_data); /// /// @brief Platform wrapper to retry scom for parity/timeout errors diff --git a/src/hwpf/src/plat/plat_hw_access.C b/src/hwpf/src/plat/plat_hw_access.C index a6eaf91c..9ff0daa9 100644 --- a/src/hwpf/src/plat/plat_hw_access.C +++ b/src/hwpf/src/plat/plat_hw_access.C @@ -206,36 +206,59 @@ static uint32_t getEffectiveAddress(const plat_target_handle_t &i_target, const return l_addr; } -uint32_t getscom_abs_wrap(const void *i_target, const uint32_t i_addr, uint64_t *o_data) +fapi2::ReturnCode getscom_abs_wrap(const void *i_target, + const uint32_t i_addr, uint64_t *o_data) { - uint32_t l_rc = 0; + uint32_t l_pibRc = 0; uint32_t l_addr = getEffectiveAddress(*(plat_target_handle_t*)i_target, i_addr); FAPI_INF("getScom: address: 0x%08X", l_addr); - l_rc = getscom_abs(l_addr, o_data); - if( PIB_NO_ERROR != l_rc ) + l_pibRc = getscom_abs(l_addr, o_data); + if( PIB_NO_ERROR != l_pibRc ) { - l_rc = p9_pibErrRetry( l_addr, o_data, l_rc, true); + l_pibRc = p9_pibErrRetry( l_addr, o_data, l_pibRc, true); } - FAPI_INF("getScom: returned rc: 0x%08X, data HI: 0x%08X, " - "data LO: 0x%08X", l_rc, (*o_data >> 32), + FAPI_INF("getScom: returned pibRc: 0x%08X, data HI: 0x%08X, " + "data LO: 0x%08X", l_pibRc, (*o_data >> 32), static_cast(*o_data & 0xFFFFFFFF)); - return l_rc; + fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; + // Setting 64bit address in ffdc package as the parsers are + // hard coded to read 64bit address + const uint64_t ffdcAddr = l_addr; + PLAT_FAPI_ASSERT( PIB_NO_ERROR == l_pibRc, + SBE_SCOM_FAILURE(). + set_address(ffdcAddr). + set_pcb_pib_rc(l_pibRc), + "getScom:pcb pib error"); +fapi_try_exit: + return fapi2::current_err; } -uint32_t putscom_abs_wrap(const void *i_target, const uint32_t i_addr, uint64_t i_data) +fapi2::ReturnCode putscom_abs_wrap(const void *i_target, + const uint32_t i_addr, uint64_t i_data) { - uint32_t l_rc = 0; - uint32_t l_addr = getEffectiveAddress(*(plat_target_handle_t*)i_target, i_addr); + uint32_t l_pibRc = 0; + uint32_t l_addr = getEffectiveAddress(*(plat_target_handle_t*)i_target, + i_addr); FAPI_INF("putScom: address: 0x%08X, data HI: 0x%08X, data LO: 0x%08X", l_addr, (i_data >> 32), static_cast(i_data & 0xFFFFFFFF)); - l_rc = putscom_abs(l_addr, i_data); - if( PIB_NO_ERROR != l_rc ) + l_pibRc = putscom_abs(l_addr, i_data); + if( PIB_NO_ERROR != l_pibRc ) { - l_rc = p9_pibErrRetry( l_addr, &i_data, l_rc, false); + l_pibRc = p9_pibErrRetry( l_addr, &i_data, l_pibRc, false); } - FAPI_INF("putScom: returned rc: 0x%08X", l_rc); - return l_rc; + FAPI_INF("putScom: returned pibRc: 0x%08X", l_pibRc); + fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; + // Setting 64bit address in ffdc package as the parsers are + // hard coded to read 64bit address + const uint64_t ffdcAddr = l_addr; + PLAT_FAPI_ASSERT( PIB_NO_ERROR == l_pibRc, + SBE_SCOM_FAILURE(). + set_address(ffdcAddr). + set_pcb_pib_rc(l_pibRc), + "putScom:pcb pib error"); +fapi_try_exit: + return fapi2::current_err; } uint32_t p9_pibErrRetry( const uint32_t i_addr, uint64_t *io_data, -- cgit v1.2.1