summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMike Baiocchi <mbaiocch@us.ibm.com>2018-03-22 16:12:21 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-03-30 17:07:19 -0400
commit55f0053bc34e10d118e383f782b7be5cb14f59d2 (patch)
treed7bdd840e7e15b31f6fdd6b7e09581a4ff43b264 /src
parentbca54fb07d0e7ebfcf832f91813fd082622c9bae (diff)
downloadblackbird-hostboot-55f0053bc34e10d118e383f782b7be5cb14f59d2.tar.gz
blackbird-hostboot-55f0053bc34e10d118e383f782b7be5cb14f59d2.zip
Reset Host-mode Processor I2C Masters connected to the TPMs
This commit resets the I2C buses connected to the TPMs early in the IPL since the FSP can't do the reset for us as they lack a FSI I2C connection to the TPMs. Change-Id: I4b4893da447f3c567c04a8d0c2b647f2927ec0ab RTC:188956 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/56188 Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@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: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/i2c/i2cif.H2
-rwxr-xr-xsrc/usr/i2c/i2c.C10
-rw-r--r--src/usr/isteps/istep06/host_init_fsi.C91
-rw-r--r--src/usr/secureboot/trusted/trustedboot.C28
4 files changed, 96 insertions, 35 deletions
diff --git a/src/include/usr/i2c/i2cif.H b/src/include/usr/i2c/i2cif.H
index 5fa3216e4..a902fbcbf 100644
--- a/src/include/usr/i2c/i2cif.H
+++ b/src/include/usr/i2c/i2cif.H
@@ -93,6 +93,8 @@ enum i2cEngineSelect : uint8_t
I2C_ENGINE_SELECT_ONLY_1 |
I2C_ENGINE_SELECT_ONLY_2 |
I2C_ENGINE_SELECT_ONLY_3,
+
+ I2C_ENGINE_SELECT_NONE = 0x00,
};
/**
diff --git a/src/usr/i2c/i2c.C b/src/usr/i2c/i2c.C
index 3aed2eb02..950f7bbff 100755
--- a/src/usr/i2c/i2c.C
+++ b/src/usr/i2c/i2c.C
@@ -3346,16 +3346,18 @@ errlHndl_t i2cProcessActiveMasters ( i2cProcessType i_processType,
{
TRACUCOMP( g_trac_i2c,INFO_MRK
"i2cProcessActiveMasters: skipping tgt=0x%X "
- "due to FSI::isSlavePresent returned=%d",
- TARGETING::get_huid(tgt), check );
+ "due to FSI::isSlavePresent returned=%s (%d)",
+ TARGETING::get_huid(tgt),
+ check ? "true" : "false", check );
continue;
}
else
{
TRACUCOMP( g_trac_i2c,INFO_MRK
"i2cProcessActiveMasters: keeping tgt=0x%X due "
- "to FSI::isSlavePresent returned=%d",
- TARGETING::get_huid(tgt), check );
+ "to FSI::isSlavePresent returned=%s (%d)",
+ TARGETING::get_huid(tgt),
+ check ? "true" : "false", check );
}
}
diff --git a/src/usr/isteps/istep06/host_init_fsi.C b/src/usr/isteps/istep06/host_init_fsi.C
index 0a87c1fe8..c8ec1d065 100644
--- a/src/usr/isteps/istep06/host_init_fsi.C
+++ b/src/usr/isteps/istep06/host_init_fsi.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -30,14 +30,84 @@
#include <errl/errlmanager.H>
#include <fsi/fsiif.H>
#include <i2c/i2cif.H>
+#include <i2c/tpmddif.H>
#include <initservice/taskargs.H>
#include <initservice/isteps_trace.H>
#include <initservice/initserviceif.H>
#include <isteps/hwpisteperror.H>
+#include <attributeenums.H>
+#include <secureboot/trustedbootif.H>
+#include <config.h>
+
+//Targeting
+#include <targeting/common/commontargeting.H>
+#include <targeting/common/util.H>
+#include <targeting/common/utilFilter.H>
+#include <targeting/common/target.H>
+
+using namespace TARGETING;
+using namespace I2C;
+using namespace TRUSTEDBOOT;
namespace ISTEP_06
{
+/* @brief Find Processor I2C Engines Connected to TPMs
+ *
+ * This helper function loops through all of the TPMs in the system
+ * blueprint and finds all of the Processors that serve as their I2C
+ * Masters. It then keeps track of which processor I2C engine(s) are
+ * used.
+ *
+ * @return i2cEngineSelect - bit-wise enum indicating which processor engine(s)
+ * were found
+ */
+i2cEngineSelect find_proc_i2c_engines_for_tpm ( void )
+{
+ int engineSelect = static_cast<int>(I2C_ENGINE_SELECT_NONE);
+
+#ifdef CONFIG_TPMDD
+ // Get all TPMs to setup our array
+ TargetHandleList tpmList;
+ getTPMs(tpmList,TPM_FILTER::ALL_IN_BLUEPRINT);
+
+ TPMDD::tpm_info_t tpmData;
+ for (auto tpm : tpmList)
+ {
+ memset(&tpmData, 0, sizeof(tpmData));
+ errlHndl_t readErr = tpmReadAttributes(tpm,
+ tpmData,
+ TPMDD::TPM_LOCALITY_0);
+
+ if (nullptr != readErr)
+ {
+ // We are just looking for configured TPMs here
+ // so we ignore any errors
+ delete readErr;
+ readErr = nullptr;
+ }
+ else
+ {
+ // If TPM is connected to a processor then keep track
+ // of what engine needs to be reset
+ if (tpmData.i2cTarget->getAttr<ATTR_TYPE>() == TYPE_PROC)
+ {
+ engineSelect |= static_cast<int>(i2cEngineToEngineSelect(tpmData.engine));
+ }
+ }
+ }
+
+ // There should only be 1 such bus per processor. So if we found multiple
+ // engines then we know that there are different proc/engine combinations
+ // and we'd need a I2C reset intferace to support that. This check here
+ // makes sure we add that support when its necessary.
+ assert(__builtin_popcount(engineSelect)==1, "find_proc_i2c_engines_for_tpm: Only one engine should be found");
+
+#endif
+ return static_cast<i2cEngineSelect>(engineSelect);
+}
+
+
void* host_init_fsi( void *io_pArgs )
{
errlHndl_t l_err = NULL;
@@ -55,10 +125,25 @@ void* host_init_fsi( void *io_pArgs )
break;
}
- // Only reset the I2C Masters if FSP is not running
+ // Reset all I2C Masters if FSP is not running
if ( !INITSERVICE::spBaseServicesEnabled() )
{
- l_err = I2C::i2cResetActiveMasters(I2C::I2C_ALL, false);
+ l_err = i2cResetActiveMasters(I2C_ALL, false);
+ if (l_err)
+ {
+ // Commit this error
+ errlCommit( l_err, ISTEP_COMP_ID );
+ }
+ }
+ // FSP cannot access I2C buses where the TPMs and PCIe Hot Plug
+ // devices are due to a lack of a FSI connection to this bus.
+ // Therefore, reset all host-mode I2C engines connected to these buses
+ else
+ {
+ l_err = i2cResetActiveMasters(
+ I2C_PROC_HOST,
+ false,
+ find_proc_i2c_engines_for_tpm());
if (l_err)
{
// Commit this error
diff --git a/src/usr/secureboot/trusted/trustedboot.C b/src/usr/secureboot/trusted/trustedboot.C
index 88d1158d0..2f27064ca 100644
--- a/src/usr/secureboot/trusted/trustedboot.C
+++ b/src/usr/secureboot/trusted/trustedboot.C
@@ -52,7 +52,6 @@
#include <config.h>
#include <devicefw/driverif.H>
#include <i2c/tpmddif.H>
-#include <i2c/i2cif.H>
#include "trustedboot.H"
#include "trustedTypes.H"
#include "trustedbootCmds.H"
@@ -275,33 +274,6 @@ void* host_update_master_tpm( void *io_pArgs )
if( hwasState.present
&& hwasState.functional)
{
- // If MPIPL do I2C Reset to any processor's I2C engine that is
- // driving the TPMs
- TARGETING::Target* sys = nullptr;
- (void) tS.getTopLevelTarget( sys );
- assert(sys, "host_update_master_tpm() system target is nullptr");
-
- if (sys->getAttr<TARGETING::ATTR_IS_MPIPL_HB>())
- {
- err = I2C::i2cResetActiveMasters(
- I2C::I2C_PROC_HOST,
- true,
- I2C::i2cEngineToEngineSelect(tpmData.engine));
-
- if (nullptr != err)
- {
- // Commit log and continue
- TRACFCOMP(g_trac_trustedboot,ERR_MRK
- "host_update_master_tpm(): Committing I2C "
- "Reset Fail plid=0x%X but continuing",
- err->plid());
- err->collectTrace(TRBOOT_COMP_NAME);
- errlCommit(err, TRBOOT_COMP_ID);
- err = nullptr;
- }
-
- }
-
// API call will set TPM init attempted appropriately
tpmInitialize(pPrimaryTpm);
}
OpenPOWER on IntegriCloud