diff options
author | Chris Engel <cjengel@us.ibm.com> | 2016-07-13 16:10:54 -0500 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2016-08-22 13:47:05 -0400 |
commit | b692f91c173ca684b557b8f76d268720e58b36a4 (patch) | |
tree | 6f100e0f80e5bc60b69824441e266e1da69e6760 /src | |
parent | 984f7f35a02e4894c8cb448223bea8d53b64f459 (diff) | |
download | talos-hostboot-b692f91c173ca684b557b8f76d268720e58b36a4.tar.gz talos-hostboot-b692f91c173ca684b557b8f76d268720e58b36a4.zip |
Trustedboot support for using TPM target
Change-Id: I362085fd81663b9b8ec56ed9e0670cf71fc851e4
RTC: 153386
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28482
Reviewed-by: Christopher J. Engel <cjengel@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src')
20 files changed, 511 insertions, 702 deletions
diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H index 970a747a6..59e812d8a 100644 --- a/src/include/usr/devicefw/userif.H +++ b/src/include/usr/devicefw/userif.H @@ -304,15 +304,13 @@ namespace DeviceFW /** * Construct the device addressing parameters for the TPM device ops. - * @param[in] i_tpm_enum The chip number of the TPM to access. See - * tpm_chip_types_t in tpmddif.H * @param[in] i_tpm_operation The TPM operation to perform. See * tpm_op_types_t in tpmddif.H * @param[in] i_command_len Command length to write during transmit * operations */ - #define DEVICE_TPM_ADDRESS( i_tpm_enum, i_tpm_op, i_command_len )\ - DeviceFW::TPM, static_cast<uint64_t>(( i_tpm_enum )),\ + #define DEVICE_TPM_ADDRESS( i_tpm_op, i_command_len )\ + DeviceFW::TPM,\ static_cast<uint64_t>(( i_tpm_op )),\ static_cast<uint64_t>(( i_command_len )) diff --git a/src/include/usr/i2c/tpmddif.H b/src/include/usr/i2c/tpmddif.H index fe8bd0c4a..67602c2be 100644 --- a/src/include/usr/i2c/tpmddif.H +++ b/src/include/usr/i2c/tpmddif.H @@ -29,17 +29,6 @@ namespace TPMDD { /** - * @brief Enumerations to select TPM -*/ -enum tpm_chip_types_t -{ - TPM_PRIMARY = 0, - TPM_BACKUP = 1, - LAST_CHIP_TYPE, - FIRST_CHIP_TYPE = TPM_PRIMARY -}; - -/** * @brief TPM Operation to perform */ enum tpm_op_types_t @@ -68,12 +57,12 @@ struct tpm_info_t { tpm_op_types_t operation; ///< TPM operation to perform TARGETING::EntityPath i2cMasterPath; ///< I2C Master path - TARGETING::Target * i2cTarget; ///< I2C Target + TARGETING::Target * i2cTarget; ///< I2C Master Target + TARGETING::Target * tpmTarget; ///< TPM Target uint64_t busFreq; ///< Bus speed in Hz uint8_t port; ///< I2C Master port uint8_t engine; ///< I2C Master engine - uint8_t chip; ///< Chip target, primary/backup uint8_t tpmEnabled; ///< TPM attribute defined as available uint8_t devAddr; ///< I2C Address size_t offset; ///< TPM Device register offset @@ -90,8 +79,7 @@ struct tpm_info_t * * @return true if device is present */ -bool tpmPresence ( TARGETING::Target * i_target, - tpm_chip_types_t i_chip ); +bool tpmPresence ( TARGETING::Target * i_target); /** * @brief this function will read all of the associated attributes needed diff --git a/src/include/usr/i2c/tpmddreasoncodes.H b/src/include/usr/i2c/tpmddreasoncodes.H index 7bd2df1cf..d9abeec67 100644 --- a/src/include/usr/i2c/tpmddreasoncodes.H +++ b/src/include/usr/i2c/tpmddreasoncodes.H @@ -59,6 +59,7 @@ enum tpmModuleId TPMDD_WRITEFIFO = 0x09, TPMDD_READFIFO = 0x0A, TPMDD_READSTSREGVALID = 0x0B, + TPMDD_TPMPRESENCEDETECT = 0x0C, }; /** diff --git a/src/include/usr/secureboot/trustedbootif.H b/src/include/usr/secureboot/trustedbootif.H index 27dd1e8d4..21ab262a6 100644 --- a/src/include/usr/secureboot/trustedbootif.H +++ b/src/include/usr/secureboot/trustedbootif.H @@ -42,11 +42,21 @@ namespace TRUSTEDBOOT { struct _TpmLogMgr; + /// Enumerations to select TPM + typedef enum + { + TPM_PRIMARY = 0, + TPM_BACKUP = 1, + LAST_CHIP_TYPE, + FIRST_CHIP_TYPE = TPM_PRIMARY + } TPM_role; + + /// Track system TPM status struct TpmTarget { - TARGETING::Target* nodeTarget; ///< Node target ptr - TPMDD::tpm_chip_types_t chip; ///< Chip Pri vs Backup + TARGETING::Target* tpmTarget; ///< TPM target ptr + TPM_role role; ///< Pri vs Backup uint8_t initAttempted:1;///< Has TPM init been run uint8_t available:1; ///< Is TPM physically in system uint8_t failed:1; ///< Is TPM currently failed diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C index bdadb35eb..ee2b15505 100644 --- a/src/usr/devtree/bld_devtree.C +++ b/src/usr/devtree/bld_devtree.C @@ -486,8 +486,7 @@ void add_i2c_info( const TARGETING::Target* i_targ, { // Lookup i2c info for the TPM - tpmInfo.chip = tpm->chip; - err = TPMDD::tpmReadAttributes(tpm->nodeTarget, tpmInfo); + err = TPMDD::tpmReadAttributes(tpm->tpmTarget, tpmInfo); if (NULL != err) { // Unable to get info we skip this guy @@ -557,17 +556,16 @@ void add_i2c_info( const TARGETING::Target* i_targ, dtOffset_t l_tpmNode = i_dt->addNode( l_busNode, "tpm", tpmInfo.devAddr >> 1 ); - TRACFCOMP( g_trac_devtree, "TPM NODE %X", l_tpmNode ); i_dt->addPropertyCell32(l_tpmNode, "reg", tpmInfo.devAddr >> 1); char l_label[30]; - switch (tpm->chip) + switch (tpm->role) { - case TPMDD::TPM_PRIMARY: + case TRUSTEDBOOT::TPM_PRIMARY: sprintf( l_label, "tpm" ); break; - case TPMDD::TPM_BACKUP: + case TRUSTEDBOOT::TPM_BACKUP: sprintf( l_label, "tpm-backup" ); break; default: @@ -1310,8 +1308,7 @@ void load_tpmlog(devTree * i_dt, uint64_t& io_address) // We need to build the devtree path to find this TPM node // Lookup i2c info for the TPM - l_tpmInfo.chip = l_tpm->chip; - l_errl = TPMDD::tpmReadAttributes(l_tpm->nodeTarget, l_tpmInfo); + l_errl = TPMDD::tpmReadAttributes(l_tpm->tpmTarget, l_tpmInfo); if (l_errl) { errlCommit(l_errl, DEVTREE_COMP_ID); diff --git a/src/usr/hwas/common/hwas.C b/src/usr/hwas/common/hwas.C index 0daea5577..ec565272c 100644 --- a/src/usr/hwas/common/hwas.C +++ b/src/usr/hwas/common/hwas.C @@ -293,7 +293,8 @@ errlHndl_t discoverTargets() uint16_t pgData[VPD_CP00_PG_DATA_LENGTH / sizeof(uint16_t)]; bzero(pgData, sizeof(pgData)); - if (pTarget->getAttr<ATTR_CLASS>() == CLASS_CHIP) + if (pTarget->getAttr<ATTR_CLASS>() == CLASS_CHIP && + pTarget->getAttr<ATTR_TYPE>() != TYPE_TPM) { // read Chip ID/EC data from these physical chips errl = platReadIDEC(pTarget); diff --git a/src/usr/i2c/test/tpmddtest.H b/src/usr/i2c/test/tpmddtest.H index 14c22d6c4..b2e58eca6 100755 --- a/src/usr/i2c/test/tpmddtest.H +++ b/src/usr/i2c/test/tpmddtest.H @@ -56,43 +56,45 @@ class TPMDDTest: public CxxTest::TestSuite public: /** - * @brief Retrieve a node target to test with + * @brief Retrieve a TPM target to test with */ - TARGETING::Target* getTestTarget( tpm_chip_types_t i_chip ) + TARGETING::Target* getTestTarget() { - TARGETING::TargetService& tS = TARGETING::targetService(); TARGETING::Target* testTarget = NULL; - tS.getMasterNodeTarget( testTarget ); - - assert(testTarget != NULL); + TARGETING::TargetHandleList tpmList; + TARGETING::getAllChips(tpmList, + TARGETING::TYPE_TPM, + true); // only functional + if (tpmList.size() > 0) + { + testTarget = tpmList[0]; - TRACFCOMP( g_trac_tpmdd, - "getTestTarget node tgt=0x%X chip=%d", - TARGETING::get_huid(testTarget), - i_chip); + TRACFCOMP( g_trac_tpmdd, + "getTestTarget tpm tgt=0x%08X", + TARGETING::get_huid(testTarget)); - // Let's see if the requested chip is functional - tpm_info_t tpmInfo; - tpmInfo.chip = i_chip; - errlHndl_t err = tpmReadAttributes (testTarget, tpmInfo); + // Let's see if the requested chip is functional + tpm_info_t tpmInfo; + memset(&tpmInfo, 0, sizeof(tpm_info_t)); + errlHndl_t err = tpmReadAttributes (testTarget, tpmInfo); - if (NULL != err) - { - testTarget = NULL; - delete err; - } - else if (!tpmInfo.tpmEnabled) - { - TRACFCOMP(g_trac_tpmdd, "getTestTarget - " - "Chip %d not enabled", - i_chip); - testTarget = NULL; - } - else - { - TRACFCOMP(g_trac_tpmdd, "getTestTarget - " - "Chip %d enabled", - i_chip); + if (NULL != err) + { + testTarget = NULL; + delete err; + err = NULL; + } + else if (!tpmInfo.tpmEnabled) + { + TRACFCOMP(g_trac_tpmdd, "getTestTarget - " + "Chip not enabled"); + testTarget = NULL; + } + else + { + TRACFCOMP(g_trac_tpmdd, "getTestTarget - " + "Chip enabled"); + } } return testTarget; @@ -113,8 +115,8 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a node Target - TARGETING::Target* testTarget = getTestTarget(TPM_PRIMARY); + // Get a TPM Target + TARGETING::Target* testTarget = getTestTarget(); if (NULL == testTarget) { continue; @@ -124,8 +126,7 @@ class TPMDDTest: public CxxTest::TestSuite err = deviceRead(testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_READVENDORID, + DEVICE_TPM_ADDRESS( TPM_OP_READVENDORID, 0) ); if( NULL != err ) @@ -178,8 +179,8 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a node Target - TARGETING::Target* testTarget = getTestTarget(TPM_PRIMARY); + // Get a TPM Target + TARGETING::Target* testTarget = getTestTarget(); if (NULL == testTarget) { continue; @@ -189,8 +190,7 @@ class TPMDDTest: public CxxTest::TestSuite err = deviceRead(testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_LASTOP, + DEVICE_TPM_ADDRESS( TPM_OP_LASTOP, 0) ); if( NULL == err ) @@ -215,8 +215,7 @@ class TPMDDTest: public CxxTest::TestSuite testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_READVENDORID, + DEVICE_TPM_ADDRESS( TPM_OP_READVENDORID, 0) ); if( NULL == err ) @@ -260,8 +259,8 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a node Target - TARGETING::Target* testTarget = getTestTarget(TPM_PRIMARY); + // Get a TPM Target + TARGETING::Target* testTarget = getTestTarget(); if (NULL == testTarget) { continue; @@ -273,8 +272,7 @@ class TPMDDTest: public CxxTest::TestSuite err = deviceRead(testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_READVENDORID, + DEVICE_TPM_ADDRESS( TPM_OP_READVENDORID, 0) ); if( NULL == err || @@ -307,107 +305,6 @@ class TPMDDTest: public CxxTest::TestSuite /** - * @brief TPM Invalid Chip Test - * This test will pass in an invalid chip identifier which should - * result in an error being returned. - */ - void testTPMInvalidChip ( void ) - { - errlHndl_t err = NULL; - int64_t fails = 0, num_ops = 0; - uint64_t data = 0x0ull; - size_t dataSize = sizeof(data); - - TRACFCOMP( g_trac_tpmdd, - "testTPMInvalidChip - Start" ); - - do - { - - // Get a processor Target instead of a node target - TARGETING::TargetService& tS = TARGETING::targetService(); - TARGETING::Target* testTarget = NULL; - tS.masterProcChipTargetHandle( testTarget ); - assert(testTarget != NULL); - - num_ops++; - err = deviceRead(testTarget, - &data, - dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_READVENDORID, - 0) ); - - if( NULL == err ) - { - fails++; - TS_FAIL( "testTPMInvalidChip - ProcTarget: Error should've " - "resulted in using processor target!" ); - } - else - { - TRACUCOMP(g_trac_tpmdd, "testTPMInvalidChip - " - "ProcTarget: Error log returned as expected. " - "RC=0x%x ", - err->reasonCode() ); - delete err; - err = NULL; - } - - - - // Attempt operation against the backup TPM - tS.getMasterNodeTarget( testTarget ); - assert(testTarget != NULL); - - // Skip this target if target is non-functional - if(!testTarget->getAttr<TARGETING::ATTR_HWAS_STATE>() - .functional) - { - continue; - } - - // Many systems don't have a backup TPM, if not configured - // test TPM presence against it - if (getTestTarget(TPM_BACKUP) == NULL) - { - - num_ops++; - err = deviceRead(testTarget, - &data, - dataSize, - DEVICE_TPM_ADDRESS( TPM_BACKUP, - TPM_OP_READVENDORID, - 0) ); - - if( NULL == err || - (err->reasonCode() != TPM_DEVICE_NOT_AVAILABLE && - err->reasonCode() != TPM_BUS_SPEED_LOOKUP_FAIL)) - { - fails++; - TS_FAIL( "testTPMInvalidChip - TpmBackup : Error " - "should've " - "resulted in using backup TPM target!" ); - } - else - { - TRACUCOMP(g_trac_tpmdd, "testTPMInvalidChip - " - "TpmBackup : Error log returned as expected. " - "RC=0x%X ", - err->reasonCode() ); - delete err; - err = NULL; - } - } - - } while( 0 ); - - TRACFCOMP( g_trac_tpmdd, - "testTPMInvalidChip - End: %d/%d fails", - fails, num_ops ); - } - - /** * @brief TPM Presence Test */ void testTPMPresence ( void ) @@ -421,7 +318,7 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a processor Target instead of a node target + // Get a processor Target instead of a tpm target TARGETING::TargetService& tS = TARGETING::targetService(); TARGETING::Target* testTarget = NULL; tS.masterProcChipTargetHandle( testTarget ); @@ -437,8 +334,7 @@ class TPMDDTest: public CxxTest::TestSuite num_ops++; // Test with invalid proc target - presence = TPMDD::tpmPresence(testTarget, - TPM_PRIMARY); + presence = TPMDD::tpmPresence(testTarget); if( presence == true ) { fails++; @@ -452,46 +348,13 @@ class TPMDDTest: public CxxTest::TestSuite } - tS.getMasterNodeTarget( testTarget ); - assert(testTarget != NULL); - - // Skip this target if target is non-functional - if(!testTarget->getAttr<TARGETING::ATTR_HWAS_STATE>() - .functional) - { - continue; - } - - - // Many systems don't have a backup TPM, if not configured - // test TPM presence against it - if (getTestTarget(TPM_BACKUP) == NULL) - { - - num_ops++; - // Attempt operation against the backup TPM - presence = TPMDD::tpmPresence(testTarget, - TPM_BACKUP); - if( presence == true ) - { - fails++; - TS_FAIL( "testTPMPresence - TPMBackup: Error when " - "using backup TPM!, false presence" ); - } - else - { - TRACUCOMP(g_trac_tpmdd, "testTPMPresence - " - "TPMBackup: False returned as expected. "); - } - } - + testTarget = getTestTarget(); - if (getTestTarget(TPM_PRIMARY) != NULL) + if (NULL != testTarget) { // Now test with valid primary target num_ops++; - presence = TPMDD::tpmPresence(testTarget, - TPM_PRIMARY); + presence = TPMDD::tpmPresence(testTarget); if( presence == false ) { fails++; @@ -530,8 +393,8 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a node Target - TARGETING::Target* testTarget = getTestTarget(TPM_PRIMARY); + // Get a TPM Target + TARGETING::Target* testTarget = getTestTarget(); if (NULL == testTarget) { continue; @@ -559,8 +422,7 @@ class TPMDDTest: public CxxTest::TestSuite err = deviceRead(testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_TRANSMIT, + DEVICE_TPM_ADDRESS( TPM_OP_TRANSMIT, cmdSize) ); TRUSTEDBOOT::TPM2_BaseOut* resp = @@ -618,8 +480,8 @@ class TPMDDTest: public CxxTest::TestSuite do { - // Get a node Target - TARGETING::Target* testTarget = getTestTarget(TPM_PRIMARY); + // Get a TPM Target + TARGETING::Target* testTarget = getTestTarget(); if (NULL == testTarget) { continue; @@ -648,9 +510,8 @@ class TPMDDTest: public CxxTest::TestSuite err = deviceRead(testTarget, &data, dataSize, - DEVICE_TPM_ADDRESS( TPM_PRIMARY, - TPM_OP_TRANSMIT, - cmdSize) ); + DEVICE_TPM_ADDRESS(TPM_OP_TRANSMIT, + cmdSize) ); if( NULL == err || err->reasonCode() != TPM_OVERFLOW_ERROR) diff --git a/src/usr/i2c/tpmdd.C b/src/usr/i2c/tpmdd.C index 8c0b5319a..4581d0265 100755 --- a/src/usr/i2c/tpmdd.C +++ b/src/usr/i2c/tpmdd.C @@ -77,10 +77,14 @@ namespace TPMDD static const size_t MAX_BYTE_ADDR = 2; static const size_t TPM_MAX_NACK_RETRIES = 2; -// Register the perform Op with the routing code for Nodes. +// Register the perform Op with the routing code for TPM +DEVICE_REGISTER_ROUTE(DeviceFW::READ, + DeviceFW::PRESENT, + TARGETING::TYPE_TPM, + tpmPresenceDetect); DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, DeviceFW::TPM, - DeviceFW::WILDCARD, + TARGETING::TYPE_TPM, tpmPerformOp ); @@ -99,7 +103,6 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, uint64_t commandSize = 0; bool unlock = false; - tpmInfo.chip = va_arg( i_args, uint64_t ); tpmInfo.operation = ((TPMDD::tpm_op_types_t)va_arg( i_args, uint64_t )); commandSize = va_arg( i_args, uint64_t ); @@ -107,8 +110,8 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, ENTER_MRK"tpmPerformOp()" ); TRACUCOMP (g_trac_tpmdd, ENTER_MRK"tpmPerformOp(): " - "i_opType=%d, chip=%d, operation=%d, buflen=%d, cmdlen=%d", - (uint64_t) i_opType, tpmInfo.chip, tpmInfo.operation, io_buflen, + "i_opType=%d, operation=%d, buflen=%d, cmdlen=%d", + (uint64_t) i_opType, tpmInfo.operation, io_buflen, commandSize); do @@ -127,8 +130,8 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmPerformOp(): TPM requested not enabled!" - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d", - tpmInfo.chip, tpmInfo.port, + "p/e/dA=%d/%d/0x%X, OP=%d", + tpmInfo.port, tpmInfo.engine, tpmInfo.devAddr, tpmInfo.operation); /*@ @@ -136,15 +139,15 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, * @reasoncode TPM_DEVICE_NOT_AVAILABLE * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_PERFORM_OP - * @userdata1 Operation Type - * @userdata2 Chip to Access + * @userdata1 TPM + * @userdata2 Operation Type * @devdesc Invalid operation type. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_PERFORM_OP, TPM_DEVICE_NOT_AVAILABLE, + TARGETING::get_huid(i_target), i_opType, - tpmInfo.chip, true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); @@ -169,9 +172,9 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmPerformOp(): Operation Overflow! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "blen=%d", - tpmInfo.chip, tpmInfo.port, + tpmInfo.port, tpmInfo.engine, tpmInfo.devAddr, tpmInfo.operation, io_buflen); @@ -181,8 +184,9 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, * @reasoncode TPM_OVERFLOW_ERROR * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_PERFORM_OP - * @userdata1 Operation - * @userdata2 Buffer Length (in Bytes) + * @userdata1 TPM + * @userdata2[0-31] Operation + * @userdata2[32-63] Buffer Length (in Bytes) * @devdesc TPM buffer length > 4 for read vendor op * @custdesc A problem occurred during the IPL of the * system: TPM buffer is too large. @@ -190,8 +194,10 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_PERFORM_OP, TPM_OVERFLOW_ERROR, - tpmInfo.operation, - io_buflen, + TARGETING::get_huid(i_target), + TWO_UINT32_TO_UINT64( + tpmInfo.operation, + io_buflen ), true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); @@ -236,8 +242,8 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmPerformOp(): Invalid TPM Operation!" - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, Type=%d", - tpmInfo.chip, tpmInfo.port, + "p/e/dA=%d/%d/0x%X, OP=%d, Type=%d", + tpmInfo.port, tpmInfo.engine, tpmInfo.devAddr, tpmInfo.operation, i_opType); @@ -246,15 +252,15 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, * @reasoncode TPM_INVALID_OPERATION * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_PERFORM_OP - * @userdata1 Operation Type - * @userdata2 Chip to Access + * @userdata1 TPM + * @userdata2 Operation Type * @devdesc Invalid operation type. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_PERFORM_OP, TPM_INVALID_OPERATION, + TARGETING::get_huid(i_target), i_opType, - tpmInfo.chip, true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); @@ -281,22 +287,19 @@ errlHndl_t tpmPerformOp( DeviceFW::OperationType i_opType, //------------------------------------------------------------------- //tpmPresence //------------------------------------------------------------------- -bool tpmPresence ( TARGETING::Target * i_target, - tpm_chip_types_t i_chip) +bool tpmPresence ( TARGETING::Target * i_target) { TRACDCOMP(g_trac_tpmdd, ENTER_MRK"tpmPresence()"); TRACUCOMP(g_trac_tpmdd, ENTER_MRK"tpmPresence() : " - "node tgt=0x%X chip=%d", - TARGETING::get_huid(i_target), - i_chip); + "tpm tgt=0x%X ", + TARGETING::get_huid(i_target)); errlHndl_t err = NULL; bool l_present = true; tpm_info_t tpmInfo; - tpmInfo.chip = i_chip; tpmInfo.offset = 0; do { @@ -347,9 +350,8 @@ bool tpmPresence ( TARGETING::Target * i_target, { TRACUCOMP(g_trac_tpmdd, ERR_MRK"tpmPresence : ReadVendorID failed!" - "node tgt=0x%X C-p/e/dA=%d-%d/%d/0x%X RC=0x%X", + "tpm tgt=0x%X p/e/dA=%d/%d/0x%X RC=0x%X", TARGETING::get_huid(i_target), - tpmInfo.chip, tpmInfo.port, tpmInfo.engine, static_cast<uint64_t>(tpmInfo.devAddr), @@ -366,10 +368,9 @@ bool tpmPresence ( TARGETING::Target * i_target, { TRACUCOMP(g_trac_tpmdd, ERR_MRK"tpmPresence : ReadVendorID mismatch!" - "node tgt=0x%X C-p/e/dA=%d-%d/%d/0x%X" + "tpm tgt=0x%X p/e/dA=%d/%d/0x%X" " found ID=0x%X exp ID=0x%X", TARGETING::get_huid(i_target), - tpmInfo.chip, tpmInfo.port, tpmInfo.engine, static_cast<uint64_t>(tpmInfo.devAddr), @@ -399,9 +400,8 @@ bool tpmPresence ( TARGETING::Target * i_target, { TRACUCOMP(g_trac_tpmdd, ERR_MRK"tpmPresence : ReadFamilyID failed!" - "node tgt=0x%X C-p/e/dA=%d-%d/%d/0x%X RC=0x%X", + "tpm tgt=0x%X p/e/dA=%d/%d/0x%X RC=0x%X", TARGETING::get_huid(i_target), - tpmInfo.chip, tpmInfo.port, tpmInfo.engine, static_cast<uint64_t>(tpmInfo.devAddr), @@ -418,10 +418,9 @@ bool tpmPresence ( TARGETING::Target * i_target, { TRACUCOMP(g_trac_tpmdd, ERR_MRK"tpmPresence : FamilyID mismatch!" - "node tgt=0x%X C-p/e/dA=%d-%d/%d/0x%X" + "tpm tgt=0x%X p/e/dA=%d/%d/0x%X" " found ID=0x%X exp ID=0x%X", TARGETING::get_huid(i_target), - tpmInfo.chip, tpmInfo.port, tpmInfo.engine, static_cast<uint64_t>(tpmInfo.devAddr), @@ -434,10 +433,9 @@ bool tpmPresence ( TARGETING::Target * i_target, { TRACFCOMP(g_trac_tpmdd, INFO_MRK"tpmPresence : TPM Detected!" - " node tgt=0x%X C-p/e/dA=%d-%d/%d/0x%X" + " tpm tgt=0x%X p/e/dA=%d/%d/0x%X" " Vendor ID=0x%X, Family ID=0x%X", TARGETING::get_huid(i_target), - tpmInfo.chip, tpmInfo.port, tpmInfo.engine, static_cast<uint64_t>(tpmInfo.devAddr), @@ -454,12 +452,47 @@ bool tpmPresence ( TARGETING::Target * i_target, TRACDCOMP(g_trac_tpmdd, EXIT_MRK"tpmPresence() : presence : %d", l_present); TRACUCOMP(g_trac_tpmdd, EXIT_MRK"tpmPresence() : " - "node tgt=0x%X chip=%d presence=%d", - TARGETING::get_huid(i_target), - i_chip, l_present); + "tpm tgt=0x%X presence=%d", + TARGETING::get_huid(i_target), l_present); return l_present; } +errlHndl_t tpmPresenceDetect(DeviceFW::OperationType i_opType, + TARGETING::Target* i_target, + void* io_buffer, + size_t& io_buflen, + int64_t i_accessType, + va_list i_args) +{ + errlHndl_t err = NULL; + if (unlikely(io_buflen < sizeof(bool))) + { + TRACFCOMP(g_trac_tpmdd, + ERR_MRK "tpmPresenceDetect> Invalid data length: %d", + io_buflen); + /*@ + * @errortype + * @moduleid TPMDD_TPMPRESENCEDETECT + * @reasoncode TPM_INVALID_OPERATION + * @userdata1 Data Length + * @devdesc presenceDetect> Invalid data length (!= 1 bytes) + * @custdesc Problem occurred during TPM presence detection + */ + err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + TPMDD_TPMPRESENCEDETECT, + TPM_INVALID_OPERATION, + TO_UINT64(io_buflen), + true /*SW error*/); + io_buflen = 0; + } else { + bool present = tpmPresence (i_target); + memcpy(io_buffer, &present, sizeof(present)); + io_buflen = sizeof(present); + } + return err; + +} + // ------------------------------------------------------------------ // tpmRead // ------------------------------------------------------------------ @@ -479,8 +512,8 @@ errlHndl_t tpmRead ( void * o_buffer, do { TRACUCOMP( g_trac_tpmdd, - "TPM READ START : Chip: %02d : Offset %.2X : Len %d", - i_tpmInfo.chip, i_tpmInfo.offset, i_buflen ); + "TPM READ START : Offset %.2X : Len %d", + i_tpmInfo.offset, i_buflen ); err = tpmPrepareAddress( &byteAddr, byteAddrSize, @@ -518,9 +551,9 @@ errlHndl_t tpmRead ( void * o_buffer, { TRACFCOMP(g_trac_tpmdd, ERR_MRK"tpmRead(): I2C Read-Offset failed! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "offset=0x%X, aS=%d, len=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, i_tpmInfo.offset, byteAddrSize, i_buflen); @@ -545,9 +578,9 @@ errlHndl_t tpmRead ( void * o_buffer, { TRACFCOMP(g_trac_tpmdd, ERR_MRK"tpmRead(): I2C Read failed! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "len=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, i_buflen); @@ -566,9 +599,9 @@ errlHndl_t tpmRead ( void * o_buffer, { // Only retry on NACK failures: break from retry loop TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmRead(): Non-Nack! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "Error: rc=0x%X, No Retry (retry=%d)", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), retry); @@ -591,10 +624,10 @@ errlHndl_t tpmRead ( void * o_buffer, TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmRead(): NACK Error! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "rc=0x%X, eid=0x%X, " "retry/MAX=%d/%d. Save error and retry", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err_NACK->reasonCode(), @@ -608,11 +641,11 @@ errlHndl_t tpmRead ( void * o_buffer, // Add data to original NACK error TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmRead(): Another NACK Error! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "rc=0x%X, eid=0x%X, " "plid=0x%X, retry/MAX=%d/%d. " "Delete error and retry", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), err->eid(), err->plid(), @@ -634,10 +667,10 @@ errlHndl_t tpmRead ( void * o_buffer, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmRead(): No More Retries! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "Error rc=0x%X, eid=%d, " "retry/MAX=%d/%d. Returning Error", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), err->eid(), @@ -685,9 +718,8 @@ errlHndl_t tpmRead ( void * o_buffer, TRACUCOMP( g_trac_tpmdd, - "TPM READ END : Chip: %02d : " - "Offset %.2X : Len %d : %016llx", - i_tpmInfo.chip, i_tpmInfo.offset, i_buflen, + "TPM READ END : Offset %.2X : Len %d : %016llx", + i_tpmInfo.offset, i_buflen, *(reinterpret_cast<uint64_t*>(o_buffer)) ); } while( 0 ); @@ -716,9 +748,8 @@ errlHndl_t tpmWrite ( void * i_buffer, do { TRACUCOMP( g_trac_tpmdd, - "TPM WRITE START : Chip: %02d : " - "Offset %.2X : Len %d : %016llx", - i_tpmInfo.chip, i_tpmInfo.offset, + "TPM WRITE START : Offset %.2X : Len %d : %016llx", + i_tpmInfo.offset, i_buflen, *(reinterpret_cast<uint64_t*>(i_buffer)) ); @@ -758,9 +789,9 @@ errlHndl_t tpmWrite ( void * i_buffer, { TRACFCOMP(g_trac_tpmdd, ERR_MRK"tpmWrite(): I2C Write-Offset! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, ", + "p/e/dA=%d/%d/0x%X, OP=%d, ", "offset=0x%X, aS=%d, len=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, i_tpmInfo.offset, byteAddrSize, i_buflen); @@ -785,9 +816,9 @@ errlHndl_t tpmWrite ( void * i_buffer, { TRACFCOMP(g_trac_tpmdd, ERR_MRK"tpmWrite(): I2C Write failed! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "len=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, i_buflen); @@ -806,9 +837,9 @@ errlHndl_t tpmWrite ( void * i_buffer, { // Only retry on NACK failures: break from retry loop TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWrite(): Non-Nack " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "Error: rc=0x%X, No Retry (retry=%d)", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), retry); @@ -831,10 +862,10 @@ errlHndl_t tpmWrite ( void * i_buffer, TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWrite(): NACK Error! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "rc=0x%X, eid=0x%X, " "retry/MAX=%d/%d. Save error and retry", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err_NACK->reasonCode(), @@ -848,11 +879,11 @@ errlHndl_t tpmWrite ( void * i_buffer, // Add data to original NACK error TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWrite(): Another NACK Error! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "rc=0x%X, eid=0x%X " "plid=0x%X, retry/MAX=%d/%d. " "Delete error and retry", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), err->eid(), err->plid(), @@ -874,10 +905,10 @@ errlHndl_t tpmWrite ( void * i_buffer, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWrite(): No More Retries! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "Error rc=0x%X, eid=%d, " "retry/MAX=%d/%d. Returning Error", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, err->reasonCode(), err->eid(), @@ -922,9 +953,8 @@ errlHndl_t tpmWrite ( void * i_buffer, TRACSCOMP( g_trac_tpmdd, - "TPM WRITE END : Chip: %02d : " - "Offset %.2X : Len %d", - i_tpmInfo.chip, i_tpmInfo.offset, i_buflen); + "TPM WRITE END : Offset %.2X : Len %d", + i_tpmInfo.offset, i_buflen); } while( 0 ); @@ -952,9 +982,7 @@ errlHndl_t tpmTransmit ( void * io_buffer, { TRACUCOMP( g_trac_tpmdd, - "TPM TRANSMIT START : Chip: %02d : " - "BufLen %d : CmdLen %d : %016llx", - i_tpmInfo.chip, + "TPM TRANSMIT START : BufLen %d : CmdLen %d : %016llx", io_buflen, i_commandlen, *(reinterpret_cast<uint64_t*>(io_buffer)) ); @@ -1011,9 +1039,7 @@ errlHndl_t tpmTransmit ( void * io_buffer, } while( 0 ); TRACUCOMP( g_trac_tpmdd, - "TPM TRANSMIT END : Chip: %02d : " - "BufLen %d : CmdLen %d : %016llx", - i_tpmInfo.chip, + "TPM TRANSMIT END : BufLen %d : CmdLen %d : %016llx", io_buflen, i_commandlen, *(reinterpret_cast<uint64_t*>(io_buffer)) ); @@ -1068,18 +1094,18 @@ errlHndl_t tpmPrepareAddress ( void * io_buffer, * @reasoncode TPM_INVALID_DEVICE_TYPE * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_PREPAREADDRESS - * @userdata1 Address Size (aka Device Type) - * @userdata2 TPM chip + * @userdata1 TPM + * @userdata2 Address Size (aka Device Type) * @devdesc The Device type not supported (addrSize) * @custdesc A problem was detected during the IPL of * the system: Device type not supported. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_PREPAREADDRESS, - TPM_INVALID_DEVICE_TYPE, - i_tpmInfo.addrSize, - i_tpmInfo.chip, - true /*Add HB SW Callout*/ ); + TPMDD_PREPAREADDRESS, + TPM_INVALID_DEVICE_TYPE, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + i_tpmInfo.addrSize, + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); @@ -1102,80 +1128,24 @@ errlHndl_t tpmReadAttributes ( TARGETING::Target * i_target, tpm_info_t & io_tpmInfo ) { errlHndl_t err = NULL; - bool fail_reading_attribute = false; TRACDCOMP( g_trac_tpmdd, ENTER_MRK"tpmReadAttributes()" ); // These variables will be used to hold the TPM attribute data - TARGETING::TpmPrimaryInfo tpmData; + TARGETING::TpmInfo tpmData; do { - switch (io_tpmInfo.chip ) - { - case TPM_PRIMARY: - if( !( i_target-> - tryGetAttr<TARGETING::ATTR_TPM_PRIMARY_INFO> - ( tpmData ) ) ) - - { - fail_reading_attribute = true; - } - break; - - case TPM_BACKUP: - - if( !(i_target-> - tryGetAttr<TARGETING::ATTR_TPM_BACKUP_INFO> - ( reinterpret_cast< - TARGETING::ATTR_TPM_BACKUP_INFO_type&> - ( tpmData) ) ) ) - { - fail_reading_attribute = true; - } - break; - - default: - TRACFCOMP( g_trac_tpmdd,ERR_MRK"tpmReadAttributes() - " - "Invalid chip %d tgt=0x%X to read attributes from!", - io_tpmInfo.chip, - TARGETING::get_huid(i_target)); + if( !( i_target-> + tryGetAttr<TARGETING::ATTR_TPM_INFO> + ( tpmData ) ) ) - /*@ - * @errortype - * @reasoncode TPM_INVALID_CHIP - * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE - * @moduleid TPMDD_READATTRIBUTES - * @userdata1 TPM Chip - * @userdata2 HUID of target - * @devdesc Invalid TPM chip to access - */ - err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_READATTRIBUTES, - TPM_INVALID_CHIP, - io_tpmInfo.chip, - TARGETING::get_huid(i_target), - true /*Add HB SW Callout*/ ); - - err->collectTrace( TPMDD_COMP_NAME ); - - break; - } - - if (NULL != err) - { - break; - } - - // Check if Attribute Data was found - if( fail_reading_attribute == true ) { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmReadAttributes() - ERROR reading " - "attributes for chip %d, tgt=0x%X!", - io_tpmInfo.chip, + "attributes for tgt=0x%X!", TARGETING::get_huid(i_target)); /*@ @@ -1184,15 +1154,14 @@ errlHndl_t tpmReadAttributes ( TARGETING::Target * i_target, * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_READATTRIBUTES * @userdata1 HUID of target - * @userdata2 TPM chip + * @userdata2 0 * @devdesc TPM attribute was not found */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_READATTRIBUTES, TPM_ATTR_INFO_NOT_FOUND, - TARGETING::get_huid(i_target), - io_tpmInfo.chip); + TARGETING::get_huid(i_target)); // Could be FSP or HB code's fault err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE, @@ -1213,6 +1182,7 @@ errlHndl_t tpmReadAttributes ( TARGETING::Target * i_target, io_tpmInfo.engine = tpmData.engine; io_tpmInfo.i2cMasterPath = tpmData.i2cMasterPath; io_tpmInfo.tpmEnabled = tpmData.tpmEnabled; + io_tpmInfo.tpmTarget = i_target; // Convert attribute info to tpm_addr_size_t enum if ( tpmData.byteAddrOffset == 0x2 ) @@ -1374,8 +1344,7 @@ errlHndl_t tpmGetI2CMasterTarget ( TARGETING::Target * i_target, * @reasoncode TPM_I2C_MASTER_PATH_ERROR * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_GETI2CMASTERTARGET - * @userdata1[00:31] Attribute Chip Type Enum - * @userdata1[32:63] HUID of target + * @userdata1 HUID of target * @userdata2 Compressed Entity Path * @devdesc I2C master entity path doesn't exist. */ @@ -1383,9 +1352,7 @@ errlHndl_t tpmGetI2CMasterTarget ( TARGETING::Target * i_target, ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_GETI2CMASTERTARGET, TPM_I2C_MASTER_PATH_ERROR, - TWO_UINT32_TO_UINT64( - io_tpmInfo.chip, - TARGETING::get_huid(i_target) ), + TARGETING::get_huid(i_target), l_epCompressed, true /*Add HB SW Callout*/ ); @@ -1428,17 +1395,14 @@ errlHndl_t tpmGetI2CMasterTarget ( TARGETING::Target * i_target, * @reasoncode TPM_TARGET_NULL * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_GETI2CMASTERTARGET - * @userdata1[00:31] Attribute Chip Type Enum - * @userdata1[32:63] HUID of target + * @userdata1 HUID of target * @userdata2 Compressed Entity Path * @devdesc I2C master path target is null. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD::TPMDD_GETI2CMASTERTARGET, TPMDD::TPM_TARGET_NULL, - TWO_UINT32_TO_UINT64( - io_tpmInfo.chip, - TARGETING::get_huid(i_target) ), + TARGETING::get_huid(i_target), l_epCompressed, true /*Add HB SW Callout*/ ); @@ -1514,8 +1478,8 @@ errlHndl_t tpmReadSTSRegValid ( tpm_info_t i_tpmInfo, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmReadSTSRegValid(): Timeout! " - "C-p/e/dA=%d-%d/%d/0x%X, %02X", - i_tpmInfo.chip, i_tpmInfo.port, + "p/e/dA=%d/%d/0x%X, %02X", + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, o_stsReg.value); @@ -1524,18 +1488,21 @@ errlHndl_t tpmReadSTSRegValid ( tpm_info_t i_tpmInfo, * @reasoncode TPM_TIMEOUT * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_READSTSREGVALID - * @userdata1 Operation - * @userdata2 STS Reg + * @userdata1 TPM + * @userdata2[0:31] Operation + * @userdata2[32:63] STS Reg * @devdesc TPM timeout waiting for stsValid * @custdesc A problem occurred during the IPL of the * system: TPM timeout */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_READSTSREGVALID, - TPM_TIMEOUT, - i_tpmInfo.operation, - o_stsReg.value, - true /*Add HB SW Callout*/ ); + TPMDD_READSTSREGVALID, + TPM_TIMEOUT, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + TWO_UINT32_TO_UINT64( + i_tpmInfo.operation, + o_stsReg.value), + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); break; @@ -1621,26 +1588,27 @@ errlHndl_t tpmPollForCommandReady( tpm_info_t i_tpmInfo) TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmPollForCommandReady() - " "Timeout polling for command ready! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "STS=0x%X", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, stsReg.value ); /*@ * @errortype - * @reasoncode TPM_TIMEOUT - * @severity ERRL_SEV_UNRECOVERABLE - * @moduleid TPMDD_POLLFORCOMMMANDREADY - * @userdata1 Attribute Chip Type Enum - * @userdata2 STS Reg - * @devdesc Timeout waiting for TPM to enter command ready state. + * @reasoncode TPM_TIMEOUT + * @severity ERRL_SEV_UNRECOVERABLE + * @moduleid TPMDD_POLLFORCOMMMANDREADY + * @userdata1 TPM + * @userdata2 STS Reg + * @devdesc Timeout waiting for TPM to enter command ready state. + * @custdesc TPM operation failure */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_POLLFORCOMMMANDREADY, TPM_TIMEOUT, - i_tpmInfo.chip, + TARGETING::get_huid(i_tpmInfo.tpmTarget), stsReg.value, true /*Add HB SW Callout*/ ); @@ -1712,9 +1680,9 @@ errlHndl_t tpmPollForDataAvail( tpm_info_t i_tpmInfo) TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmPollForDataAvail() - " "Timeout polling for dataAvail! " - "C-p/e/dA=%d-%d/%d/0x%X, OP=%d, " + "p/e/dA=%d/%d/0x%X, OP=%d, " "STS=0x%X", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_tpmInfo.operation, stsReg.value ); @@ -1723,15 +1691,16 @@ errlHndl_t tpmPollForDataAvail( tpm_info_t i_tpmInfo) * @reasoncode TPM_TIMEOUT * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_POLLFORDATAAVAIL - * @userdata1 Attribute Chip Type Enum + * @userdata1 TPM * @userdata2 STS Reg * @devdesc Timeout waiting for TPM data available. + * @custdesc TPM operation failure */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_POLLFORDATAAVAIL, TPM_TIMEOUT, - i_tpmInfo.chip, + TARGETING::get_huid(i_tpmInfo.tpmTarget), stsReg.value, true /*Add HB SW Callout*/ ); @@ -1875,9 +1844,9 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, // TPM is not expecting more data, we overflowed TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWriteFifo(): Data Overflow! " - "C-p/e/dA=%d-%d/%d/0x%X, blen=%d, " + "p/e/dA=%d/%d/0x%X, blen=%d, " "clen=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_buflen, curByte); @@ -1886,22 +1855,21 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, * @reasoncode TPM_OVERFLOW_ERROR * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_WRITEFIFO - * @userdata1[0:31] Current byte - * @userdata1[32:63] Buffer Length (in Bytes) - * @userdata2 8 bytes of command buffer + * @userdata1 TPM + * @userdata2[0:31] Current byte + * @userdata2[32:63] Buffer Length (in Bytes) * @devdesc TPM expected less data during FIFO write * @custdesc A problem occurred during the IPL of the * system: TPM overflow */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_WRITEFIFO, - TPM_OVERFLOW_ERROR, - TWO_UINT32_TO_UINT64( - curByte, - i_buflen ), - *(reinterpret_cast<uint64_t*> - (i_buffer)), - true /*Add HB SW Callout*/ ); + TPMDD_WRITEFIFO, + TPM_OVERFLOW_ERROR, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + TWO_UINT32_TO_UINT64( + curByte, + i_buflen ), + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); } @@ -1962,9 +1930,9 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWriteFifo(): Timeout! " - "C-p/e/dA=%d-%d/%d/0x%X, blen=%d, " + "p/e/dA=%d/%d/0x%X, blen=%d, " "clen=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_buflen, curByte); @@ -1973,9 +1941,9 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, * @reasoncode TPM_TIMEOUT * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_WRITEFIFO - * @userdata1[0:31] Current Byte - * @userdata1[32:63] Buffer Length (in Bytes) - * @userdata2 8 bytes of command buffer + * @userdata1 TPM + * @userdata2[0:31] Current Byte + * @userdata2[32:63] Buffer Length (in Bytes) * @devdesc TPM timeout writing to FIFO * @custdesc A problem occurred during the IPL of the * system: TPM timeout @@ -1983,11 +1951,10 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, TPMDD_WRITEFIFO, TPM_TIMEOUT, + TARGETING::get_huid(i_tpmInfo.tpmTarget), TWO_UINT32_TO_UINT64( curByte, i_buflen ), - *(reinterpret_cast<uint64_t*> - (i_buffer)), true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); @@ -2005,9 +1972,9 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, // TPM is expecting more data even though we think we are done TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmWriteFifo(): Data Underflow! " - "C-p/e/dA=%d-%d/%d/0x%X, blen=%d, " + "p/e/dA=%d/%d/0x%X, blen=%d, " "clen=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, i_buflen, curByte); @@ -2016,22 +1983,21 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, * @reasoncode TPM_UNDERFLOW_ERROR * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_WRITEFIFO - * @userdata1[0:31] Current Byte - * @userdata1[32:63] Buffer Length (in Bytes) - * @userdata2 8 bytes of command buffer + * @userdata1 TPM + * @userdata2[0:31] Current Byte + * @userdata2[32:63] Buffer Length (in Bytes) * @devdesc TPM expected more data during FIFO write * @custdesc A problem occurred during the IPL of the * system: TPM underflow */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_WRITEFIFO, - TPM_UNDERFLOW_ERROR, - TWO_UINT32_TO_UINT64( - curByte, - i_buflen ), - *(reinterpret_cast<uint64_t*> - (i_buffer)), - true /*Add HB SW Callout*/ ); + TPMDD_WRITEFIFO, + TPM_UNDERFLOW_ERROR, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + TWO_UINT32_TO_UINT64( + curByte, + i_buflen ), + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); } @@ -2083,9 +2049,9 @@ errlHndl_t tpmReadFifo( tpm_info_t i_tpmInfo, // TPM is expecting more data even though we think we are done TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmReadFifo(): Data Overflow! " - "C-p/e/dA=%d-%d/%d/0x%X, blen=%d, " + "p/e/dA=%d/%d/0x%X, blen=%d, " "clen=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, io_buflen, curByte + burstCount); @@ -2094,22 +2060,24 @@ errlHndl_t tpmReadFifo( tpm_info_t i_tpmInfo, * @reasoncode TPM_OVERFLOW_ERROR * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_READFIFO - * @userdata1[0:31] Operation - * @userdata1[32:63] Buffer Length (in Bytes) - * @userdata2 Current Byte + * @userdata1 TPM + * @userdata2[0:15] Operation + * @userdata2[16:31] Current Byte + * @userdata2[32:63] Buffer Length (in Bytes) * @devdesc TPM provided more data during FIFO read * then buffer space provided * @custdesc A problem occurred during the IPL of the * system: TPM overflow */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_READFIFO, - TPM_OVERFLOW_ERROR, - TWO_UINT32_TO_UINT64( - i_tpmInfo.operation, - io_buflen ), - curByte, - true /*Add HB SW Callout*/ ); + TPMDD_READFIFO, + TPM_OVERFLOW_ERROR, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + TWO_UINT32_TO_UINT64( + TWO_UINT16_TO_UINT32(i_tpmInfo.operation, + curByte), + io_buflen), + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); break; @@ -2144,9 +2112,9 @@ errlHndl_t tpmReadFifo( tpm_info_t i_tpmInfo, { TRACFCOMP( g_trac_tpmdd, ERR_MRK"tpmReadFifo(): Timeout! " - "C-p/e/dA=%d-%d/%d/0x%X, blen=%d, " + "p/e/dA=%d/%d/0x%X, blen=%d, " "clen=%d", - i_tpmInfo.chip, i_tpmInfo.port, + i_tpmInfo.port, i_tpmInfo.engine, i_tpmInfo.devAddr, io_buflen, curByte); @@ -2155,21 +2123,23 @@ errlHndl_t tpmReadFifo( tpm_info_t i_tpmInfo, * @reasoncode TPM_TIMEOUT * @severity ERRL_SEV_UNRECOVERABLE * @moduleid TPMDD_READFIFO - * @userdata1[0:31] Operation - * @userdata1[32:63] Buffer Length (in Bytes) - * @userdata2 Current Byte + * @userdata1 TPM + * @userdata2[0:15] Operation + * @userdata2[16:31] Current Byte + * @userdata2[32:63] Buffer Length (in Bytes) * @devdesc TPM timeout writing to FIFO * @custdesc A problem occurred during the IPL of the * system: TPM timeout */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - TPMDD_READ, - TPM_TIMEOUT, - TWO_UINT32_TO_UINT64( - i_tpmInfo.operation, - io_buflen ), - curByte, - true /*Add HB SW Callout*/ ); + TPMDD_READ, + TPM_TIMEOUT, + TARGETING::get_huid(i_tpmInfo.tpmTarget), + TWO_UINT32_TO_UINT64( + TWO_UINT16_TO_UINT32(i_tpmInfo.operation, + curByte), + io_buflen), + true /*Add HB SW Callout*/ ); err->collectTrace( TPMDD_COMP_NAME ); } diff --git a/src/usr/i2c/tpmdd.H b/src/usr/i2c/tpmdd.H index 1daee5ab6..2529288d7 100755 --- a/src/usr/i2c/tpmdd.H +++ b/src/usr/i2c/tpmdd.H @@ -466,6 +466,28 @@ errlHndl_t tpmWriteFifo( tpm_info_t i_tpmInfo, errlHndl_t tpmReadFifo( tpm_info_t i_tpmInfo, void * o_buffer, size_t & io_buflen); +/** + * @brief Performs a presence detect operation on a TPM Chip. + * This is used for the discoverTargets path and called TPMDD::tpmPresence + * + * @param[in] i_opType Operation type, see DeviceFW::OperationType + * in driverif.H + * @param[in] i_target Presence detect target + * @param[in/out] io_buffer Read: Pointer to output data storage + * Write: Pointer to input data storage + * @param[in/out] io_buflen Input: size of io_buffer (in bytes, always 1) + * Output: Success = 1, Failure = 0 + * @param[in] i_accessType DeviceFW::AccessType enum (userif.H) + * @param[in] i_args This is an argument list for DD framework. + * In this function, there are no arguments. + * @return errlHndl_t + */ +errlHndl_t tpmPresenceDetect(DeviceFW::OperationType i_opType, + TARGETING::Target* i_target, + void* io_buffer, + size_t& io_buflen, + int64_t i_accessType, + va_list i_args); }; // end TPMDD namespace diff --git a/src/usr/secureboot/trusted/test/trustedbootTest.H b/src/usr/secureboot/trusted/test/trustedbootTest.H index e8b062ad7..e46a8ff4f 100755 --- a/src/usr/secureboot/trusted/test/trustedbootTest.H +++ b/src/usr/secureboot/trusted/test/trustedbootTest.H @@ -38,6 +38,9 @@ #include <errl/errlentry.H> #include <i2c/tpmddif.H> #include <secureboot/trustedbootif.H> +#include <targeting/common/predicates/predicates.H> +#include <targeting/common/attributes.H> +#include <targeting/common/utilFilter.H> #include "../trustedTypes.H" #include "../trustedboot.H" #include "../trustedbootCmds.H" @@ -691,7 +694,6 @@ class TrustedBootTest: public CxxTest::TestSuite */ TRUSTEDBOOT::TpmTarget getTestTarget() { - TARGETING::TargetService& tS = TARGETING::targetService(); TRUSTEDBOOT::TpmTarget target; TPMDD::tpm_info_t tpmInfo; @@ -699,37 +701,41 @@ class TrustedBootTest: public CxxTest::TestSuite target.initAttempted = true; target.failed = false; - tS.getMasterNodeTarget( target.nodeTarget ); - - assert(target.nodeTarget != NULL); + TARGETING::TargetHandleList tpmList; + TARGETING::getAllChips(tpmList, + TARGETING::TYPE_TPM, + false); + if (tpmList.size() > 0) + { + target.tpmTarget = tpmList[0]; - TRACFCOMP( g_trac_trustedboot, - "getTestTarget node tgt=0x%X chip=%d", - TARGETING::get_huid(target.nodeTarget)); + TRACFCOMP( g_trac_trustedboot, + "getTestTarget tpm tgt=0x%X", + TARGETING::get_huid(target.tpmTarget)); - // Let's see if the requested chip is functional - target.chip = TPMDD::TPM_PRIMARY; - tpmInfo.chip = TPMDD::TPM_PRIMARY; - errlHndl_t err = tpmReadAttributes (target.nodeTarget, - tpmInfo); + // Let's see if the requested chip is functional + target.role = TPM_PRIMARY; + errlHndl_t err = tpmReadAttributes (target.tpmTarget, + tpmInfo); - if (NULL != err) - { - target.failed = true; - delete err; - } - else if (!tpmInfo.tpmEnabled) - { - TRACFCOMP(g_trac_trustedboot, "getTestTarget - " - "Chip %d not enabled", - tpmInfo.chip); - target.failed = true; - } - else - { - TRACFCOMP(g_trac_trustedboot, "getTestTarget - " - "Chip %d enabled", - target.chip); + if (NULL != err) + { + target.failed = true; + delete err; + } + else if (!tpmInfo.tpmEnabled) + { + TRACFCOMP(g_trac_trustedboot, "getTestTarget - " + "Chip %d not enabled", + target.role); + target.failed = true; + } + else + { + TRACFCOMP(g_trac_trustedboot, "getTestTarget - " + "Chip %d enabled", + target.role); + } } return target; diff --git a/src/usr/secureboot/trusted/tpmLogMgr.C b/src/usr/secureboot/trusted/tpmLogMgr.C index b291d935f..89ab41a8a 100644 --- a/src/usr/secureboot/trusted/tpmLogMgr.C +++ b/src/usr/secureboot/trusted/tpmLogMgr.C @@ -83,6 +83,7 @@ namespace TRUSTEDBOOT * @userdata1 0 * @userdata2 0 * @devdesc TPM log buffer init failure. + * @custdesc TPM log buffer init failure. */ err = tpmCreateErrorLog( MOD_TPMLOGMGR_INITIALIZE, RC_TPMLOGMGR_INIT_FAIL, 0, 0); @@ -177,6 +178,7 @@ namespace TRUSTEDBOOT * @userdata1 0 * @userdata2 0 * @devdesc TPM log header entry is missing. + * @custdesc TPM log invalid format */ err = tpmCreateErrorLog(MOD_TPMLOGMGR_INITIALIZEEXISTLOG, RC_TPMLOGMGR_LOGWALKFAIL, @@ -235,13 +237,16 @@ namespace TRUSTEDBOOT * @reasoncode RC_TPMLOGMGR_ADDEVENT_FAIL * @severity ERRL_SEV_UNRECOVERABLE * @moduleid MOD_TPMLOGMGR_ADDEVENT - * @userdata1 Log buffer NULL - * @userdata2[0:31] Current Log Size + * @userdata1[0:31] Max log size + * @userdata1[32:63] Log buffer NULL + * @userdata2[0:31] Current Log Size * @userdata2[32:63] New entry size * @devdesc TPM log buffer add failure. + * @custdesc TPM log overflow */ err = tpmCreateErrorLog( MOD_TPMLOGMGR_ADDEVENT, RC_TPMLOGMGR_ADDEVENT_FAIL, + (uint64_t)val->logMaxSize << 32 | (NULL == val->newEventPtr ? 0 : 1), (uint64_t)val->logSize << 32 | newLogSize); @@ -264,7 +269,8 @@ namespace TRUSTEDBOOT * @moduleid MOD_TPMLOGMGR_ADDEVENT * @userdata1 0 * @userdata2 0 - * @devdesc log buffer malloc failure. + * @devdesc log buffer marshal failure. + * @custdesc TPM log operation failure */ err = tpmCreateErrorLog( MOD_TPMLOGMGR_ADDEVENT, RC_TPMLOGMGR_ADDEVENTMARSH_FAIL, diff --git a/src/usr/secureboot/trusted/trustedTypes.H b/src/usr/secureboot/trusted/trustedTypes.H index 00effcd1c..dd42ccaae 100644 --- a/src/usr/secureboot/trusted/trustedTypes.H +++ b/src/usr/secureboot/trusted/trustedTypes.H @@ -71,9 +71,6 @@ namespace TRUSTEDBOOT /// Common static values enum { - MAX_SYSTEM_TPMS = 2, - TPM_MASTER_INDEX = 0, ///< Index into tpm array for master chip - TPM_BACKUP_INDEX = 1, ///< Index for backup TPM MAX_TPM_LOG_MSG = 128, ///< Maximum log message size HASH_COUNT = 2, ///< Maximum # of digests diff --git a/src/usr/secureboot/trusted/trustedboot.C b/src/usr/secureboot/trusted/trustedboot.C index f2776adfd..618fb81cc 100644 --- a/src/usr/secureboot/trusted/trustedboot.C +++ b/src/usr/secureboot/trusted/trustedboot.C @@ -83,9 +83,9 @@ errlHndl_t getTpmLogDevtreeInfo(TpmTarget & i_target, { errlHndl_t err = NULL; TRACUCOMP( g_trac_trustedboot, - ENTER_MRK"getTpmLogDevtreeInfo() Chip:%d Addr:%lX %lX", - i_target.chip, io_logAddr - ,(uint64_t)(i_target.logMgr)); + ENTER_MRK"getTpmLogDevtreeInfo() tgt=0x%X Addr:%lX %lX", + TARGETING::get_huid(i_target.tpmTarget), + io_logAddr ,(uint64_t)(i_target.logMgr)); o_allocationSize = 0; @@ -108,9 +108,10 @@ void setTpmDevtreeInfo(TpmTarget & i_target, uint32_t i_i2cMasterOffset) { TRACUCOMP( g_trac_trustedboot, - ENTER_MRK"setTpmLogDevtreeOffset() Chip:%d " + ENTER_MRK"setTpmLogDevtreeOffset() tgt=0x%X " "Xscom:%lX Master:%X", - i_target.chip, i_xscomAddr, i_i2cMasterOffset); + TARGETING::get_huid(i_target.tpmTarget), + i_xscomAddr, i_i2cMasterOffset); if (NULL != i_target.logMgr) { @@ -154,36 +155,92 @@ void* host_update_master_tpm( void *io_pArgs ) do { - // Get a node Target TARGETING::TargetService& tS = TARGETING::targetService(); - TARGETING::Target* nodeTarget = NULL; - tS.getMasterNodeTarget( nodeTarget ); - if (nodeTarget == NULL) - break; + TARGETING::Target* procTarget = NULL; + err = tS.queryMasterProcChipTargetHandle( procTarget ); - // Skip this target if target is non-functional - if(!nodeTarget->getAttr<TARGETING::ATTR_HWAS_STATE>(). \ - functional) + if (NULL != err) { - continue; + break; } + // Now get all TPM's to setup our array + TARGETING::TargetHandleList tpmList; + TARGETING::getAllChips(tpmList, + TARGETING::TYPE_TPM, + true); // ONLY FUNCTIONAL + + // Currently we only support a MAX of two TPMS + assert(tpmList.size() <= 2, "Too many TPMs found"); + mutex_lock( &(systemTpms.tpm[TPM_MASTER_INDEX].tpmMutex) ); + mutex_lock( &(systemTpms.tpm[TPM_BACKUP_INDEX].tpmMutex) ); unlock = true; + systemTpms.tpm[TPM_MASTER_INDEX].role = TPM_PRIMARY; + systemTpms.tpm[TPM_BACKUP_INDEX].role = TPM_BACKUP; + + if (0 == tpmList.size()) + { + TRACFCOMP( g_trac_trustedboot, + "No TPM Targets found"); + systemTpms.tpm[TPM_MASTER_INDEX].initAttempted = true; + systemTpms.tpm[TPM_MASTER_INDEX].available = false; + systemTpms.tpm[TPM_BACKUP_INDEX].initAttempted = true; + systemTpms.tpm[TPM_BACKUP_INDEX].available = false; + } + else + { + // Loop through the TPMs and figure out if they are attached + // to the master or alternate processor + TPMDD::tpm_info_t tpmData; + size_t tpmIdx = TPM_MASTER_INDEX; + for (size_t tpmNum = 0; tpmNum < tpmList.size(); tpmNum++) + { + memset(&tpmData, 0, sizeof(tpmData)); + errlHndl_t readErr = tpmReadAttributes(tpmList[tpmNum], + tpmData); + if (NULL != readErr) + { + // We are just looking for configured TPMs here + // so we ignore any errors + delete readErr; + readErr = NULL; + } + else + { + // Is the i2c master of this TPM also the master proc? + tpmIdx = (tpmData.i2cTarget == procTarget) ? + TPM_MASTER_INDEX : TPM_BACKUP_INDEX; + + if (NULL != systemTpms.tpm[tpmIdx].tpmTarget) + { + TRACFCOMP( g_trac_trustedboot, + "Duplicate TPM target found %d",tpmIdx); + } + else + { + systemTpms.tpm[tpmIdx].tpmTarget = tpmList[tpmNum]; + systemTpms.tpm[tpmIdx].available = true; + } + } + + } + } + if (!systemTpms.tpm[TPM_MASTER_INDEX].failed && - TPMDD::tpmPresence(nodeTarget, TPMDD::TPM_PRIMARY)) + systemTpms.tpm[TPM_MASTER_INDEX].available && + NULL != systemTpms.tpm[TPM_MASTER_INDEX].tpmTarget && + TPMDD::tpmPresence(systemTpms.tpm[TPM_MASTER_INDEX].tpmTarget)) { // Initialize the TPM, this will mark it as non-functional on fail - tpmInitialize(systemTpms.tpm[TPM_MASTER_INDEX], - nodeTarget, - TPMDD::TPM_PRIMARY); + tpmInitialize(systemTpms.tpm[TPM_MASTER_INDEX]); } else { - // TPM doesn't exist in the system + // Master TPM doesn't exist in the system systemTpms.tpm[TPM_MASTER_INDEX].initAttempted = true; systemTpms.tpm[TPM_MASTER_INDEX].available = false; } @@ -220,14 +277,14 @@ void* host_update_master_tpm( void *io_pArgs ) * @reasoncode RC_TPM_EXISTENCE_FAIL * @severity ERRL_SEV_UNRECOVERABLE * @moduleid MOD_HOST_UPDATE_MASTER_TPM - * @userdata1 node + * @userdata1 0 * @userdata2 0 * @devdesc No TPMs found in system. */ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, MOD_HOST_UPDATE_MASTER_TPM, RC_TPM_EXISTENCE_FAIL, - TARGETING::get_huid(nodeTarget), + 0, 0, true /*Add HB SW Callout*/ ); @@ -238,31 +295,36 @@ void* host_update_master_tpm( void *io_pArgs ) // Lastly we will check on the backup TPM and see if it is enabled // in the attributes at least - TPMDD::tpm_info_t tpmInfo; - tpmInfo.chip = TPMDD::TPM_BACKUP; - errlHndl_t tmpErr = TPMDD::tpmReadAttributes(nodeTarget, tpmInfo); - if (NULL != tmpErr) + if (NULL == systemTpms.tpm[TPM_BACKUP_INDEX].tpmTarget) { - // We don't want to log this error we will just assume - // the backup doesn't exist - delete tmpErr; - tmpErr = NULL; TRACUCOMP( g_trac_trustedboot, - "host_update_master_tpm() tgt=0x%X " + "host_update_master_tpm() " "Marking backup TPM unavailable " - "due to attribute fail", - TARGETING::get_huid(nodeTarget)); + "due to attribute fail"); systemTpms.tpm[TPM_BACKUP_INDEX].available = false; systemTpms.tpm[TPM_BACKUP_INDEX].initAttempted = true; } - else if (!tpmInfo.tpmEnabled) + else { - TRACUCOMP( g_trac_trustedboot, - "host_update_master_tpm() tgt=0x%X " - "Marking backup TPM unavailable", - TARGETING::get_huid(nodeTarget)); - systemTpms.tpm[TPM_BACKUP_INDEX].available = false; - systemTpms.tpm[TPM_BACKUP_INDEX].initAttempted = true; + TPMDD::tpm_info_t tpmInfo; + memset(&tpmInfo, 0, sizeof(tpmInfo)); + errlHndl_t tmpErr = TPMDD::tpmReadAttributes( + systemTpms.tpm[TPM_BACKUP_INDEX].tpmTarget, + tpmInfo); + if (NULL != tmpErr || !tpmInfo.tpmEnabled) + { + TRACUCOMP( g_trac_trustedboot, + "host_update_master_tpm() " + "Marking backup TPM unavailable"); + systemTpms.tpm[TPM_BACKUP_INDEX].available = false; + systemTpms.tpm[TPM_BACKUP_INDEX].initAttempted = true; + if (NULL != tmpErr) + { + // Ignore attribute read failure + delete tmpErr; + tmpErr = NULL; + } + } } } while ( 0 ); @@ -270,6 +332,7 @@ void* host_update_master_tpm( void *io_pArgs ) if( unlock ) { mutex_unlock(&(systemTpms.tpm[TPM_MASTER_INDEX].tpmMutex)); + mutex_unlock(&(systemTpms.tpm[TPM_BACKUP_INDEX].tpmMutex)); } if (NULL == err) @@ -304,28 +367,22 @@ void* host_update_master_tpm( void *io_pArgs ) } -void tpmInitialize(TRUSTEDBOOT::TpmTarget & io_target, - TARGETING::Target* i_nodeTarget, - TPMDD::tpm_chip_types_t i_chip) +void tpmInitialize(TRUSTEDBOOT::TpmTarget & io_target) { errlHndl_t err = NULL; TRACDCOMP( g_trac_trustedboot, ENTER_MRK"tpmInitialize()" ); TRACUCOMP( g_trac_trustedboot, - ENTER_MRK"tpmInitialize() tgt=0x%X chip=%d", - TARGETING::get_huid(io_target.nodeTarget), - io_target.chip); + ENTER_MRK"tpmInitialize() tgt=0x%X", + TARGETING::get_huid(io_target.tpmTarget)); do { // TPM Initialization sequence - io_target.nodeTarget = i_nodeTarget; - io_target.chip = i_chip; io_target.initAttempted = true; - io_target.available = true; io_target.failed = false; // TPM_STARTUP @@ -626,9 +683,8 @@ void tpmMarkFailed(TpmTarget * io_target) TRACFCOMP( g_trac_trustedboot, ENTER_MRK"tpmMarkFailed() Marking TPM as failed : " - "tgt=0x%X chip=%d", - TARGETING::get_huid(io_target->nodeTarget), - io_target->chip); + "tgt=0x%X", + TARGETING::get_huid(io_target->tpmTarget)); io_target->failed = true; /// @todo RTC:125287 Add fail marker to TPM log and disable TPM access diff --git a/src/usr/secureboot/trusted/trustedboot.H b/src/usr/secureboot/trusted/trustedboot.H index 930444f77..e3d987231 100644 --- a/src/usr/secureboot/trusted/trustedboot.H +++ b/src/usr/secureboot/trusted/trustedboot.H @@ -55,6 +55,14 @@ extern trace_desc_t* g_trac_trustedboot; namespace TRUSTEDBOOT { +/// Common static values +enum +{ + MAX_SYSTEM_TPMS = 2, + TPM_MASTER_INDEX = 0, ///< Index into tpm array for master chip + TPM_BACKUP_INDEX = 1, ///< Index for backup TPM +}; + /// Class object to store system TPM information class SystemTpms { @@ -75,12 +83,8 @@ public: /** * @brief Initialize the targeted TPM * @param[in/out] io_target Current TPM target structure - * @param[in] i_nodeTarget Node Target - * @param[in] i_chip Chip to initialize */ -void tpmInitialize(TRUSTEDBOOT::TpmTarget & io_target, - TARGETING::Target* i_nodeTarget, - TPMDD::tpm_chip_types_t i_chip); +void tpmInitialize(TRUSTEDBOOT::TpmTarget & io_target); /** * @brief Verify a functional TPM still exists in the system diff --git a/src/usr/secureboot/trusted/trustedbootUtils.C b/src/usr/secureboot/trusted/trustedbootUtils.C index 5f140382c..90915030d 100644 --- a/src/usr/secureboot/trusted/trustedbootUtils.C +++ b/src/usr/secureboot/trusted/trustedbootUtils.C @@ -63,12 +63,11 @@ errlHndl_t tpmTransmit(TpmTarget * io_target, do { // Send to the TPM - err = deviceRead(io_target->nodeTarget, + err = deviceRead(io_target->tpmTarget, io_buffer, i_bufsize, - DEVICE_TPM_ADDRESS( io_target->chip, - TPMDD::TPM_OP_TRANSMIT, - i_cmdSize)); + DEVICE_TPM_ADDRESS(TPMDD::TPM_OP_TRANSMIT, + i_cmdSize)); if (NULL != err) { break; diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm index 102b9a025..6107f0790 100644 --- a/src/usr/targeting/common/Targets.pm +++ b/src/usr/targeting/common/Targets.pm @@ -395,6 +395,7 @@ sub buildAffinity { my $self = shift; my $node = -1; + my $tpm = -1; my $proc = -1; my $node_phys = ""; my $node_aff = ""; @@ -434,6 +435,17 @@ sub buildAffinity $self->setHuid($target, 0, $node); $self->setAttribute($target, "ENTITY_INSTANCE",$node); } + elsif ($type eq "TPM") + { + $tpm++; + $self->{targeting}{SYS}[0]{NODES}[$node]{TPMS}[$tpm]{KEY} = $target; + $self->setAttribute($target, "AFFINITY_PATH", + "affinity:sys-0/node-$node/tpm-$tpm"); + $self->setAttribute($target, "PHYS_PATH", + "physical:sys-0/node-$node/tpm-$tpm"); + $self->setHuid($target, 0, $tpm); + $self->setAttribute($target, "ENTITY_INSTANCE",$tpm); + } elsif ($type eq "PROC") { $proc++; diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml index a28dbe786..33916fe69 100644 --- a/src/usr/targeting/common/xmltohb/attribute_types.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types.xml @@ -1873,130 +1873,6 @@ </attribute> <attribute> - <id>TPM_PRIMARY_INFO</id> - <description>Information needed to address the TPM slaves</description> - <complexType> - <description>Structure to define the addressing for an I2C - TPM.</description> - <field> - <name>tpmEnabled</name> - <description>Boolean indicating whether this TPM is available - in the system</description> - <type>uint8_t</type> - <default>0x1</default> - </field> - <field> - <name>i2cMasterPath</name> - <description>Entity path to the chip that contains the I2C - master</description> - <type>EntityPath</type> - <default>physical:sys-0</default> - </field> - <field> - <name>port</name> - <description>Port from the I2C Master device. This is a 6-bit - value.</description> - <type>uint8_t</type> - <default>0x01</default> - </field> - <field> - <name>devAddrLocality0</name> - <description>Device address on the I2C bus for Locality 0. - This is a 7-bit value, but then shifted 1 - bit left.</description> - <type>uint8_t</type> - <default>0xAE</default> - </field> - <field> - <name>devAddrLocality4</name> - <description>Device address on the I2C bus for Locality 4. - This is a 7-bit value, but then shifted 1 - bit left.</description> - <type>uint8_t</type> - <default>0xFF</default> - </field> - <field> - <name>engine</name> - <description>I2C master engine. This is a 2-bit - value.</description> - <type>uint8_t</type> - <default>0x00</default> - </field> - <field> - <name>byteAddrOffset</name> - <description>The number of bytes a device requires to set its - internal address/offset.</description> - <type>uint8_t</type> - <default>0x01</default> - </field> - </complexType> - <persistency>non-volatile</persistency> - <readable/> -</attribute> - -<attribute> - <id>TPM_BACKUP_INFO</id> - <description>Information needed to address the TPM slaves</description> - <complexType> - <description>Structure to define the addressing for an I2C - TPM device.</description> - <field> - <name>tpmEnabled</name> - <description>Boolean indicating whether this TPM is available - in the system</description> - <type>uint8_t</type> - <default>0x0</default> - </field> - <field> - <name>i2cMasterPath</name> - <description>Entity path to the chip that contains the I2C - master</description> - <type>EntityPath</type> - <default>physical:sys-0</default> - </field> - <field> - <name>port</name> - <description>Port from the I2C Master device. This is a 6-bit - value.</description> - <type>uint8_t</type> - <default>0x01</default> - </field> - <field> - <name>devAddrLocality0</name> - <description>Device address on the I2C bus for Locality 0. - This is a 7-bit value, but then shifted 1 - bit left.</description> - <type>uint8_t</type> - <default>0xAE</default> - </field> - <field> - <name>devAddrLocality4</name> - <description>Device address on the I2C bus for Locality 4. - This is a 7-bit value, but then shifted 1 - bit left.</description> - <type>uint8_t</type> - <default>0xFF</default> - </field> - <field> - <name>engine</name> - <description>I2C master engine. This is a 2-bit - value.</description> - <type>uint8_t</type> - <default>0x00</default> - </field> - <field> - <name>byteAddrOffset</name> - <description>The number of bytes a device requires to set its - internal address/offset.</description> - <type>uint8_t</type> - <default>0x01</default> - </field> - </complexType> - <persistency>non-volatile</persistency> - <readable/> -</attribute> - -<attribute> <id>EC</id> <description>attribute indicating the chip target's EC level</description> <simpleType> diff --git a/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml b/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml index c92780f04..1d27fd973 100644 --- a/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml +++ b/src/usr/targeting/common/xmltohb/simics_NIMBUS.system.xml @@ -163,19 +163,6 @@ <id>ORDINAL_ID</id> <default>0</default> </attribute> - <attribute> - <id>TPM_PRIMARY_INFO</id> - <default> - <field><id>tpmEnabled</id><value>1</value></field> - <field><id>i2cMasterPath</id> - <value>physical:sys-0/node-0/proc-0</value></field> - <field><id>port</id><value>0</value></field> - <field><id>devAddrLocality0</id><value>0xAE</value></field> - <field><id>devAddrLocality4</id><value>0xFF</value></field> - <field><id>engine</id><value>2</value></field> - <field><id>byteAddrOffset</id><value>0x01</value></field> - </default> - </attribute> </targetInstance> <!-- TPMs for node 0 --> @@ -183,6 +170,7 @@ <targetInstance> <id>sys0node0tpm0</id> <type>chip-tpm-cectpm</type> + <attribute><id>HUID</id><default>0x00310001</default></attribute> <attribute><id>POSITION</id><default>0</default></attribute> <attribute> <id>PHYS_PATH</id> diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index 3751ba486..511f1f25a 100755 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -839,8 +839,6 @@ </attribute> <attribute><id>CDM_DOMAIN</id><default>NODE</default></attribute> <attribute><id>FRU_ID</id></attribute> - <attribute><id>TPM_PRIMARY_INFO</id></attribute> - <attribute><id>TPM_BACKUP_INFO</id></attribute> <attribute><id>MSS_VOLT_VPP_SLOPE_EFF_CONFIG</id></attribute> <attribute><id>MSS_VOLT_VPP_INTERCEPT_EFF_CONFIG</id></attribute> <attribute><id>MSS_VOLT_DDR3_VDDR_SLOPE_EFF_CONFIG</id></attribute> diff --git a/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml b/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml index 4bdfd3527..78fee6d6c 100644 --- a/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml +++ b/src/usr/targeting/common/xmltohb/vbu_NIMBUS.system.xml @@ -154,12 +154,31 @@ <id>ORDINAL_ID</id> <default>0</default> </attribute> +</targetInstance> + +<!-- TPMs for node 0 --> + +<targetInstance> + <id>sys0node0tpm0</id> + <type>chip-tpm-cectpm</type> + <attribute><id>HUID</id><default>0x00310001</default></attribute> + <attribute><id>POSITION</id><default>0</default></attribute> + <attribute> + <id>PHYS_PATH</id> + <default>physical:sys-0/node-0/tpm-0</default> + </attribute> + <attribute> + <id>AFFINITY_PATH</id> + <default>affinity:sys-0/node-0/tpm-0</default> + </attribute> <attribute> - <id>TPM_PRIMARY_INFO</id> + <id>TPM_INFO</id> <default> <field><id>tpmEnabled</id><value>1</value></field> - <field><id>i2cMasterPath</id> - <value>physical:sys-0/node-0/proc-0</value></field> + <field> + <id>i2cMasterPath</id> + <value>physical:sys-0/node-0/proc-0</value> + </field> <field><id>port</id><value>0</value></field> <field><id>devAddrLocality0</id><value>0xAE</value></field> <field><id>devAddrLocality4</id><value>0xFF</value></field> |