summaryrefslogtreecommitdiffstats
path: root/src/hwpf
diff options
context:
space:
mode:
authorSachin Gupta <sgupta2m@in.ibm.com>2017-10-24 08:36:45 -0500
committerSachin Gupta <sgupta2m@in.ibm.com>2017-10-26 04:23:51 -0400
commit76a7eb9956ba2f1c1f0f5c74bf4eef168b328fd7 (patch)
treea5d63456cc02f3e0a7ed277df76e2c44ab0d8598 /src/hwpf
parente15c80ad9743e5d5d9d6da585f0c598d00832930 (diff)
downloadtalos-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>
Diffstat (limited to 'src/hwpf')
-rw-r--r--src/hwpf/plat_hw_access.C31
-rw-r--r--src/hwpf/plat_hw_access.H4
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);
}
OpenPOWER on IntegriCloud