summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/i2c/i2cif.H22
-rw-r--r--src/usr/hwas/hostbootIstep.C7
-rw-r--r--src/usr/hwpf/hwp/slave_sbe/slave_sbe.C6
-rwxr-xr-xsrc/usr/i2c/i2c.C107
-rw-r--r--src/usr/targeting/common/xmltohb/target_types.xml4
-rw-r--r--src/usr/targeting/targetservicestart.C10
6 files changed, 149 insertions, 7 deletions
diff --git a/src/include/usr/i2c/i2cif.H b/src/include/usr/i2c/i2cif.H
index b554c6fca..2599124d6 100644
--- a/src/include/usr/i2c/i2cif.H
+++ b/src/include/usr/i2c/i2cif.H
@@ -84,6 +84,28 @@ bool i2cPresence( TARGETING::Target * i_target,
uint64_t i_devAddr );
+/**
+* @enum i2cSetAccessModeType
+*
+* @brief I2C Set Access Mode Type specifies what targets will be set to
+* a specific I2C Access Mode (Host or FSI)
+*
+*/
+enum i2cSetAccessModeType
+{
+ I2C_SET_ACCESS_MODE_INVALID = 0x00,
+ I2C_SET_ACCESS_MODE_PROC_HOST = 0x01
+};
+
+
+/**
+ * @brief This function will set the I2C_SWITCH attribute for certain
+ * targets to a specific mode (Host or FSI) based on the input.
+ *
+ * @param i2cSetModeType - Specifies which targets to be set and which
+ * mode to set them to
+ */
+void i2cSetAccessMode( i2cSetAccessModeType i_setModeType );
}; // end namespace I2C
diff --git a/src/usr/hwas/hostbootIstep.C b/src/usr/hwas/hostbootIstep.C
index 1ea2d5b93..47a961c63 100644
--- a/src/usr/hwas/hostbootIstep.C
+++ b/src/usr/hwas/hostbootIstep.C
@@ -92,18 +92,17 @@ void* host_init_fsi( void *io_pArgs )
l_errl = FSI::initializeHardware( );
if (l_errl)
{
+ // This error should get returned
break;
}
-
- //@TODO RTC:116439
- /*
l_errl = I2C::i2cResetMasters(I2C::I2C_RESET_PROC_ALL);
if (l_errl)
{
+ // Commit this error
+ errlCommit( l_errl, HWPF_COMP_ID );
break;
}
- */
} while (0);
diff --git a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
index 696697345..f49b6c208 100644
--- a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
+++ b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
@@ -442,8 +442,12 @@ void* call_proc_check_slave_sbe_seeprom_complete( void *io_pArgs )
}
} // endfor
- l_errl = I2C::i2cResetMasters(I2C::I2C_RESET_PROC_ALL);
+ // Slave processors should now use Host I2C Access Method
+ I2C::i2cSetAccessMode( I2C::I2C_SET_ACCESS_MODE_PROC_HOST );
+
+ // Reset the Processor's I2C Masters
+ l_errl = I2C::i2cResetMasters(I2C::I2C_RESET_PROC_ALL);
if (l_errl)
{
// Commit error
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,
diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
index 6def4603f..09c70b684 100644
--- a/src/usr/targeting/common/xmltohb/target_types.xml
+++ b/src/usr/targeting/common/xmltohb/target_types.xml
@@ -497,8 +497,8 @@
<attribute>
<id>I2C_SWITCHES</id>
<default>
- <field><id>useFsiI2C</id><value>0</value></field>
- <field><id>useHostI2C</id><value>1</value></field>
+ <field><id>useFsiI2C</id><value>1</value></field>
+ <field><id>useHostI2C</id><value>0</value></field>
<field><id>reserved</id><value>0</value></field>
</default>
</attribute>
diff --git a/src/usr/targeting/targetservicestart.C b/src/usr/targeting/targetservicestart.C
index 8677c61ce..d3446b4c3 100644
--- a/src/usr/targeting/targetservicestart.C
+++ b/src/usr/targeting/targetservicestart.C
@@ -214,6 +214,16 @@ static void initializeAttributes(TargetService& i_targetService)
l_switches.useFsiScom = 0;
l_pMasterProcChip->setAttr<ATTR_SCOM_SWITCHES>(l_switches);
+
+ // Master can only use Host I2C so needs to be set before
+ // doing any I2C accesses
+ I2cSwitches l_i2c_switches =
+ l_pMasterProcChip->getAttr<ATTR_I2C_SWITCHES>();
+ l_i2c_switches.useHostI2C = 1;
+ l_i2c_switches.useFsiI2C = 0;
+ l_pMasterProcChip->setAttr<ATTR_I2C_SWITCHES>(l_i2c_switches);
+
+
errlHndl_t l_errl = NULL;
size_t l_size = sizeof(uint64_t);
uint64_t l_data;
OpenPOWER on IntegriCloud