diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2013-03-22 10:45:46 -0500 |
---|---|---|
committer | Dean Sanner <dsanner@us.ibm.com> | 2013-03-22 12:55:37 -0500 |
commit | d040645c9edcae9317160c0aa12474d6b261ba87 (patch) | |
tree | 29649ac03ed5004f49f0717624ac249faf10cd09 | |
parent | 51d6d869221edb7c07cdfba8e7fa5771471d1350 (diff) | |
download | talos-hostboot-d040645c9edcae9317160c0aa12474d6b261ba87.tar.gz talos-hostboot-d040645c9edcae9317160c0aa12474d6b261ba87.zip |
Workaround for SW192221 - simics multicast
Working around a simics limitation with multicast scoms by
ignoring xscom errors that happen on multicast ops to group 7.
The workaround will be removed with RTC:67295.
Change-Id: Ide8191bec31284b09554e526349b0db7b92929f2
RTC: 67285
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3694
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com>
Tested-by: Jenkins Server
Reviewed-by: Dean Sanner <dsanner@us.ibm.com>
-rw-r--r-- | src/usr/xscom/xscom.C | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C index 59c65ad20..255b55167 100644 --- a/src/usr/xscom/xscom.C +++ b/src/usr/xscom/xscom.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2012 */ +/* COPYRIGHT International Business Machines Corp. 2011,2013 */ /* */ /* p1 */ /* */ @@ -43,6 +43,8 @@ #include "xscom.H" #include <assert.h> +//@fixme-RTC:67295 Only log the error once +bool MULTICAST_ERROR_LOGGED_ONCE = false; // Trace definition trace_desc_t* g_trac_xscom = NULL; @@ -431,7 +433,7 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, { errlHndl_t l_err = NULL; HMER l_hmer; - mutex_t* l_XSComMutex; + mutex_t* l_XSComMutex = NULL; uint64_t l_addr = va_arg(i_args,uint64_t); // Retry loop @@ -522,7 +524,8 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, if (i_opType == DeviceFW::READ) { - TRACDCOMP(g_trac_xscom, "xscomPerformOp: Read data: %.16llx", l_data); } + TRACDCOMP(g_trac_xscom, "xscomPerformOp: Read data: %.16llx", l_data); + } else { TRACDCOMP(g_trac_xscom, "xscomPerformOp: Write data: %.16llx", l_data); @@ -531,9 +534,26 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, // Handle error if (l_hmer.mXSComStatus != HMER::XSCOM_GOOD) { + //@fixme-RTC:67295 remove these hacks, make log UNRECOVERABLE again + if( ((l_addr & 0xFF000000) == 0x57000000) + && (l_hmer.mXSComStatus == HMER::XSCOM_BAD_ADDRESS) ) + { + if( MULTICAST_ERROR_LOGGED_ONCE ) + { + // Ignore this due to a Simics issue - see SW193003 + TRACFCOMP(g_trac_xscom, + ERR_MRK "Skipping XSCOM errorlog for multicast error for addr=%llx", + l_addr ); + io_buflen = XSCOM_BUFFER_SIZE; + break; + } + MULTICAST_ERROR_LOGGED_ONCE = true; + } + uint64_t l_hmerVal = l_hmer; - TRACFCOMP(g_trac_xscom, ERR_MRK "XSCOM status error HMER: %.16llx, XSComStatus %llx", - l_hmerVal, l_hmer.mXSComStatus); + TRACFCOMP(g_trac_xscom, + ERR_MRK "XSCOM status error HMER: %.16llx, XSComStatus %llx, Addr=%llx", + l_hmerVal, l_hmer.mXSComStatus, l_addr ); /*@ * @errortype * @moduleid XSCOM_PERFORM_OP @@ -542,11 +562,12 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, * @userdata2 XSCom address * @devdesc XSCom access error */ - l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_INFORMATIONAL, XSCOM_PERFORM_OP, XSCOM_STATUS_ERR, l_hmer, l_mmioAddr); + // @todo - Collect more FFDC: HMER value, target ID, other registers? |