diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2013-06-21 14:23:41 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-06-21 15:07:15 -0500 |
commit | 2e62fb5c5819c9b549dd6c073d63f6e194f3867a (patch) | |
tree | c10ef134e3773458810ce739589a7b0c48a59033 /src/usr/fsi | |
parent | 8e8cfddb36f162dcf3e2ed4e25bde12c4fce7601 (diff) | |
download | talos-hostboot-2e62fb5c5819c9b549dd6c073d63f6e194f3867a.tar.gz talos-hostboot-2e62fb5c5819c9b549dd6c073d63f6e194f3867a.zip |
Clear OPB Errors before starting FSI Init
Some systems seem to power on with OPB Overrun errors. Added
code to clear out the OPB status regs before doing anything else.
Change-Id: I583fcb0964a7754f3fb6c558d528cbacc1e50714
CQ: SW210986
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/5136
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/fsi')
-rw-r--r-- | src/usr/fsi/fsidd.C | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/usr/fsi/fsidd.C b/src/usr/fsi/fsidd.C index feb733786..85eeb267a 100644 --- a/src/usr/fsi/fsidd.C +++ b/src/usr/fsi/fsidd.C @@ -1595,6 +1595,67 @@ errlHndl_t FsiDD::initMasterControl(TARGETING::Target* i_master, ctl_reg += getPortOffset(TARGETING::FSI_MASTER_TYPE_MFSI,m_info.port); } + //Always clear out any pending errors before we start anything + uint32_t scom_data[2] = {}; + size_t scom_size = sizeof(scom_data); + + for( uint64_t scomaddr = 0x00020000; + scomaddr <= 0x0002000A; + ++scomaddr ) + { + if( (scomaddr == 0x00020003) + || (scomaddr == 0x00020004) ) + { + continue; + } + + scom_size = sizeof(scom_data); + l_err = deviceOp( DeviceFW::READ, + iv_master, + scom_data, + scom_size, + DEVICE_XSCOM_ADDRESS(scomaddr) ); + if( l_err ) { break; } + + TRACFCOMP( g_trac_fsi, + "Scom %0.8X = %0.8X %0.8X", + scomaddr, + scom_data[0], + scom_data[1] ); + } + if( l_err ) { break; } + + scom_data[0] = 0; scom_data[1] = 0; + scom_size = sizeof(scom_data); + l_err = deviceOp( DeviceFW::WRITE, + iv_master, + scom_data, + scom_size, + DEVICE_XSCOM_ADDRESS(FSI2OPB_OFFSET_0|OPB_REG_RES) ); + if( l_err ) { break; } + + scom_data[0] = 0; scom_data[1] = 0; + scom_size = sizeof(scom_data); + l_err = deviceOp( DeviceFW::WRITE, + iv_master, + scom_data, + scom_size, + DEVICE_XSCOM_ADDRESS(FSI2OPB_OFFSET_0|OPB_REG_STAT) ); + if( l_err ) { break; } + + scom_size = sizeof(scom_data); + l_err = deviceOp( DeviceFW::READ, + iv_master, + scom_data, + scom_size, + DEVICE_XSCOM_ADDRESS(FSI2OPB_OFFSET_0|OPB_REG_STAT) ); + if( l_err ) { break; } + TRACFCOMP(g_trac_fsi,"Scom %0.8X = %0.8X %0.8X", + FSI2OPB_OFFSET_0|OPB_REG_STAT, + scom_data[0], + scom_data[1]); + + if( !fsp_master_init && !is_mpipl ) { //Clear fsi port errors and general reset on all ports |