summaryrefslogtreecommitdiffstats
path: root/src/usr/i2c
diff options
context:
space:
mode:
authorMike Baiocchi <baiocchi@us.ibm.com>2014-11-21 08:43:28 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-12-15 10:53:05 -0600
commit5815883924b059a6594eb5e554b26a2bb8a712dc (patch)
tree42b03d340bad20668ac30b5179bd52a2001762fb /src/usr/i2c
parent8f0edf314a9c9198d95b0c7598e269cf8b7f232a (diff)
downloadtalos-hostboot-5815883924b059a6594eb5e554b26a2bb8a712dc.tar.gz
talos-hostboot-5815883924b059a6594eb5e554b26a2bb8a712dc.zip
Use FSI-based I2C for MVPD access in OpenPower
This code defaults all slave processors to use FSI I2C access method at the start of the IPL. Then in istep 6.12 it calls a new function i2cSetAccessMode() to set them to Host I2C access method for the rest of the IPL. Change-Id: Ib13d274aa9a64a533bce79d34e75c0bee4d3e5c8 RTC: 116439 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14590 Tested-by: Jenkins Server Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/i2c')
-rwxr-xr-xsrc/usr/i2c/i2c.C107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/usr/i2c/i2c.C b/src/usr/i2c/i2c.C
index f44993fbe..95471f13e 100755
--- a/src/usr/i2c/i2c.C
+++ b/src/usr/i2c/i2c.C
@@ -2698,6 +2698,113 @@ errlHndl_t i2cResetMasters ( i2cResetType i_resetType )
}
// ------------------------------------------------------------------
+// i2cSetAccessMode
+// NOTE: currently just supporting I2C_SET_MODE_PROC_HOST
+// ------------------------------------------------------------------
+void i2cSetAccessMode( i2cSetAccessModeType i_setModeType )
+{
+ TRACDCOMP( g_trac_i2c,
+ ENTER_MRK"i2cSetAccessMode(): %d", i_setModeType );
+
+ TARGETING::I2cSwitches switches;
+
+ bool mutex_success = false;
+ mutex_t * engineLock = NULL;
+ misc_args_t args;
+
+
+ do
+ {
+ // Get list of targets
+ TARGETING::TargetHandleList tgtList;
+
+ // Support for I2C_SET_MODE_PROC_HOST
+ TARGETING::getAllChips(tgtList,
+ TARGETING::TYPE_PROC,
+ true); // true: return functional targets
+
+ if( 0 == tgtList.size() )
+ {
+ TRACFCOMP(g_trac_i2c,
+ INFO_MRK"i2cSetAccessMode: No Targets found!");
+ break;
+ }
+
+ TRACUCOMP( g_trac_i2c,
+ INFO_MRK"i2cSetAccessMode: Targets: %d",
+ tgtList.size() );
+
+ // Check and set each target
+ for( uint32_t i = 0; i < tgtList.size(); i++ )
+ {
+ TARGETING::Target* tgt = tgtList[i];
+
+ // Get the mutex for engine 0
+ args.engine = 0;
+ mutex_success = i2cGetEngineMutex( tgt,
+ args,
+ engineLock );
+
+ if( !mutex_success )
+ {
+ TRACFCOMP( g_trac_i2c,ERR_MRK"i2cSetAccessMode: Error from "
+ "i2cGetEngineMutex() getting engine 0 lock for "
+ "tgt=0x%X", TARGETING::get_huid(tgt));
+ continue;
+ }
+
+ // Lock on this engine
+ TRACUCOMP( g_trac_i2c,
+ INFO_MRK"Obtaining lock for engine: %d",
+ args.engine );
+
+ (void)mutex_lock( engineLock );
+
+ TRACUCOMP( g_trac_i2c,
+ INFO_MRK"Locked on engine: %d",
+ args.engine );
+
+
+ switches = tgt->getAttr<TARGETING::ATTR_I2C_SWITCHES>();
+
+ TRACUCOMP( g_trac_i2c,"i2cSetAccessMode: tgt=0x%X switches: "
+ "host=%d, fsi=%d",
+ TARGETING::get_huid(tgt), switches.useHostI2C,
+ switches.useFsiI2C);
+
+ // Support for I2C_SET_MODE_PROC_HOST
+ if ((switches.useHostI2C != 1) ||
+ (switches.useFsiI2C != 0) )
+ {
+ switches.useHostI2C = 1;
+ switches.useFsiI2C = 0;
+
+ tgt->setAttr<TARGETING::ATTR_I2C_SWITCHES>(switches);
+
+ TRACFCOMP( g_trac_i2c,"i2cSetAccessMode: tgt=0x%X "
+ "I2C_SWITCHES updated: host=%d, fsi=%d",
+ TARGETING::get_huid(tgt), switches.useHostI2C,
+ switches.useFsiI2C);
+ }
+
+ // Unlock
+ (void) mutex_unlock( engineLock );
+ TRACUCOMP( g_trac_i2c,
+ INFO_MRK"Unlocked engine: %d",
+ args.engine );
+
+ } // end of target for loop
+
+ } while( 0 );
+
+ TRACDCOMP( g_trac_i2c,
+ EXIT_MRK"i2cSetAccessMode");
+
+ return;
+}
+
+
+// ------------------------------------------------------------------
// i2cRegisterOp
// ------------------------------------------------------------------
errlHndl_t i2cRegisterOp ( DeviceFW::OperationType i_opType,
OpenPOWER on IntegriCloud