Skip to content

Commit fe966be

Browse files
Mike BaiocchiA. Patrick Williams III
authored andcommitted
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>
1 parent 1ed7acd commit fe966be

File tree

3 files changed

+180
-60
lines changed

3 files changed

+180
-60
lines changed

src/usr/i2c/i2c.C

Lines changed: 105 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -945,26 +945,27 @@ errlHndl_t i2cRead ( TARGETING::Target * i_target,
945945
TRACFCOMP( g_trac_i2c,
946946
ERR_MRK"i2cRead() - Timed out waiting for data in FIFO!" );
947947

948-
uint64_t userdata2 = i_args.port;
949-
userdata2 = (userdata2 << 16) | i_args.engine;
950-
userdata2 = (userdata2 << 16) | i_args.devAddr;
951-
952948
/*@
953949
* @errortype
954950
* @reasoncode I2C_FIFO_TIMEOUT
955951
* @severity ERRL_SEV_UNRECOVERABLE
956952
* @moduleid I2C_READ
957-
* @userdata1 Status Register Value
958-
* @userdata2[0:31] Master Port
959-
* @userdata2[32:47] Master Engine
960-
* @userdata2[48:63] Slave Device Address
953+
* @userdata1[0:31] Status Register Value
954+
* @userdata1[32:63] Master Target
955+
* @userdata2[0:7] Master Engine
956+
* @userdata2[8:15] Master Port
957+
* @userdata2[16:31] Slave Device Address
958+
* @userdata2[32:47] Bus Speed
959+
* @userdata2[48:63] Bit Rate Devisor
961960
* @devdesc Timed out waiting for data in FIFO to read
962961
*/
963962
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
964963
I2C_READ,
965964
I2C_FIFO_TIMEOUT,
966-
status.value,
967-
userdata2 );
965+
I2C_SET_USER_DATA_1(
966+
status,
967+
i_target),
968+
I2C_SET_USER_DATA_2(i_args));
968969

969970
// For now limited in what we can call out:
970971
// Could be an issue with Processor or its bus
@@ -1291,7 +1292,6 @@ errlHndl_t i2cWaitForCmdComp ( TARGETING::Target * i_target,
12911292
misc_args_t & i_args)
12921293
{
12931294
errlHndl_t err = NULL;
1294-
uint64_t engine = i_args.engine;
12951295

12961296
TRACDCOMP( g_trac_i2c,
12971297
ENTER_MRK"i2cWaitForCmdComp()" );
@@ -1330,18 +1330,25 @@ errlHndl_t i2cWaitForCmdComp ( TARGETING::Target * i_target,
13301330

13311331
/*@
13321332
* @errortype
1333-
* @reasoncode I2C_CMD_COMP_TIMEOUT
1334-
* @severity ERRL_SEV_UNRECOVERABLE
1335-
* @moduleid I2C_WAIT_FOR_CMD_COMP
1336-
* @userdata1 Status Register Value
1337-
* @userdata2 Master Engine
1338-
* @devdesc Timed out waiting for command complete.
1333+
* @reasoncode I2C_CMD_COMP_TIMEOUT
1334+
* @severity ERRL_SEV_UNRECOVERABLE
1335+
* @moduleid I2C_WAIT_FOR_CMD_COMP
1336+
* @userdata1[0:31] Status Register Value
1337+
* @userdata1[32:63] Master Target
1338+
* @userdata2[0:7] Master Engine
1339+
* @userdata2[8:15] Master Port
1340+
* @userdata2[16:31] Slave Device Address
1341+
* @userdata2[32:47] Bus Speed
1342+
* @userdata2[48:63] Bit Rate Devisor
1343+
* @devdesc Timed out waiting for command complete.
13391344
*/
13401345
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
13411346
I2C_WAIT_FOR_CMD_COMP,
13421347
I2C_CMD_COMP_TIMEOUT,
1343-
status.value,
1344-
engine );
1348+
I2C_SET_USER_DATA_1(
1349+
status,
1350+
i_target),
1351+
I2C_SET_USER_DATA_2(i_args));
13451352

13461353

13471354
// For now limited in what we can call out:
@@ -1527,30 +1534,19 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
15271534
TRACFCOMP( g_trac_i2c,
15281535
ERR_MRK"i2cCheckForErrors() - Error(s) found" );
15291536

1530-
// Combine the status registers
1531-
uint64_t userdata1 = (0xFFFFFFFF00000000 & i_statusVal.value);
1532-
userdata1 |= ( 0xFFFFFFFF00000000 & intRegVal) >> 32;
1533-
1534-
1535-
// Combine multiple input arguments
1536-
uint64_t userdata2 = 0;
1537-
userdata2 = static_cast<uint64_t>(i_args.engine) << 56;
1538-
userdata2 |= static_cast<uint64_t>(i_args.port) << 48;
1539-
userdata2 |= static_cast<uint64_t>(i_args.bit_rate_divisor) << 32;
1540-
userdata2 |= TARGETING::get_huid(i_target);
15411537

15421538
/*@
15431539
* @errortype
15441540
* @reasoncode I2C_HW_ERROR_FOUND
15451541
* @severity ERRL_SEV_UNRECOVERABLE
15461542
* @moduleid I2C_CHECK_FOR_ERRORS
1547-
* @userdata1[0:31 Status Register Value
1548-
* @userdata1[32:63] Interrupt Register Value (only valid in
1549-
* Interrupt case)
1550-
* @userdata2[0:7] I2C Master Engine
1551-
* @userdata2[8:15] I2C Master Port
1552-
* @userdata2[16:31] I2C Mode Register Bit Rate Divisor
1553-
* @userdata2[32:63] I2C Master Target HUID
1543+
* @userdata1[0:31] Status Register Value
1544+
* @userdata1[32:63] Master Target
1545+
* @userdata2[0:7] Master Engine
1546+
* @userdata2[8:15] Master Port
1547+
* @userdata2[16:31] Slave Device Address
1548+
* @userdata2[32:47] Bus Speed
1549+
* @userdata2[48:63] Bit Rate Devisor
15541550
* @devdesc Error was found in I2C status register.
15551551
* Check userdata to determine what the error was.
15561552
* @custdesc A problem occurred during the IPL of the system:
@@ -1559,8 +1555,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
15591555
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
15601556
I2C_CHECK_FOR_ERRORS,
15611557
I2C_HW_ERROR_FOUND,
1562-
userdata1,
1563-
userdata2);
1558+
I2C_SET_USER_DATA_1(
1559+
i_statusVal,
1560+
i_target),
1561+
I2C_SET_USER_DATA_2(i_args));
15641562

15651563
// For now limited in what we can call out:
15661564
// Could be an issue with Processor or its bus
@@ -1587,11 +1585,16 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
15871585

15881586
/*@
15891587
* @errortype
1590-
* @reasoncode I2C_NACK_ONLY_FOUND
1591-
* @severity ERRL_SEV_UNRECOVERABLE
1592-
* @moduleid I2C_CHECK_FOR_ERRORS
1593-
* @userdata1 Status Register Value
1594-
* @userdata2 Interrupt Register Value
1588+
* @reasoncode I2C_NACK_ONLY_FOUND
1589+
* @severity ERRL_SEV_UNRECOVERABLE
1590+
* @moduleid I2C_CHECK_FOR_ERRORS
1591+
* @userdata1[0:31] Status Register Value
1592+
* @userdata1[32:63] Master Target
1593+
* @userdata2[0:7] Master Engine
1594+
* @userdata2[8:15] Master Port
1595+
* @userdata2[16:31] Slave Device Address
1596+
* @userdata2[32:47] Bus Speed
1597+
* @userdata2[48:63] Bit Rate Devisor
15951598
* @devdesc a NACK Error was found in the I2C status
15961599
* register.
15971600
* @custdesc A problem occurred during the IPL of the system:
@@ -1601,8 +1604,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
16011604
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
16021605
I2C_CHECK_FOR_ERRORS,
16031606
I2C_NACK_ONLY_FOUND,
1604-
i_statusVal.value,
1605-
intRegVal );
1607+
I2C_SET_USER_DATA_1(
1608+
i_statusVal,
1609+
i_target),
1610+
I2C_SET_USER_DATA_2(i_args));
16061611

16071612
// For now limited in what we can call out:
16081613
// Could be an issue with Processor or its bus
@@ -1628,11 +1633,16 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
16281633

16291634
/*@
16301635
* @errortype
1631-
* @reasoncode I2C_ARBITRATION_LOST_ONLY_FOUND
1632-
* @severity ERRL_SEV_UNRECOVERABLE
1633-
* @moduleid I2C_CHECK_FOR_ERRORS
1634-
* @userdata1 Status Register Value
1635-
* @userdata2 Interrupt Register Value
1636+
* @reasoncode I2C_ARBITRATION_LOST_ONLY_FOUND
1637+
* @severity ERRL_SEV_UNRECOVERABLE
1638+
* @moduleid I2C_CHECK_FOR_ERRORS
1639+
* @userdata1[0:31] Status Register Value
1640+
* @userdata1[32:63] Master Target
1641+
* @userdata2[0:7] Master Engine
1642+
* @userdata2[8:15] Master Port
1643+
* @userdata2[16:31] Slave Device Address
1644+
* @userdata2[32:47] Bus Speed
1645+
* @userdata2[48:63] Bit Rate Devisor
16361646
* @devdesc Bus Arbitration Lost Error was found in
16371647
* the I2C status register.
16381648
* @custdesc A problem occurred during the IPL of the system:
@@ -1642,8 +1652,10 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target,
16421652
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
16431653
I2C_CHECK_FOR_ERRORS,
16441654
I2C_ARBITRATION_LOST_ONLY_FOUND,
1645-
i_statusVal.value,
1646-
intRegVal );
1655+
I2C_SET_USER_DATA_1(
1656+
i_statusVal,
1657+
i_target),
1658+
I2C_SET_USER_DATA_2(i_args));
16471659

16481660
// For now limited in what we can call out:
16491661
// Could be an issue with Processor or its bus
@@ -1734,18 +1746,25 @@ errlHndl_t i2cWaitForFifoSpace ( TARGETING::Target * i_target,
17341746

17351747
/*@
17361748
* @errortype
1737-
* @reasoncode I2C_FIFO_TIMEOUT
1738-
* @severity ERRL_SEV_UNRECOVERABLE
1739-
* @moduleid I2C_WRITE
1740-
* @userdata1 Status Register Value
1741-
* @userdata2 <UNUSED>
1749+
* @reasoncode I2C_FIFO_TIMEOUT
1750+
* @severity ERRL_SEV_UNRECOVERABLE
1751+
* @moduleid I2C_WRITE
1752+
* @userdata1[0:31] Status Register Value
1753+
* @userdata1[32:63] Master Target
1754+
* @userdata2[0:7] Master Engine
1755+
* @userdata2[8:15] Master Port
1756+
* @userdata2[16:31] Slave Device Address
1757+
* @userdata2[32:47] Bus Speed
1758+
* @userdata2[48:63] Bit Rate Devisor
17421759
* @devdesc Timed out waiting for space to write into FIFO.
17431760
*/
17441761
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
17451762
I2C_WRITE,
17461763
I2C_FIFO_TIMEOUT,
1747-
status.value,
1748-
0x0 );
1764+
I2C_SET_USER_DATA_1(
1765+
status,
1766+
i_target),
1767+
I2C_SET_USER_DATA_2(i_args));
17491768

17501769
// For now limited in what we can call out:
17511770
// Could be an issue with Processor or its bus
@@ -3161,4 +3180,30 @@ void getMasterInfo( const TARGETING::Target* i_chip,
31613180
}
31623181
}
31633182

3183+
/**
3184+
* @brief Utility Function to capture error log user data consisting of
3185+
* the I2C Master Status Register and the I2C Master Target HUID
3186+
*/
3187+
uint64_t I2C_SET_USER_DATA_1 ( status_reg_t status_reg,
3188+
TARGETING::Target * tgt)
3189+
{
3190+
return TWO_UINT32_TO_UINT64( TO_UINT32( status_reg.value >> 32),
3191+
TARGETING::get_huid(tgt) );
3192+
}
3193+
3194+
/**
3195+
* @brief Utility Function to capture error log user data consisting of
3196+
* the I2C variables relating to the I2C Master
3197+
*/
3198+
uint64_t I2C_SET_USER_DATA_2 ( misc_args_t args)
3199+
{
3200+
3201+
return FOUR_UINT16_TO_UINT64(
3202+
TWO_UINT8_TO_UINT16 (args.engine, args.port),
3203+
args.devAddr & 0x000000000000FFFF,
3204+
args.bus_speed & 0x000000000000FFFF,
3205+
args.bit_rate_divisor );
3206+
}
3207+
3208+
31643209
} // end namespace I2C

src/usr/i2c/i2c.H

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,19 @@ union residual_length_reg_t
391391
};
392392

393393

394+
/**
395+
* @brief Utility Function to capture error log user data consisting of
396+
the I2C Master Status Register and the I2C Master Target HUID
397+
*/
398+
uint64_t I2C_SET_USER_DATA_1 ( status_reg_t status_reg,
399+
TARGETING::Target * tgt);
400+
401+
/**
402+
* @brief Utility Function to capture error log user data consisting of
403+
the I2C variables relating to the I2C Master
404+
*/
405+
uint64_t I2C_SET_USER_DATA_2 ( misc_args_t args);
406+
394407

395408
/**
396409
*

src/usr/i2c/test/i2ctest.H

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,68 @@ class I2CTest: public CxxTest::TestSuite
10291029
}
10301030
}
10311031

1032+
1033+
/**
1034+
* @brief Verify the functions that create the userdata values
1035+
*/
1036+
void test_setI2CUserData( void )
1037+
{
1038+
1039+
int64_t fails = 0, num_ops = 0;
1040+
1041+
TRACFCOMP( g_trac_i2c,
1042+
"test_setI2CUserData - Start" );
1043+
1044+
1045+
// Test userdata_1
1046+
uint64_t userdata_1 = 0x0;
1047+
uint64_t userdata_1_result = 0xABCDEFABFFFFFFFF;
1048+
1049+
I2C::status_reg_t status_reg;
1050+
status_reg.value = 0xABCDEFAB55555555;
1051+
1052+
userdata_1 = I2C::I2C_SET_USER_DATA_1 (
1053+
status_reg,
1054+
MASTER_PROCESSOR_CHIP_TARGET_SENTINEL);
1055+
1056+
num_ops++;
1057+
if ( userdata_1 != userdata_1_result )
1058+
{
1059+
TS_FAIL( "testI2CUserData - Fail in generating userdata)1: "
1060+
"0x%X - should be 0x%X",
1061+
userdata_1, userdata_1_result );
1062+
fails++;
1063+
}
1064+
1065+
// Test userdata_2
1066+
uint64_t userdata_2 = 0x0;
1067+
uint64_t userdata_2_result = 0x34679A5D1234FEDC;
1068+
1069+
I2C::misc_args_t args;
1070+
args.engine = 0x34;
1071+
args.port = 0x67;
1072+
args.devAddr = 0x1234123412349A5D;
1073+
args.bus_speed = 0xFFFFFFFFFFFF1234;
1074+
args.bit_rate_divisor = 0xFEDC;
1075+
1076+
userdata_2 = I2C::I2C_SET_USER_DATA_2 ( args );
1077+
1078+
num_ops++;
1079+
if ( userdata_2 != userdata_2_result )
1080+
{
1081+
TS_FAIL( "testI2CUserData - Fail in generating userdata_2: "
1082+
"0x%X - should be 0x%X",
1083+
userdata_2, userdata_2_result );
1084+
fails++;
1085+
}
1086+
1087+
TRACFCOMP( g_trac_i2c,
1088+
"testI2CUserData - End: %d/%d fails",
1089+
fails, num_ops );
1090+
1091+
}
1092+
1093+
10321094
};
10331095

10341096
#endif

0 commit comments

Comments
 (0)