diff options
author | Sachin Gupta <sgupta2m@in.ibm.com> | 2017-10-24 08:36:45 -0500 |
---|---|---|
committer | Sachin Gupta <sgupta2m@in.ibm.com> | 2017-10-26 04:23:51 -0400 |
commit | 76a7eb9956ba2f1c1f0f5c74bf4eef168b328fd7 (patch) | |
tree | a5d63456cc02f3e0a7ed277df76e2c44ab0d8598 | |
parent | e15c80ad9743e5d5d9d6da585f0c598d00832930 (diff) | |
download | talos-sbe-76a7eb9956ba2f1c1f0f5c74bf4eef168b328fd7.tar.gz talos-sbe-76a7eb9956ba2f1c1f0f5c74bf4eef168b328fd7.zip |
Handle PIB Offline error on multicast address
Change-Id: I64bed9d1789bd7081a34ddca3d068267244c980f
CQ: SW405835
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48739
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: RAJA DAS <rajadas2@in.ibm.com>
Reviewed-by: Shakeeb A. Pasha B K <shakeebbk@in.ibm.com>
Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
-rw-r--r-- | src/hwpf/plat_hw_access.C | 31 | ||||
-rw-r--r-- | src/hwpf/plat_hw_access.H | 4 |
2 files changed, 28 insertions, 7 deletions
diff --git a/src/hwpf/plat_hw_access.C b/src/hwpf/plat_hw_access.C index 4e7a3f3e..cfc7ca2d 100644 --- a/src/hwpf/plat_hw_access.C +++ b/src/hwpf/plat_hw_access.C @@ -252,7 +252,7 @@ fapi2::ReturnCode getscom_abs_wrap(const void *i_target, l_pibRc = getscom_abs(l_addr, o_data); if( PIB_NO_ERROR != l_pibRc ) { - l_pibRc = p9_pibErrRetry( l_addr, o_data, l_pibRc, true); + l_pibRc = p9_handlePibErr( l_addr, o_data, l_pibRc, true); } FAPI_INF("getScom: returned pibRc: 0x%08X, data HI: 0x%08X, " "data LO: 0x%08X", l_pibRc, (*o_data >> 32), @@ -289,7 +289,7 @@ fapi2::ReturnCode putscom_abs_wrap(const void *i_target, l_pibRc = putscom_abs(l_addr, i_data); if( PIB_NO_ERROR != l_pibRc ) { - l_pibRc = p9_pibErrRetry( l_addr, &i_data, l_pibRc, false); + l_pibRc = p9_handlePibErr( l_addr, &i_data, l_pibRc, false); } FAPI_INF("putScom: returned pibRc: 0x%08X", l_pibRc); fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; @@ -340,16 +340,37 @@ fapi2::ReturnCode putscom_under_mask(const void *i_target, return l_rc; } -uint32_t p9_pibErrRetry( const uint32_t i_addr, uint64_t *io_data, +uint32_t p9_handlePibErr( const uint32_t i_addr, uint64_t *io_data, const uint8_t i_pibErr, const bool i_isRead) { - FAPI_INF("Entering p9_pibErrRetry"); + FAPI_INF("Entering p9_handlePibErr"); static const uint8_t MAX_RETRIES = 2; uint8_t l_retryCount = 0; uint32_t pibErr = i_pibErr; + // the format for scom is + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // WR MC [MC Type] [MC gp] [PIB M Addr] [Port Number ] + // [slave addr(MC=0)] + // 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 + // [ Local addr ] + + // For multicast address address bit 1 should be 1 + static const uint32_t MULTICAST_MASK = 0x40000000; + do { + // There is a HW bug where if any chiplet is offline, we can get + // PIB_OFFLINE_ERROR on multicast address though data is valid. + // In this case SBE should treat it as success. + if(( i_pibErr == PIB_OFFLINE_ERROR ) && + (i_addr & MULTICAST_MASK)) + { + FAPI_INF("PIB_OFFLINE_ERROR on Multicast scom addr:0x%08X. " + "Ignoring error", i_addr ); + pibErr = PIB_NO_ERROR; + break; + } // Only retry for parity and timeout errors if (( i_pibErr != PIB_PARITY_ERROR ) && ( i_pibErr != PIB_TIMEOUT_ERROR )) @@ -377,7 +398,7 @@ uint32_t p9_pibErrRetry( const uint32_t i_addr, uint64_t *io_data, if ( pibErr != i_pibErr ) break; } }while(0); - FAPI_INF("Exiting p9_pibErrRetry"); + FAPI_INF("Exiting p9_handlePibErr"); return pibErr; } diff --git a/src/hwpf/plat_hw_access.H b/src/hwpf/plat_hw_access.H index 7af79bd3..9cd2b3e2 100644 --- a/src/hwpf/plat_hw_access.H +++ b/src/hwpf/plat_hw_access.H @@ -161,7 +161,7 @@ namespace fapi2 uint64_t i_data, uint64_t i_mask); /// - /// @brief Platform wrapper to retry scom for parity/timeout errors + /// @brief Platform wrapper to handle pib errors on scoms /// /// @param [in] i_addr The SCOM address /// @param [io] io_data The data pointer @@ -170,7 +170,7 @@ namespace fapi2 /// /// @return PCB-PIB return code /// - uint32_t p9_pibErrRetry( const uint32_t i_addr, uint64_t *io_data, + uint32_t p9_handlePibErr( const uint32_t i_addr, uint64_t *io_data, const uint8_t i_pibErr, const bool i_isRead); } |