summaryrefslogtreecommitdiffstats
path: root/src/usr/i2c
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/i2c')
-rw-r--r--src/usr/i2c/errlud_i2c.C30
-rwxr-xr-xsrc/usr/i2c/runtime/rt_i2c.C20
2 files changed, 37 insertions, 13 deletions
diff --git a/src/usr/i2c/errlud_i2c.C b/src/usr/i2c/errlud_i2c.C
index 121905e5c..980d5274f 100644
--- a/src/usr/i2c/errlud_i2c.C
+++ b/src/usr/i2c/errlud_i2c.C
@@ -71,8 +71,13 @@ UdI2CParms::UdI2CParms( uint8_t i_opType,
// N bytes : I2C MUX path in string form
// Cache the MUX path in string form for reference and easy access
- char *l_muxPath = i_args.i2cMuxPath->toString();
-
+ char* l_muxPath{nullptr};
+ size_t l_muxPathSize = 0;
+ if (i_args.i2cMuxPath)
+ {
+ l_muxPath = i_args.i2cMuxPath->toString();
+ l_muxPathSize = strlen(l_muxPath);
+ }
char * l_pBuf = reinterpret_cast<char *>(
reallocUsrBuf(sizeof(uint8_t)*2
+sizeof(uint32_t)
@@ -84,7 +89,7 @@ UdI2CParms::UdI2CParms( uint8_t i_opType,
+sizeof(uint16_t)
+sizeof(uint64_t)*2
+sizeof(uint8_t)
- +(strlen(l_muxPath) +1) ) );
+ +l_muxPathSize + 1) );
uint64_t tmp64 = 0;
uint32_t tmp32 = 0;
uint16_t tmp16 = 0;
@@ -166,13 +171,18 @@ UdI2CParms::UdI2CParms( uint8_t i_opType,
memcpy(l_pBuf, &tmp8, sizeof(tmp8));
l_pBuf += sizeof(tmp8);
- memcpy(l_pBuf, l_muxPath, strlen(l_muxPath));
- l_pBuf += strlen(l_muxPath);
- l_pBuf = '\0'; // add a terminator for ease of parsing
- ++l_pBuf;
+ if (l_muxPathSize > 0)
+ {
+ memcpy(l_pBuf, l_muxPath, strlen(l_muxPath));
+ l_pBuf += strlen(l_muxPath);
- free(l_muxPath);
- l_muxPath = nullptr;
+ // done with muxPath so free it here
+ free(l_muxPath);
+ l_muxPath = nullptr;
+ l_muxPathSize = 0;
+ }
+ *l_pBuf = '\0'; // add a terminator for ease of parsing
+ ++l_pBuf;
}
//------------------------------------------------------------------------------
@@ -308,7 +318,7 @@ UdEepromParms::UdEepromParms( uint8_t i_opType,
memcpy(l_pBuf, l_muxPath, strlen(l_muxPath));
l_pBuf += strlen(l_muxPath);
- l_pBuf = '\0'; // add a terminator for ease of parsing
+ *l_pBuf = '\0'; // add a terminator for ease of parsing
++l_pBuf;
free(l_muxPath);
diff --git a/src/usr/i2c/runtime/rt_i2c.C b/src/usr/i2c/runtime/rt_i2c.C
index 9ae1e7b44..16f62c76e 100755
--- a/src/usr/i2c/runtime/rt_i2c.C
+++ b/src/usr/i2c/runtime/rt_i2c.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -37,6 +37,7 @@
#include <errl/errlentry.H>
#include <errl/errlmanager.H>
#include <errl/errludtarget.H>
+#include <errl/hberrltypes.H>
#include <devicefw/driverif.H>
#include <i2c/i2creasoncodes.H>
#include <runtime/interface.h>
@@ -81,6 +82,11 @@ errlHndl_t i2cPerformOp( DeviceFW::OperationType i_opType,
// Address, Port, Engine, Device Addr.
// Other args set below
misc_args_t args;
+
+ // Read in the sub-operation
+ const auto subop =
+ static_cast<DeviceFW::I2C_SUBOP>(va_arg(i_args,uint64_t));
+
args.port = va_arg( i_args, uint64_t );
args.engine = va_arg( i_args, uint64_t );
args.devAddr = va_arg( i_args, uint64_t );
@@ -111,22 +117,30 @@ errlHndl_t i2cPerformOp( DeviceFW::OperationType i_opType,
}
else
{
+ TRACFCOMP(g_trac_i2c, ERR_MRK"Invalid Offset length: 0x%.8X."
+ "Previous parameters: i2c subop 0x%.8X, "
+ "port 0x%.8X, engine 0x%.8X, deviceAddr 0x%.8X",
+ args.offset_length, subop,
+ args.port, args.engine, args.devAddr);
/*@
* @errortype
* @moduleid I2C_PERFORM_OP
* @reasoncode I2C_RUNTIME_INVALID_OFFSET_LENGTH
* @userdata1 Offset length
- * @userdata2 Op type
+ * @userdata2[0:31] Operation Type
+ * @userdata2[32:64] Target
* @devdesc I2C offset length is invalid
*/
err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_INFORMATIONAL,
I2C_PERFORM_OP,
I2C_RUNTIME_INVALID_OFFSET_LENGTH,
args.offset_length,
- i_opType);
+ TWO_UINT32_TO_UINT64(i_opType,
+ TARGETING::get_huid(i_target)));
err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
HWAS::SRCI_PRIORITY_HIGH);
+ return err;
}
}
OpenPOWER on IntegriCloud