summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Baiocchi <baiocchi@us.ibm.com>2015-08-05 16:10:43 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-09-10 13:59:46 -0500
commitfe966be1aa16c7816f62b2e6c97aa646dab7ac3e (patch)
tree78b878897ded208f4a31742031b3f986009a78da
parent1ed7acd72d63a49689dffd688d4ddc1b1ba5781b (diff)
downloadtalos-hostboot-fe966be1aa16c7816f62b2e6c97aa646dab7ac3e.tar.gz
talos-hostboot-fe966be1aa16c7816f62b2e6c97aa646dab7ac3e.zip
I2C Error Log User Data Improvement
This commit adds more information into the two uint64_t user data sections for certain error logs, including I2C Master HUID, engine, port, and bus speed. Change-Id: Ia2c91795c22619931c37b52fa4ff2091cb5d5ef3 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/20060 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Tested-by: FSP CI Jenkins Tested-by: Jenkins OP HW Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com> Reviewed-by: WILLIAM G. HOFFA <wghoffa@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-rwxr-xr-xsrc/usr/i2c/i2c.C165
-rwxr-xr-xsrc/usr/i2c/i2c.H13
-rwxr-xr-xsrc/usr/i2c/test/i2ctest.H62
3 files changed, 180 insertions, 60 deletions
diff --git a/src/usr/i2c/i2c.C b/src/usr/i2c/i2c.C
index eaac4b1c1..d1b46b519 100755
--- a/src/usr/i2c/i2c.C
+++ b/src/usr/i2c/i2c.C
@@ -945,26 +945,27 @@ errlHndl_t i2cRead ( TARGETING::Target * i_target,
TRACFCOMP( g_trac_i2c,
ERR_MRK"i2cRead() - Timed out waiting for data in FIFO!" );
- uint64_t userdata2 = i_args.port;
- userdata2 = (userdata2 << 16) | i_args.engine;
- userdata2 = (userdata2 << 16) | i_args.devAddr;
-
/*@
* @errortype
* @reasoncode I2C_FIFO_TIMEOUT
* @severity ERRL_SEV_UNRECOVERABLE
* @moduleid I2C_READ
- * @userdata1 Status Register Value
- * @userdata2[0:31] Master Port
- * @userdata2[32:47] Master Engine
- * @userdata2[48:63] Slave Device Address
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
* @devdesc Timed out waiting for data in FIFO to read
*/
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_READ,
I2C_FIFO_TIMEOUT,
- status.value,
- userdata2 );
+ I2C_SET_USER_DATA_1(
+ status,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
// Could be an issue with Processor or its bus
@@ -1291,7 +1292,6 @@ errlHndl_t i2cWaitForCmdComp ( TARGETING::Target * i_target,
misc_args_t & i_args)
{
errlHndl_t err = NULL;
- uint64_t engine = i_args.engine;
TRACDCOMP( g_trac_i2c,
ENTER_MRK"i2cWaitForCmdComp()" );
@@ -1330,18 +1330,25 @@ errlHndl_t i2cWaitForCmdComp ( TARGETING::Target * i_target,
/*@
* @errortype
- * @reasoncode I2C_CMD_COMP_TIMEOUT
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid I2C_WAIT_FOR_CMD_COMP
- * @userdata1 Status Register Value
- * @userdata2 Master Engine
- * @devdesc Timed out waiting for command complete.
+ * @reasoncode I2C_CMD_COMP_TIMEOUT
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid I2C_WAIT_FOR_CMD_COMP
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
+ * @devdesc Timed out waiting for command complete.
*/
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_WAIT_FOR_CMD_COMP,
I2C_CMD_COMP_TIMEOUT,
- status.value,
- engine );
+ I2C_SET_USER_DATA_1(
+ status,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
@@ -1527,30 +1534,19 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
TRACFCOMP( g_trac_i2c,
ERR_MRK"i2cCheckForErrors() - Error(s) found" );
- // Combine the status registers
- uint64_t userdata1 = (0xFFFFFFFF00000000 & i_statusVal.value);
- userdata1 |= ( 0xFFFFFFFF00000000 & intRegVal) >> 32;
-
-
- // Combine multiple input arguments
- uint64_t userdata2 = 0;
- userdata2 = static_cast<uint64_t>(i_args.engine) << 56;
- userdata2 |= static_cast<uint64_t>(i_args.port) << 48;
- userdata2 |= static_cast<uint64_t>(i_args.bit_rate_divisor) << 32;
- userdata2 |= TARGETING::get_huid(i_target);
/*@
* @errortype
* @reasoncode I2C_HW_ERROR_FOUND
* @severity ERRL_SEV_UNRECOVERABLE
* @moduleid I2C_CHECK_FOR_ERRORS
- * @userdata1[0:31 Status Register Value
- * @userdata1[32:63] Interrupt Register Value (only valid in
- * Interrupt case)
- * @userdata2[0:7] I2C Master Engine
- * @userdata2[8:15] I2C Master Port
- * @userdata2[16:31] I2C Mode Register Bit Rate Divisor
- * @userdata2[32:63] I2C Master Target HUID
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
* @devdesc Error was found in I2C status register.
* Check userdata to determine what the error was.
* @custdesc A problem occurred during the IPL of the system:
@@ -1559,8 +1555,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_CHECK_FOR_ERRORS,
I2C_HW_ERROR_FOUND,
- userdata1,
- userdata2);
+ I2C_SET_USER_DATA_1(
+ i_statusVal,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
// Could be an issue with Processor or its bus
@@ -1587,11 +1585,16 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
/*@
* @errortype
- * @reasoncode I2C_NACK_ONLY_FOUND
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid I2C_CHECK_FOR_ERRORS
- * @userdata1 Status Register Value
- * @userdata2 Interrupt Register Value
+ * @reasoncode I2C_NACK_ONLY_FOUND
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid I2C_CHECK_FOR_ERRORS
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
* @devdesc a NACK Error was found in the I2C status
* register.
* @custdesc A problem occurred during the IPL of the system:
@@ -1601,8 +1604,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_CHECK_FOR_ERRORS,
I2C_NACK_ONLY_FOUND,
- i_statusVal.value,
- intRegVal );
+ I2C_SET_USER_DATA_1(
+ i_statusVal,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
// Could be an issue with Processor or its bus
@@ -1628,11 +1633,16 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
/*@
* @errortype
- * @reasoncode I2C_ARBITRATION_LOST_ONLY_FOUND
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid I2C_CHECK_FOR_ERRORS
- * @userdata1 Status Register Value
- * @userdata2 Interrupt Register Value
+ * @reasoncode I2C_ARBITRATION_LOST_ONLY_FOUND
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid I2C_CHECK_FOR_ERRORS
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
* @devdesc Bus Arbitration Lost Error was found in
* the I2C status register.
* @custdesc A problem occurred during the IPL of the system:
@@ -1642,8 +1652,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_CHECK_FOR_ERRORS,
I2C_ARBITRATION_LOST_ONLY_FOUND,
- i_statusVal.value,
- intRegVal );
+ I2C_SET_USER_DATA_1(
+ i_statusVal,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
// Could be an issue with Processor or its bus
@@ -1734,18 +1746,25 @@ errlHndl_t i2cWaitForFifoSpace ( TARGETING::Target * i_target,
/*@
* @errortype
- * @reasoncode I2C_FIFO_TIMEOUT
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid I2C_WRITE
- * @userdata1 Status Register Value
- * @userdata2 <UNUSED>
+ * @reasoncode I2C_FIFO_TIMEOUT
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid I2C_WRITE
+ * @userdata1[0:31] Status Register Value
+ * @userdata1[32:63] Master Target
+ * @userdata2[0:7] Master Engine
+ * @userdata2[8:15] Master Port
+ * @userdata2[16:31] Slave Device Address
+ * @userdata2[32:47] Bus Speed
+ * @userdata2[48:63] Bit Rate Devisor
* @devdesc Timed out waiting for space to write into FIFO.
*/
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
I2C_WRITE,
I2C_FIFO_TIMEOUT,
- status.value,
- 0x0 );
+ I2C_SET_USER_DATA_1(
+ status,
+ i_target),
+ I2C_SET_USER_DATA_2(i_args));
// For now limited in what we can call out:
// Could be an issue with Processor or its bus
@@ -3161,4 +3180,30 @@ void getMasterInfo( const TARGETING::Target* i_chip,
}
}
+/**
+ * @brief Utility Function to capture error log user data consisting of
+ * the I2C Master Status Register and the I2C Master Target HUID
+ */
+uint64_t I2C_SET_USER_DATA_1 ( status_reg_t status_reg,
+ TARGETING::Target * tgt)
+{
+ return TWO_UINT32_TO_UINT64( TO_UINT32( status_reg.value >> 32),
+ TARGETING::get_huid(tgt) );
+}
+
+/**
+ * @brief Utility Function to capture error log user data consisting of
+ * the I2C variables relating to the I2C Master
+ */
+uint64_t I2C_SET_USER_DATA_2 ( misc_args_t args)
+{
+
+ return FOUR_UINT16_TO_UINT64(
+ TWO_UINT8_TO_UINT16 (args.engine, args.port),
+ args.devAddr & 0x000000000000FFFF,
+ args.bus_speed & 0x000000000000FFFF,
+ args.bit_rate_divisor );
+}
+
+
} // end namespace I2C
diff --git a/src/usr/i2c/i2c.H b/src/usr/i2c/i2c.H
index 4a7466370..f4be4b8fb 100755
--- a/src/usr/i2c/i2c.H
+++ b/src/usr/i2c/i2c.H
@@ -391,6 +391,19 @@ union residual_length_reg_t
};
+/**
+ * @brief Utility Function to capture error log user data consisting of
+ the I2C Master Status Register and the I2C Master Target HUID
+ */
+uint64_t I2C_SET_USER_DATA_1 ( status_reg_t status_reg,
+ TARGETING::Target * tgt);
+
+/**
+ * @brief Utility Function to capture error log user data consisting of
+ the I2C variables relating to the I2C Master
+ */
+uint64_t I2C_SET_USER_DATA_2 ( misc_args_t args);
+
/**
*
diff --git a/src/usr/i2c/test/i2ctest.H b/src/usr/i2c/test/i2ctest.H
index d4bd8a9f2..cfef791a6 100755
--- a/src/usr/i2c/test/i2ctest.H
+++ b/src/usr/i2c/test/i2ctest.H
@@ -1029,6 +1029,68 @@ class I2CTest: public CxxTest::TestSuite
}
}
+
+ /**
+ * @brief Verify the functions that create the userdata values
+ */
+ void test_setI2CUserData( void )
+ {
+
+ int64_t fails = 0, num_ops = 0;
+
+ TRACFCOMP( g_trac_i2c,
+ "test_setI2CUserData - Start" );
+
+
+ // Test userdata_1
+ uint64_t userdata_1 = 0x0;
+ uint64_t userdata_1_result = 0xABCDEFABFFFFFFFF;
+
+ I2C::status_reg_t status_reg;
+ status_reg.value = 0xABCDEFAB55555555;
+
+ userdata_1 = I2C::I2C_SET_USER_DATA_1 (
+ status_reg,
+ MASTER_PROCESSOR_CHIP_TARGET_SENTINEL);
+
+ num_ops++;
+ if ( userdata_1 != userdata_1_result )
+ {
+ TS_FAIL( "testI2CUserData - Fail in generating userdata)1: "
+ "0x%X - should be 0x%X",
+ userdata_1, userdata_1_result );
+ fails++;
+ }
+
+ // Test userdata_2
+ uint64_t userdata_2 = 0x0;
+ uint64_t userdata_2_result = 0x34679A5D1234FEDC;
+
+ I2C::misc_args_t args;
+ args.engine = 0x34;
+ args.port = 0x67;
+ args.devAddr = 0x1234123412349A5D;
+ args.bus_speed = 0xFFFFFFFFFFFF1234;
+ args.bit_rate_divisor = 0xFEDC;
+
+ userdata_2 = I2C::I2C_SET_USER_DATA_2 ( args );
+
+ num_ops++;
+ if ( userdata_2 != userdata_2_result )
+ {
+ TS_FAIL( "testI2CUserData - Fail in generating userdata_2: "
+ "0x%X - should be 0x%X",
+ userdata_2, userdata_2_result );
+ fails++;
+ }
+
+ TRACFCOMP( g_trac_i2c,
+ "testI2CUserData - End: %d/%d fails",
+ fails, num_ops );
+
+ }
+
+
};
#endif
OpenPOWER on IntegriCloud