From 534354add3280bec554c62ac158b3ec7fc3a68ef Mon Sep 17 00:00:00 2001 From: Santosh Puranik Date: Wed, 12 Apr 2017 04:55:13 -0500 Subject: Set unique FAPI RC for SCOM failures Allows HWP code to infer the PCB-PIB error by looking at the FAPI RC Change-Id: I1853391c6c5aa3c19ba08e80c5819139d39b78b0 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/39147 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Sachin Gupta Reviewed-by: Santosh S. Puranik --- src/hwpf/src/plat/plat_hw_access.C | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/hwpf/src/plat/plat_hw_access.C b/src/hwpf/src/plat/plat_hw_access.C index a87e864a..11ecca1a 100644 --- a/src/hwpf/src/plat/plat_hw_access.C +++ b/src/hwpf/src/plat/plat_hw_access.C @@ -246,6 +246,39 @@ static uint32_t getEffectiveAddress(const plat_target_handle_t &i_target, const return l_addr; } +static fapi2::ReturnCode pibRcToFapiRc(const uint32_t i_pibRc) +{ + fapi2::ReturnCode l_fapiRc = FAPI2_RC_SUCCESS; + switch(i_pibRc) + { + case PIB_XSCOM_ERROR: + l_fapiRc = RC_SBE_PIB_XSCOM_ERROR; + break; + case PIB_OFFLINE_ERROR: + l_fapiRc = RC_SBE_PIB_OFFLINE_ERROR; + break; + case PIB_PARTIAL_ERROR: + l_fapiRc = RC_SBE_PIB_PARTIAL_ERROR; + break; + case PIB_ADDRESS_ERROR: + l_fapiRc = RC_SBE_PIB_ADDRESS_ERROR; + break; + case PIB_CLOCK_ERROR: + l_fapiRc = RC_SBE_PIB_CLOCK_ERROR; + break; + case PIB_PARITY_ERROR: + l_fapiRc = RC_SBE_PIB_PARITY_ERROR; + break; + case PIB_TIMEOUT_ERROR: + l_fapiRc = RC_SBE_PIB_TIMEOUT_ERROR; + break; + case PIB_NO_ERROR: + default: + break; + } + return l_fapiRc; +} + fapi2::ReturnCode getscom_abs_wrap(const void *i_target, const uint32_t i_addr, uint64_t *o_data) { @@ -271,6 +304,12 @@ fapi2::ReturnCode getscom_abs_wrap(const void *i_target, "getScom:pcb pib error, pibRc[0x%08X] Scom_Addr[0x%08X]", l_pibRc,l_addr); fapi_try_exit: + if(PIB_NO_ERROR != l_pibRc) + { + // Override FAPI RC based on PIB RC + fapi2::current_err = pibRcToFapiRc(l_pibRc); + fapi2::g_FfdcData.fapiRc = fapi2::current_err; + } return fapi2::current_err; } @@ -302,6 +341,12 @@ fapi2::ReturnCode putscom_abs_wrap(const void *i_target, l_pibRc,l_addr,(i_data >> 32), static_cast(i_data & 0xFFFFFFFF)); fapi_try_exit: + if(PIB_NO_ERROR != l_pibRc) + { + // Override FAPI RC based on PIB RC + fapi2::current_err = pibRcToFapiRc(l_pibRc); + fapi2::g_FfdcData.fapiRc = fapi2::current_err; + } return fapi2::current_err; } -- cgit v1.2.1