diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2017-11-21 15:45:35 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-01-09 10:37:55 -0500 |
commit | 7f8aa4b7a01721e52c0c0b4d4d54c6ba8738c11c (patch) | |
tree | 9097fe9d68881e9ec568d83340468c5413a7f111 /src/usr/xscom | |
parent | 9ea9546db73d86d46871fcbb94cc93d3f2fb31a1 (diff) | |
download | talos-hostboot-7f8aa4b7a01721e52c0c0b4d4d54c6ba8738c11c.tar.gz talos-hostboot-7f8aa4b7a01721e52c0c0b4d4d54c6ba8738c11c.zip |
Tweaks to multicast scom workaround
Added a mode to avoid a pile of FFDC collection for the case
where we expect errors could happen.
Also added a couple new flags to control which chiplets get
accessed as part of the workaround, one to avoid access to
slave cores before they are running and the other to avoid
access to the memory chiplets before they have clocks enabled.
Without these changes, the code is still functionally correct
but the traces get filled with pointless non-errors which makes
real problems harder to find and also increases boot time.
Change-Id: I834781261d16748cbbfd8511d9649ec19de53d81
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50503
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/xscom')
-rw-r--r-- | src/usr/xscom/xscom.C | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C index 647111cfd..c9afe0273 100644 --- a/src/usr/xscom/xscom.C +++ b/src/usr/xscom/xscom.C @@ -458,7 +458,7 @@ errlHndl_t xScomDoOp(DeviceFW::OperationType i_opType, { // print a trace message.. for debug purposes // incase we are stuck in a retry loop. - TRACFCOMP(g_trac_xscom,"xscomPerformOp - RESOURCE OCCUPIED LOOP Cntr = %d: OpType 0x%.16llX, Address 0x%llX, MMIO Address 0x%llX, HMER=%.16X", l_retryCtr, static_cast<uint64_t>(i_opType), i_xscomAddr, static_cast<uint64_t>(l_mmioAddr), io_hmer.mRegister ); + TRACFCOMP(g_trac_xscom,"xscomDoOp - RESOURCE OCCUPIED LOOP Cntr = %d: OpType 0x%.16llX, Address 0x%llX, MMIO Address 0x%llX, HMER=%.16X", l_retryCtr, static_cast<uint64_t>(i_opType), i_xscomAddr, static_cast<uint64_t>(l_mmioAddr), io_hmer.mRegister ); // we don't want to hang forever so break out after // an obscene amount of time @@ -471,17 +471,17 @@ errlHndl_t xScomDoOp(DeviceFW::OperationType i_opType, } while (io_hmer.mXSComStatus == PIB::PIB_RESOURCE_OCCUPIED); - TRACDCOMP(g_trac_xscom,"xscomPerformOp: OpType 0x%.16llX, Address 0x%llX, MMIO Address 0x%llX", static_cast<uint64_t>(i_opType),i_xscomAddr,static_cast<uint64_t>(l_mmioAddr)); + TRACDCOMP(g_trac_xscom,"xscomDoOp: OpType 0x%.16llX, Address 0x%llX, MMIO Address 0x%llX", static_cast<uint64_t>(i_opType),i_xscomAddr,static_cast<uint64_t>(l_mmioAddr)); - TRACDCOMP(g_trac_xscom, "xscomPerformOp: l_offset 0x%.16llX; VirtAddr %p; i_virtAddr+l_offset %p",l_offset,i_virtAddr,i_virtAddr + l_offset); + TRACDCOMP(g_trac_xscom, "xscomDoOp: l_offset 0x%.16llX; VirtAddr %p; i_virtAddr+l_offset %p",l_offset,i_virtAddr,i_virtAddr + l_offset); if (i_opType == DeviceFW::READ) { - TRACDCOMP(g_trac_xscom, "xscomPerformOp: Read data: %.16llx", l_data); + TRACDCOMP(g_trac_xscom, "xscomDoOp: Read data: %.16llx", l_data); } else { - TRACDCOMP(g_trac_xscom, "xscomPerformOp: Write data: %.16llx", l_data); + TRACDCOMP(g_trac_xscom, "xscomDoOp: Write data: %.16llx", l_data); } do @@ -490,6 +490,7 @@ errlHndl_t xScomDoOp(DeviceFW::OperationType i_opType, if (io_hmer.mXSComStatus != PIB::PIB_NO_ERROR) { uint64_t l_hmerVal = io_hmer; + uint64_t l_fullAddr = mm_virt_to_phys(i_virtAddr + l_offset); TRACFCOMP(g_trac_xscom,ERR_MRK "XSCOM status error HMER: %.16llx ,XSComStatus = %llx, Addr=%llx",l_hmerVal,io_hmer.mXSComStatus, i_xscomAddr ); /*@ @@ -504,7 +505,7 @@ errlHndl_t xScomDoOp(DeviceFW::OperationType i_opType, XSCOM_DO_OP, XSCOM_STATUS_ERR, io_hmer, - l_mmioAddr); + l_fullAddr); //Note: Callouts are added by the caller if needed } } @@ -746,6 +747,7 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, HMER l_hmer; mutex_t* l_XSComMutex = NULL; uint64_t l_addr = va_arg(i_args,uint64_t); + uint64_t l_noErrors = va_arg(i_args,uint64_t); do { @@ -793,7 +795,20 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, l_hmer); // If we got a scom error. - if (l_err) + if (l_err && l_noErrors) + { + // ignoring errors because the caller doesn't care + // just return all zero data + delete l_err; + l_err = nullptr; + io_buflen = XSCOM_BUFFER_SIZE; + memset( io_buffer, 0, io_buflen ); + + // still need to reset the scomEngine. + resetScomEngine(i_target, + l_virtAddr); + } + else if (l_err) { // Call XscomCollectFFDC.. collectXscomFFDC(i_target, |