diff options
-rw-r--r-- | src/include/usr/i2c/i2creasoncodes.H | 5 | ||||
-rwxr-xr-x | src/usr/i2c/eepromdd.C | 422 | ||||
-rwxr-xr-x | src/usr/i2c/eepromdd.H | 3 | ||||
-rwxr-xr-x | src/usr/i2c/i2c.C | 311 | ||||
-rwxr-xr-x | src/usr/i2c/i2c.H | 8 | ||||
-rwxr-xr-x | src/usr/i2c/test/eepromddtest.H | 58 | ||||
-rwxr-xr-x | src/usr/i2c/test/i2ctest.H | 56 | ||||
-rwxr-xr-x | src/usr/targeting/common/genHwsvMrwXml.pl | 1 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/attribute_types.xml | 32 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/simics_MURANO.system.xml | 34 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/simics_VENICE.system.xml | 100 |
11 files changed, 754 insertions, 276 deletions
diff --git a/src/include/usr/i2c/i2creasoncodes.H b/src/include/usr/i2c/i2creasoncodes.H index 267ffcc65..90da53c6f 100644 --- a/src/include/usr/i2c/i2creasoncodes.H +++ b/src/include/usr/i2c/i2creasoncodes.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -72,11 +72,12 @@ enum i2cReasonCode I2C_FIFO_TIMEOUT = I2C_COMP_ID | 0x03, // Timed out waiting on FIFO I2C_BUS_NOT_READY = I2C_COMP_ID | 0x04, // Bus Not ready I2C_CMD_COMP_TIMEOUT = I2C_COMP_ID | 0x05, // Timeout waiting for Cmd Complete - I2C_HW_ERROR_FOUND = I2C_COMP_ID | 0x06, // Error found in Status register + I2C_HW_ERROR_FOUND = I2C_COMP_ID | 0x06, // Error found in status register I2C_MASTER_SENTINEL_TARGET = I2C_COMP_ID | 0x07, // Master Sentinel used as target I2C_NO_CENTAUR_FOUND = I2C_COMP_ID | 0x08, // No Centaur chip found I2C_NO_PROC_FOUND = I2C_COMP_ID | 0x09, // No Processor chip found I2C_INVALID_BUS_SPEED_MODE = I2C_COMP_ID | 0x0A, // Invalid Bus Speed Mode + I2C_NACK_ONLY_FOUND = I2C_COMP_ID | 0x0B, // Only NACK found in status register }; }; // end I2C diff --git a/src/usr/i2c/eepromdd.C b/src/usr/i2c/eepromdd.C index 56885d874..ce9b4be85 100755 --- a/src/usr/i2c/eepromdd.C +++ b/src/usr/i2c/eepromdd.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -34,16 +34,16 @@ // ---------------------------------------------- #include <string.h> #include <sys/time.h> - #include <trace/interface.H> #include <errl/errlentry.H> #include <errl/errlmanager.H> #include <errl/errludtarget.H> +#include <errl/errludstring.H> #include <targeting/common/targetservice.H> #include <devicefw/driverif.H> -#include <sys/time.h> #include <i2c/eepromddreasoncodes.H> #include <i2c/eepromif.H> +#include <i2c/i2creasoncodes.H> #include "eepromdd.H" // ---------------------------------------------- @@ -55,7 +55,7 @@ mutex_t g_eepromMutex = MUTEX_INITIALIZER; // Trace definitions // ---------------------------------------------- trace_desc_t* g_trac_eeprom = NULL; -TRAC_INIT( & g_trac_eeprom, "EEPROM", KILOBYTE ); +TRAC_INIT( & g_trac_eeprom, EEPROM_COMP_NAME, KILOBYTE ); trace_desc_t* g_trac_eepromr = NULL; TRAC_INIT( & g_trac_eepromr, "EEPROMR", KILOBYTE ); @@ -68,8 +68,10 @@ TRAC_INIT( & g_trac_eepromr, "EEPROMR", KILOBYTE ); // Defines // ---------------------------------------------- #define MAX_BYTE_ADDR 2 +#define EEPROM_MAX_NACK_RETRIES 2 // ---------------------------------------------- + namespace EEPROM { @@ -116,7 +118,6 @@ errlHndl_t eepromPerformOp( DeviceFW::OperationType i_opType, "i_opType=%d, chip=%d, offset=%d, len=%d", (uint64_t) i_opType, i2cInfo.chip, i2cInfo.offset, io_buflen); - do { // Read Attributes needed to complete the operation @@ -171,6 +172,7 @@ errlHndl_t eepromPerformOp( DeviceFW::OperationType i_opType, break; } + // Do the read or write if( i_opType == DeviceFW::READ ) { @@ -179,10 +181,11 @@ errlHndl_t eepromPerformOp( DeviceFW::OperationType i_opType, io_buflen, i2cInfo ); - if( err ) + if ( err ) { break; } + } else if( i_opType == DeviceFW::WRITE ) { @@ -191,10 +194,11 @@ errlHndl_t eepromPerformOp( DeviceFW::OperationType i_opType, io_buflen, i2cInfo ); - if( err ) + if ( err ) { break; } + } else { @@ -221,9 +225,10 @@ errlHndl_t eepromPerformOp( DeviceFW::OperationType i_opType, } while( 0 ); - // If there is an error, add target to log + // If there is an error, add target and trace to log if ( (err != NULL) && (i_target != NULL) ) { + err->collectTrace(EEPROM_COMP_NAME); ERRORLOG::ErrlUserDetailsTarget(i_target).addToLog(err); } @@ -244,6 +249,7 @@ errlHndl_t eepromRead ( TARGETING::Target * i_target, eeprom_addr_t i_i2cInfo ) { errlHndl_t err = NULL; + errlHndl_t err_NACK = NULL; uint8_t byteAddr[MAX_BYTE_ADDR]; size_t byteAddrSize = 0; bool unlock = false; @@ -270,51 +276,174 @@ errlHndl_t eepromRead ( TARGETING::Target * i_target, mutex_lock( &g_eepromMutex ); unlock = true; - // Only write the byte address if we have data to write - if( 0 != byteAddrSize ) + /***********************************************************/ + /* Attempt read multiple times ONLY on NACK fails */ + /***********************************************************/ + for (uint8_t retry = 0; + retry <= EEPROM_MAX_NACK_RETRIES; + retry++) { - // Use the I2C OFFSET Interface for the READ - err = deviceOp( DeviceFW::READ, - i_target, - o_buffer, - i_buflen, - DEVICE_I2C_ADDRESS_OFFSET( + // Only write the byte address if we have data to write + if( 0 != byteAddrSize ) + { + // Use the I2C OFFSET Interface for the READ + err = deviceOp( DeviceFW::READ, + i_target, + o_buffer, + i_buflen, + DEVICE_I2C_ADDRESS_OFFSET( i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr, byteAddrSize, reinterpret_cast<uint8_t*>(&byteAddr))); - if( err ) + if( err ) + { + TRACFCOMP(g_trac_eeprom, + ERR_MRK"eepromRead(): I2C Read-Offset failed on " + "%d/%d/0x%X aS=%d", + i_i2cInfo.port, i_i2cInfo.engine, + i_i2cInfo.devAddr, byteAddrSize); + TRACFBIN(g_trac_eeprom, "byteAddr[]", + &byteAddr, byteAddrSize); + + // Don't break here -- error handled below + } + } + else { - TRACFCOMP(g_trac_eeprom, - ERR_MRK"eepromRead(): I2C Read-Offset failed on " - "%d/%d/0x%X", - i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr); + // Do the actual read via I2C + err = deviceOp( DeviceFW::READ, + i_target, + o_buffer, + i_buflen, + DEVICE_I2C_ADDRESS( i_i2cInfo.port, + i_i2cInfo.engine, + i_i2cInfo.devAddr ) ); + + if( err ) + { + TRACFCOMP(g_trac_eeprom, + ERR_MRK"eepromRead(): I2C Read failed on " + "%d/%d/0x%0X", i_i2cInfo.port, i_i2cInfo.engine, + i_i2cInfo.devAddr); + + // Don't break here -- error handled below + } + } + + if ( err == NULL ) + { + // Operation completed successfully + // break from retry loop break; } - } - else + else if ( err->reasonCode() != I2C::I2C_NACK_ONLY_FOUND ) + { + // Only retry on NACK failures: break from retry loop + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromRead(): Non-Nack " + "Error: rc=0x%X, tgt=0x%X, No Retry (retry=%d)", + err->reasonCode(), + TARGETING::get_huid(i_target), retry); + + err->collectTrace(EEPROM_COMP_NAME); + + // break from retry loop + break; + } + else // Handle NACK error + { + // If op will be attempted again: save log and continue + if ( retry < EEPROM_MAX_NACK_RETRIES ) + { + // Only save original NACK error + if ( err_NACK == NULL ) + { + // Save original NACK error + err_NACK = err; + + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromRead(): " + "NACK Error rc=0x%X, eid=%d, tgt=0x%X, " + "retry/MAX=%d/%d. Save error and retry", + err_NACK->reasonCode(), + err_NACK->eid(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + err_NACK->collectTrace(EEPROM_COMP_NAME); + } + else + { + // Add data to original NACK error + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromRead(): " + "Another NACK Error rc=0x%X, eid=0x%X " + "plid=0x%X, tgt=0x%X, retry/MAX=%d/%d. " + "Delete error and retry", + err->reasonCode(), err->eid(), err->plid(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + ERRORLOG::ErrlUserDetailsString( + "Another NACK ERROR found") + .addToLog(err_NACK); + + // Delete this new NACK error + delete err; + err = NULL; + } + + // continue to retry + continue; + } + else // no more retries: trace and break + { + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromRead(): " + "Error rc=0x%X, eid=%d, tgt=0x%X. No More " + "Retries (retry/MAX=%d/%d). Returning Error", + err->reasonCode(), err->eid(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + err->collectTrace(EEPROM_COMP_NAME); + + // break from retry loop + break; + } + } + + } // end of retry loop + + // Handle saved NACK error, if any + if (err_NACK) { - // Do the actual read via I2C - err = deviceOp( DeviceFW::READ, - i_target, - o_buffer, - i_buflen, - DEVICE_I2C_ADDRESS( i_i2cInfo.port, - i_i2cInfo.engine, - i_i2cInfo.devAddr ) ); + if (err) + { + // commit original NACK error with new err PLID + err_NACK->plid(err->plid()); + TRACFCOMP(g_trac_eeprom, "eepromRead(): Committing saved NACK " + "err eid=0x%X with plid of returned err: 0x%X", + err_NACK->eid(), err_NACK->plid()); - if( err ) + ERRORLOG::ErrlUserDetailsTarget(i_target) + .addToLog(err_NACK); + + errlCommit(err_NACK, EEPROM_COMP_ID); + } + else { - TRACFCOMP(g_trac_eeprom, - ERR_MRK"eepromRead(): I2C Read failed on %d/%d/0x%0X", - i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr); - break; + // Since we eventually succeeded, delete original NACK error + TRACFCOMP(g_trac_eeprom, "eepromRead(): Op successful, " + "deleting saved NACK err eid=0x%X, plid=0x%X", + err_NACK->eid(), err_NACK->plid()); + + delete err_NACK; + err_NACK = NULL; } } + mutex_unlock( &g_eepromMutex ); unlock = false; @@ -347,11 +476,14 @@ errlHndl_t eepromWrite ( TARGETING::Target * i_target, eeprom_addr_t i_i2cInfo ) { errlHndl_t err = NULL; + errlHndl_t err_NACK = NULL; uint8_t byteAddr[MAX_BYTE_ADDR]; size_t byteAddrSize = 0; uint8_t * newBuffer = NULL; bool needFree = false; bool unlock = false; + uint32_t data_left = 0; + uint32_t diff_wps = 0; TRACDCOMP( g_trac_eeprom, ENTER_MRK"eepromWrite()" ); @@ -392,36 +524,29 @@ errlHndl_t eepromWrite ( TARGETING::Target * i_target, size_t loop_data_length = 0; size_t total_bytes_written = 0; + for ( uint64_t i = 0 ; - (i * i_i2cInfo.writePageSize) < io_buflen ; - i++) + total_bytes_written < io_buflen ; + i++ ) { + // Determine how much data can be written in this loop + // Can't go over a writePageSize boundary - if ( (io_buflen - (i * i_i2cInfo.writePageSize) ) - >= i_i2cInfo.writePageSize) - { - // Data to write >= to writePageSize, so write - // the maximum amount: writePageSize - loop_data_length = i_i2cInfo.writePageSize; - } - else - { - // Less than writePageSize to write - loop_data_length = io_buflen % i_i2cInfo.writePageSize; - } + // Total data left to write + data_left = io_buflen - total_bytes_written; - // Add the data the user wanted to write - memcpy( newBuffer, - &l_data_ptr[i * i_i2cInfo.writePageSize], - loop_data_length); + // Difference to next writePageSize boundary + diff_wps = i_i2cInfo.writePageSize - + (i_i2cInfo.offset % i_i2cInfo.writePageSize); + // Take the lesser of the 2 options + loop_data_length = (data_left < diff_wps ) ? data_left : diff_wps; + // Add the data the user wanted to write + memcpy( newBuffer, + &l_data_ptr[total_bytes_written], + loop_data_length ); - // Update the offset for each loop after the first one - if ( i > 0 ) - { - i_i2cInfo.offset += i_i2cInfo.writePageSize; - } // Setup offset/address parms err = eepromPrepareAddress( &byteAddr, @@ -433,19 +558,25 @@ errlHndl_t eepromWrite ( TARGETING::Target * i_target, break; } - TRACUCOMP(g_trac_eeprom,"eepromWrite() Loop: %d/%d/0x%X " - "loop=%d, l_d_l=%d, offset=0x%X, bAS=%d", + "loop=%d, l_d_l=%d, offset=0x%X, bAS=%d, diffs=%d/%d", i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr, - i, loop_data_length, i_i2cInfo.offset, byteAddrSize); - - - // Do the actual data write - err = deviceOp( DeviceFW::WRITE, - i_target, - newBuffer, - loop_data_length, - DEVICE_I2C_ADDRESS_OFFSET( + i, loop_data_length, i_i2cInfo.offset, byteAddrSize, + data_left, diff_wps); + + /***********************************************************/ + /* Attempt write multiple times ONLY on NACK fails */ + /***********************************************************/ + for (uint8_t retry = 0; + retry <= EEPROM_MAX_NACK_RETRIES; + retry++) + { + // Do the actual data write + err = deviceOp( DeviceFW::WRITE, + i_target, + newBuffer, + loop_data_length, + DEVICE_I2C_ADDRESS_OFFSET( i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr, @@ -453,27 +584,153 @@ errlHndl_t eepromWrite ( TARGETING::Target * i_target, reinterpret_cast<uint8_t*>( &byteAddr))); - if( err ) + + if ( err == NULL ) + { + // Operation completed successfully + // break from retry loop + break; + } + else if ( err->reasonCode() != I2C::I2C_NACK_ONLY_FOUND ) + { + // Only retry on NACK failures: break from retry loop + TRACFCOMP(g_trac_eeprom, ERR_MRK"eepromWrite(): I2C " + "Write Non-NACK fail %d/%d/0x%X loop=%d, " + "ldl=%d, offset=0x%X, aS=%d, retry=%d", + i_i2cInfo.port, i_i2cInfo.engine, + i_i2cInfo.devAddr, i, loop_data_length, + i_i2cInfo.offset, i_i2cInfo.addrSize, retry); + + err->collectTrace(EEPROM_COMP_NAME); + + // break from retry loop + break; + } + else // Handle NACK error + { + TRACFCOMP(g_trac_eeprom, ERR_MRK"eepromWrite(): I2C " + "Write NACK fail %d/%d/0x%X loop=%d, " + "ldl=%d, offset=0x%X, aS=%d", + i_i2cInfo.port, i_i2cInfo.engine, + i_i2cInfo.devAddr, i, loop_data_length, + i_i2cInfo.offset, i_i2cInfo.addrSize); + + // If op will be attempted again: save error and continue + if ( retry < EEPROM_MAX_NACK_RETRIES ) + { + // Only save original NACK error + if ( err_NACK == NULL ) + { + // Save original NACK error + err_NACK = err; + + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromWrite(): " + "Error rc=0x%X, eid=0x%X plid=0x%X, " + "tgt=0x%X, retry/MAX=%d/%d. Save error " + "and retry", + err_NACK->reasonCode(), + err_NACK->eid(), + err_NACK->plid(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + err_NACK->collectTrace(EEPROM_COMP_NAME); + } + else + { + // Add data to original NACK error + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromWrite(): " + "Another NACK Error rc=0x%X, eid=0x%X " + "plid=0x%X, tgt=0x%X, retry/MAX=%d/%d. " + "Delete error and retry", + err->reasonCode(), err->eid(), + err->plid(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + ERRORLOG::ErrlUserDetailsString( + "Another NACK ERROR found") + .addToLog(err_NACK); + + // Delete this new NACK error + delete err; + err = NULL; + } + + // continue to retry + continue; + } + else // no more retries: trace and break + { + TRACFCOMP( g_trac_eeprom, ERR_MRK"eepromWrite(): " + "Error rc=0x%X, tgt=0x%X. No More Retries " + "(retry/MAX=%d/%d). Returning Error", + err->reasonCode(), + TARGETING::get_huid(i_target), + retry, EEPROM_MAX_NACK_RETRIES); + + err->collectTrace(EEPROM_COMP_NAME); + + // break from retry loop + break; + } + } + + } // end of retry loop + /***********************************************************/ + + // Handle saved NACK errors, if any + if (err_NACK) { - TRACFCOMP(g_trac_eeprom, - ERR_MRK"eepromWrite(): I2C Write failed on %d/%d/0x%X " - "loop=%d, l_d_l=%d, offset=0x%X, aS=%d", - i_i2cInfo.port, i_i2cInfo.engine, i_i2cInfo.devAddr, i, - loop_data_length, i_i2cInfo.offset, i_i2cInfo.addrSize); + if (err) + { + // commit original NACK error with new err PLID + err_NACK->plid(err->plid()); + TRACFCOMP(g_trac_eeprom, "eepromWrite(): Committing saved " + "NACK err eid=0x%X with plid of returned err: " + "0x%X", + err_NACK->eid(), err_NACK->plid()); + ERRORLOG::ErrlUserDetailsTarget(i_target) + .addToLog(err_NACK); + + errlCommit(err_NACK, EEPROM_COMP_ID); + } + else + { + // Since we eventually succeeded, delete original NACK error + TRACFCOMP(g_trac_eeprom, "eepromWrite(): Op successful, " + "deleting saved NACK err eid=0x%X, plid=0x%X", + err_NACK->eid(), err_NACK->plid()); + + delete err_NACK; + err_NACK = NULL; + } + } + + if ( err ) + { // Can't assume that anything was written if // there was an error, so no update to total_bytes_written // for this loop break; } - // Wait 5ms for EEPROM o write data to its internal memory - nanosleep(0,5 * NS_PER_MSEC); // 5 msec - + // Wait for EEPROM to write data to its internal memory + // i_i2cInfo.writeCycleTime value in milliseconds + nanosleep(0, i_i2cInfo.writeCycleTime * NS_PER_MSEC); // Update how much data was written total_bytes_written += loop_data_length; + // Update offset + i_i2cInfo.offset += loop_data_length; + + TRACUCOMP(g_trac_eeprom,"eepromWrite() Loop %d End: " + "l_d_l=%d, offset=0x%X, t_b_w=%d, io_buflen=%d", + i, loop_data_length, i_i2cInfo.offset, + total_bytes_written, io_buflen); + } // end of write for-loop // Release mutex lock @@ -510,6 +767,7 @@ errlHndl_t eepromWrite ( TARGETING::Target * i_target, EXIT_MRK"eepromWrite()" ); return err; + } // end eepromWrite @@ -710,6 +968,7 @@ errlHndl_t eepromReadAttributes ( TARGETING::Target * i_target, o_i2cInfo.i2cMasterPath = eepromData.i2cMasterPath; o_i2cInfo.writePageSize = eepromData.writePageSize; o_i2cInfo.devSize_KB = eepromData.maxMemorySizeKB; + o_i2cInfo.writeCycleTime = eepromData.writeCycleTime; // Convert attribute info to eeprom_addr_size_t enum if ( eepromData.byteAddrOffset == 0x2 ) @@ -754,10 +1013,11 @@ errlHndl_t eepromReadAttributes ( TARGETING::Target * i_target, } while( 0 ); TRACUCOMP(g_trac_eeprom,"eepromReadAttributes() %d/%d/0x%X " - "wpw=0x%X, dsKb=0x%X, aS=%d (%d)", + "wpw=0x%X, dsKb=0x%X, aS=%d (%d), wct=%d", o_i2cInfo.port, o_i2cInfo.engine, o_i2cInfo.devAddr, o_i2cInfo.writePageSize, o_i2cInfo.devSize_KB, - o_i2cInfo.addrSize, eepromData.byteAddrOffset); + o_i2cInfo.addrSize, eepromData.byteAddrOffset, + o_i2cInfo.writeCycleTime); TRACDCOMP( g_trac_eeprom, diff --git a/src/usr/i2c/eepromdd.H b/src/usr/i2c/eepromdd.H index d30862b62..69e9c7b17 100755 --- a/src/usr/i2c/eepromdd.H +++ b/src/usr/i2c/eepromdd.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -65,6 +65,7 @@ typedef struct TARGETING::EntityPath i2cMasterPath; uint64_t writePageSize; // in bytes uint64_t devSize_KB; // in kilobytes + uint64_t writeCycleTime; // in milliseconds } eeprom_addr_t; /** diff --git a/src/usr/i2c/i2c.C b/src/usr/i2c/i2c.C index 8c2656f18..1f5cf336a 100755 --- a/src/usr/i2c/i2c.C +++ b/src/usr/i2c/i2c.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -65,8 +65,7 @@ TRAC_INIT( & g_trac_i2cr, "I2CR", KILOBYTE ); // ---------------------------------------------- // Defines // ---------------------------------------------- -#define I2C_COMMAND_ATTEMPTS 2 // 1 Retry on failure -#define I2C_RETRY_DELAY 10000000 // Sleep for 10 ms before retrying +#define I2C_RESET_DELAY_NS (5 * NS_PER_MSEC) // Sleep for 5 ms after reset #define MAX_I2C_ENGINES 3 // Maximum of 3 engines per I2C Master #define P8_MASTER_ENGINES 2 // Number of Engines used in P8 #define CENTAUR_MASTER_ENGINES 1 // Number of Engines in a Centaur @@ -98,6 +97,7 @@ errlHndl_t i2cPerformOp( DeviceFW::OperationType i_opType, va_list i_args ) { errlHndl_t err = NULL; + errlHndl_t err_reset = NULL; mutex_t * engineLock = NULL; bool mutex_needs_unlock = false; @@ -204,169 +204,180 @@ errlHndl_t i2cPerformOp( DeviceFW::OperationType i_opType, if( err ) { + // Skip performing the actual I2C Operation break; } - for( int attempt = 0; attempt < I2C_COMMAND_ATTEMPTS; attempt++ ) + /*******************************************************/ + /* Perform the I2C Operation */ + /*******************************************************/ + + /***********************************************/ + /* I2C Read with Offset */ + /***********************************************/ + if( i_opType == DeviceFW::READ && + l_offset_length != 0 ) { - if( err ) - { - // Catch and commit the log here if we failed on first attempt. - TRACFCOMP( g_trac_i2c, - ERR_MRK"Error Encountered, Attempt %d out of %d", - (attempt + 1), // Add 1 since we started counting at 0 - I2C_COMMAND_ATTEMPTS ); - errlCommit( err, - I2C_COMP_ID ); + // First WRITE offset to device without a stop + args.read_not_write = false; + args.with_stop = false; + args.skip_mode_setup = false; - // Reset the I2C Master - err = i2cReset( i_target, - args ); + err = i2cWrite( i_target, + l_offset_buffer, + l_offset_length, + args ); - if( err ) - { - break; - } + if( err == NULL ) + { + // Now do the READ with a stop + args.read_not_write = true; + args.with_stop = true; - // Sleep before trying again. - nanosleep( 0, I2C_RETRY_DELAY ); - } + // Skip mode setup on this cmd - + // already set with previous cmd + args.skip_mode_setup = true; + err = i2cRead( i_target, + io_buffer, + io_buflen, + args ); + } + } - if( i_opType == DeviceFW::READ && - l_offset_length != 0 ) - { + /***********************************************/ + /* I2C Write with Offset */ + /***********************************************/ + else if( i_opType == DeviceFW::WRITE && + l_offset_length != 0 ) + { - // First WRITE offset to device without a stop - args.read_not_write = false; - args.with_stop = false; - args.skip_mode_setup = false; + // Add the Offset Information to the start of the data and + // then send as a single write operation - err = i2cWrite( i_target, - l_offset_buffer, - l_offset_length, - args ); + size_t newBufLen = l_offset_length + io_buflen; + uint8_t * newBuffer = static_cast<uint8_t*>(malloc(newBufLen)); - if( err == NULL ) - { - // Now do the READ with a stop - args.read_not_write = true; - args.with_stop = true; - - // Skip mode setup on this cmd - - // already set with previous cmd - args.skip_mode_setup = true; - - err = i2cRead( i_target, - io_buffer, - io_buflen, - args ); - } - } + // Add the Offset to the buffer + memcpy( newBuffer, l_offset_buffer, l_offset_length); - else if( i_opType == DeviceFW::WRITE && - l_offset_length != 0 ) - { + // Now add the data the user wanted to write + memcpy( &newBuffer[l_offset_length], io_buffer, io_buflen); - // Add the Offset Information to the start of the data and - // then send as a single write operation + // Write parms: + args.read_not_write = false; + args.with_stop = true; + args.skip_mode_setup = false; - size_t newBufLen = l_offset_length + io_buflen; - uint8_t * newBuffer = static_cast<uint8_t*>(malloc(newBufLen)); + err = i2cWrite( i_target, + newBuffer, + newBufLen, + args ); - // Add the Offset to the buffer - memcpy( newBuffer, l_offset_buffer, l_offset_length); - // Now add the data the user wanted to write - memcpy( &newBuffer[l_offset_length], io_buffer, io_buflen); + free( newBuffer ); - // Write parms: - args.read_not_write = false; - args.with_stop = true; - args.skip_mode_setup = false; + } - err = i2cWrite( i_target, - newBuffer, - newBufLen, - args ); + /***********************************************/ + /* I2C Read (no offset) */ + /***********************************************/ + else if ( i_opType == DeviceFW::READ && + l_offset_length == 0 ) + { + // Do a direct READ + args.read_not_write = true; + args.with_stop = true; + args.skip_mode_setup = false; + + err = i2cRead( i_target, + io_buffer, + io_buflen, + args); + } - free( newBuffer ); + /***********************************************/ + /* I2C Write (no offset) */ + /***********************************************/ + else if( i_opType == DeviceFW::WRITE && + l_offset_length == 0 ) + { + // Do a direct WRITE with a stop + args.read_not_write = false; + args.with_stop = true; + args.skip_mode_setup = false; + + err = i2cWrite( i_target, + io_buffer, + io_buflen, + args); + } - } + /********************************************************/ + /* Error - Unsupported I2C Op/Offset Type Combination */ + /********************************************************/ + else + { + TRACFCOMP( g_trac_i2c, ERR_MRK"i2cPerformOp() - " + "Unsupported Op/Offset-Type Combination=%d/%d", + i_opType, l_offset_length ); + uint64_t userdata2 = l_offset_length; + userdata2 = (userdata2 << 16) | args.port; + userdata2 = (userdata2 << 16) | args.engine; + userdata2 = (userdata2 << 16) | args.devAddr; - else if ( i_opType == DeviceFW::READ && - l_offset_length == 0 ) - { - // Do a direct READ - args.read_not_write = true; - args.with_stop = true; - args.skip_mode_setup = false; + /*@ + * @errortype + * @reasoncode I2C_INVALID_OP_TYPE + * @severity ERRL_SEV_UNRECOVERABLE + * @moduleid I2C_PERFORM_OP + * @userdata1 i_opType + * @userdata2[0:15] Offset Length + * @userdata2[16:31] Master Port + * @userdata2[32:47] Master Engine + * @userdata2[48:63] Slave Device Address + * @devdesc Invalid Operation type. + */ + err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, + I2C_PERFORM_OP, + I2C_INVALID_OP_TYPE, + i_opType, + userdata2 ); - err = i2cRead( i_target, - io_buffer, - io_buflen, - args); - } + // No Operation performed, so can break and skip the section + // that handles operation errors + break; + } + // Handle Error from I2C Operation + if( err ) + { + // Reset the I2C Master + err_reset = i2cReset( i_target, + args ); - else if( i_opType == DeviceFW::WRITE && - l_offset_length == 0 ) - { - // Do a direct WRITE with a stop - args.read_not_write = false; - args.with_stop = true; - args.skip_mode_setup = false; - - err = i2cWrite( i_target, - io_buffer, - io_buflen, - args); - } - else + if( err_reset ) { + // 2 error logs, so commit the reset log here TRACFCOMP( g_trac_i2c, ERR_MRK"i2cPerformOp() - " - "Unsupported Op/Offset-Type Combination=%d/%d", - i_opType, l_offset_length ); - uint64_t userdata2 = l_offset_length; - userdata2 = (userdata2 << 16) | args.port; - userdata2 = (userdata2 << 16) | args.engine; - userdata2 = (userdata2 << 16) | args.devAddr; + "Previous error (rc=0x%X, eid=0x%X) before " + "i2cReset() failed. Committing reset error " + "(rc=0x%X, eid=0x%X) and returning original error", + err->reasonCode(), err->eid(), + err_reset->reasonCode(), err_reset->eid() ); - /*@ - * @errortype - * @reasoncode I2C_INVALID_OP_TYPE - * @severity ERRL_SEV_UNRECOVERABLE - * @moduleid I2C_PERFORM_OP - * @userdata1 i_opType - * @userdata2[0:15] Offset Length - * @userdata2[16:31] Master Port - * @userdata2[32:47] Master Engine - * @userdata2[48:63] Slave Device Address - * @devdesc Invalid Operation type. - */ - err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, - I2C_PERFORM_OP, - I2C_INVALID_OP_TYPE, - i_opType, - userdata2 ); - - break; + errlCommit( err_reset, I2C_COMP_ID ); } - // If no errors, break here - if( err == NULL ) - { - break; - } - } + // Sleep to allow devices to recover from reset + nanosleep( 0, I2C_RESET_DELAY_NS ); - if( err ) - { break; } + } while( 0 ); // Check if we need to unlock the mutex @@ -895,6 +906,7 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target, { errlHndl_t err = NULL; bool errorFound = false; + bool nackFound = false; uint64_t intRegVal = 0x0; TRACDCOMP( g_trac_i2c, @@ -944,7 +956,8 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target, if( 1 == i_statusVal.nack_received ) { - errorFound = true; + // Rather than using 'errorFound', use specific nackFound + nackFound = true; TRACFCOMP( g_trac_i2c, ERR_MRK"I2C NACK Received! - status reg: %016llx", i_statusVal.value ); @@ -983,7 +996,7 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target, if( errorFound ) { TRACFCOMP( g_trac_i2c, - ERR_MRK"i2cCheckForErrors() - Error(s) found after command complete!" ); + ERR_MRK"i2cCheckForErrors() - Error(s) found" ); /*@ * @errortype @@ -1005,6 +1018,33 @@ errlHndl_t i2cCheckForErrors ( TARGETING::Target * i_target, break; } + + else if ( nackFound ) + { + TRACFCOMP( g_trac_i2c, + ERR_MRK"i2cCheckForErrors() - NACK found (only error)" ); + + /*@ + * @errortype + * @reasoncode I2C_NACK_ONLY_FOUND + * @severity ERRL_SEV_UNRECOVERABLE + * @moduleid I2C_CHECK_FOR_ERRORS + * @userdata1 Status Register Value + * @userdata2 Interrupt Register Value + * @devdesc Error was found in I2C status register. Check + * userdata1 to determine what the error was. + */ + err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE, + I2C_CHECK_FOR_ERRORS, + I2C_NACK_ONLY_FOUND, + i_statusVal.value, + intRegVal ); + + // @todo RTC:69113 - Add target and I2C traces to the errorlog. + + break; + } + } while( 0 ); TRACDCOMP( g_trac_i2c, @@ -1189,7 +1229,7 @@ errlHndl_t i2cSendSlaveStop ( TARGETING::Target * i_target, TRACUCOMP(g_trac_i2c,"i2cSendSlaveStop(): " "mode[0x%lx]: 0x%016llx", - masterAddrs[engine].mode, mode.value ); + masterAddrs[i_args.engine].mode, mode.value ); err = deviceWrite( i_target, &mode.value, @@ -1207,7 +1247,7 @@ errlHndl_t i2cSendSlaveStop ( TARGETING::Target * i_target, TRACUCOMP(g_trac_i2c,"i2cSendSlaveStop(): " "cmd[0x%lx]: 0x%016llx", - masterAddrs[engine].command, cmd.value ); + masterAddrs[i_args.engine].command, cmd.value ); err = deviceWrite( i_target, &cmd.value, @@ -1269,7 +1309,7 @@ errlHndl_t i2cGetInterrupts ( TARGETING::Target * i_target, TRACUCOMP(g_trac_i2c,"i2cGetInterrupts(): " "interrupt[0x%lx]: 0x%016llx", - masterAddrs[engine].interrupt, intreg.value ); + masterAddrs[i_args.engine].interrupt, intreg.value ); // Return the data read o_intRegValue = intreg.value; @@ -1598,7 +1638,6 @@ errlHndl_t i2cSetBusVariables ( TARGETING::Target * i_target, } while( 0 ); - TRACUCOMP(g_trac_i2c,"i2cSetBusVariables(): e/p/dA=%d/%d/0x%x: " "mode=%d: b_sp=%d, b_r_d=0x%x, to_i=%d, to_c = %d", io_args.engine, io_args.port, io_args.devAddr, diff --git a/src/usr/i2c/i2c.H b/src/usr/i2c/i2c.H index e864df093..329877376 100755 --- a/src/usr/i2c/i2c.H +++ b/src/usr/i2c/i2c.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -53,13 +53,13 @@ namespace I2C /** * @brief I2C Clock setting values * - * The clock divisors are found by using a 600Mhz local bus, using the + * The clock divisors are found by using a 500Mhz local bus, using the * equation that was given in the I2C Master Spec. * */ #define I2C_MAX_BUS_SPEED 400 -#define I2C_CLOCK_DIVISOR_100KHZ 1499 // 0x5DB -#define I2C_CLOCK_DIVISOR_400KHZ 374 // 0x176 +#define I2C_CLOCK_DIVISOR_100KHZ 1250 // 0x4E2 +#define I2C_CLOCK_DIVISOR_400KHZ 312 // 0x138 /** * @brief I2C Clock delay polling values diff --git a/src/usr/i2c/test/eepromddtest.H b/src/usr/i2c/test/eepromddtest.H index 4cd4fad37..fdf55dd8d 100755 --- a/src/usr/i2c/test/eepromddtest.H +++ b/src/usr/i2c/test/eepromddtest.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -76,24 +76,28 @@ class EEPROMTest: public CxxTest::TestSuite } testData[] = { - // MVPD of processor - chip 0 - // Write: - { 0x0000, VPD_PRIMARY, 0xfedcba9876543210, 8, false }, - // Read: - { 0x0000, VPD_PRIMARY, 0xfedcba9876543210, 8, true }, + // Read - Only + { 0x0000, VPD_PRIMARY, 0x000f17ba00000000, 4, true }, // SBE Primary of processor - chip 2 - // Write: - { 0x0100, SBE_PRIMARY, 0xaabb000000000000, 2, false }, + // Write: over 128-byte page boundary: + { 0x017F, SBE_PRIMARY, 0xaabb000000000000, 2, false }, + // Read: + { 0x017F, SBE_PRIMARY, 0xaabb000000000000, 2, true }, + + // SBE Backup of processor - chip 3 + // Write: over 256-byte page boundary: + { 0x01FD, SBE_BACKUP, 0x1122334400000000, 4, false }, // Read: - { 0x0100, SBE_PRIMARY, 0xaabb000000000000, 2, true }, + { 0x01FD, SBE_BACKUP, 0x1122334400000000, 4, true }, // SBE Backup of processor - chip 3 - // Write: - { 0x00F0, SBE_BACKUP, 0x1122334400000000, 4, false }, + // Write: inside 128 page boundary: + { 0x005B, SBE_BACKUP, 0xbad5adcabf0b7000, 7, false }, // Read: - { 0x00F0, SBE_BACKUP, 0x1122334400000000, 4, true }, + { 0x005B, SBE_BACKUP, 0xbad5adcabf0b7000, 7, true }, + }; const uint32_t NUM_CMDS = sizeof(testData)/sizeof(testData[0]); @@ -157,7 +161,7 @@ class EEPROMTest: public CxxTest::TestSuite { uint64_t data; - // if a read, initialize data, else, set data to write + // if a read, clear data; else, set data to write if( testData[i].rnw ) { data = 0x0ull; @@ -214,12 +218,12 @@ class EEPROMTest: public CxxTest::TestSuite /** * @brief EEPROM Read/Write Large Test - * This test will read and write 1KB of data to SBE Backup + * This test will read and write 603 bytes of data to SBE Backup * VPD. It will attempt to restore the original data at * the end of the test. * - * Note: 1st 1K of SBE EEPROM data is currently blank, so this - * test will read and write to that address space + * Note: 1st 768 bytes of SBE EEPROM data is currently blank, so + * this test will read and write below that address space */ void testEEPROMReadWriteLarge ( void ) { @@ -228,12 +232,15 @@ class EEPROMTest: public CxxTest::TestSuite int num_ops = 0; int cmds = 0; - // Create 1KB buffers - size_t testBufLen = 1024; + // Create 603-byte buffers + size_t testBufLen = 603; uint8_t testBuffer[testBufLen]; uint8_t new_data[testBufLen]; uint8_t original_data[testBufLen]; + // Use small offset to force more complicated page-boundary testing + uint8_t offset = 0x11; + TRACFCOMP( g_trac_eeprom, "testEEPROMReadWriteLarge - Start" ); @@ -255,7 +262,7 @@ class EEPROMTest: public CxxTest::TestSuite TargetHandleList fullList; fullList.push_back( testTarget ); - // 5 operations of 1K data per target (details below) + // 5 operations per target (details below) const uint32_t NUM_CMDS = 5; // Number of total operations @@ -297,10 +304,9 @@ class EEPROMTest: public CxxTest::TestSuite } - // Valid Buffer, so memcpy the first 1KB + // Valid Buffer, so memcpy the first 603 bytes memcpy( new_data, tmp_ptr, testBufLen ); - /************************************************************/ /* Loop through targets and perform operations */ /************************************************************/ @@ -318,11 +324,9 @@ class EEPROMTest: public CxxTest::TestSuite // Before starting, clear original data buffer memset(original_data, 0x0, testBufLen); - for (uint8_t j = 1; j <= NUM_CMDS; j++) { - - // Details: 5 operations of 1K data per target + // Details: 5 operations per target // 1) Read Original Data and Save It // 2) Write New Data // 3) Read New Data and Compare @@ -356,7 +360,8 @@ class EEPROMTest: public CxxTest::TestSuite fullList[0], testBuffer, testBufLen, - DEVICE_EEPROM_ADDRESS(SBE_BACKUP,0x0)); + DEVICE_EEPROM_ADDRESS(SBE_BACKUP, + offset)); if( err ) { @@ -550,7 +555,6 @@ class EEPROMTest: public CxxTest::TestSuite // Set max length and offset dataSize = 0xFFFFFFFFFFFFFFFF; offset = 0xFFFFFFFFFFFFFFFF; - num_ops++; err = deviceOp( DeviceFW::WRITE, testTarget, @@ -578,7 +582,7 @@ class EEPROMTest: public CxxTest::TestSuite } while( 0 ); TRACFCOMP( g_trac_eeprom, - "testEEPROMInvalidChip - End: %d/%d fails", + "testEEPROMOverflow - End: %d/%d fails", fails, num_ops ); } diff --git a/src/usr/i2c/test/i2ctest.H b/src/usr/i2c/test/i2ctest.H index 0224d8dd8..46e5efd59 100755 --- a/src/usr/i2c/test/i2ctest.H +++ b/src/usr/i2c/test/i2ctest.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2013 */ +/* COPYRIGHT International Business Machines Corp. 2011,2014 */ /* */ /* p1 */ /* */ @@ -68,7 +68,6 @@ class I2CTest: public CxxTest::TestSuite */ void testI2CDirect ( void ) { - errlHndl_t err = NULL; int cmds = 0; int fails = 0; @@ -115,58 +114,58 @@ class I2CTest: public CxxTest::TestSuite // Read/Write SBE Primary: Murano-0, port-0 // Safe to write to first 0x300: 0x0-0x2FF - { 0x00, 0x00, 0xAC, 0x0000ababcdcdefef, - 8, false, TARGETING::TYPE_PROC }, // Write data to 0x0000 + { 0x00, 0x00, 0xAC, 0x0020ababcdcdefef, + 8, false, TARGETING::TYPE_PROC }, // Write data to 0x0020 - { 0x00, 0x00, 0xAC, 0x0000000000000000, + { 0x00, 0x00, 0xAC, 0x0020000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read { 0x00, 0x00, 0xAc, 0xababcdcdefef0000, 6, true, TARGETING::TYPE_PROC }, // Read data back - { 0x00, 0x00, 0xAC, 0x0003000000000000, + { 0x00, 0x00, 0xAC, 0x0023000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read { 0x00, 0x00, 0xAC, 0xcdefef0000000000, 3, true, TARGETING::TYPE_PROC }, // Read data back - { 0x00, 0x00, 0xAC, 0x0005ee1200000000, - 4, false, TARGETING::TYPE_PROC }, // Write data to 0x0005 + { 0x00, 0x00, 0xAC, 0x0025831200000000, + 4, false, TARGETING::TYPE_PROC }, // Write data to 0x0025 - { 0x00, 0x00, 0xAC, 0x0005000000000000, + { 0x00, 0x00, 0xAC, 0x0024000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read - { 0x00, 0x00, 0xAC, 0xee12000000000000, - 2, true, TARGETING::TYPE_PROC }, // Read data back + { 0x00, 0x00, 0xAC, 0xef83120000000000, + 3, true, TARGETING::TYPE_PROC }, // Read data back // Read/Write SBE Backup: Murano-0, port-0 // Safe to write to first 0x300: 0x0-0x2FF - { 0x00, 0x00, 0xAE, 0x0000ababcdcdefef, - 8, false, TARGETING::TYPE_PROC }, // Write data to 0x0000 + { 0x00, 0x00, 0xAE, 0x0030ababcdcdefef, + 8, false, TARGETING::TYPE_PROC }, // Write data to 0x0030 - { 0x00, 0x00, 0xAE, 0x0000000000000000, + { 0x00, 0x00, 0xAE, 0x0030000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read { 0x00, 0x00, 0xAE, 0xababcdcdefef0000, 6, true, TARGETING::TYPE_PROC }, // Read data back - { 0x00, 0x00, 0xAE, 0x0003000000000000, + { 0x00, 0x00, 0xAE, 0x0033000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read { 0x00, 0x00, 0xAE, 0xcdefef0000000000, 3, true, TARGETING::TYPE_PROC }, // Read data back - { 0x00, 0x00, 0xAE, 0x0005ee1200000000, - 4, false, TARGETING::TYPE_PROC }, // Write data to 0x0005 + { 0x00, 0x00, 0xAE, 0x0035971200000000, + 4, false, TARGETING::TYPE_PROC }, // Write data to 0x0035 - { 0x00, 0x00, 0xAE, 0x0005000000000000, + { 0x00, 0x00, 0xAE, 0x0034000000000000, 2, false, TARGETING::TYPE_PROC }, // Write addr for read - { 0x00, 0x00, 0xAE, 0xee12000000000000, - 2, true, TARGETING::TYPE_PROC }, // Read data back + { 0x00, 0x00, 0xAE, 0xef97120000000000, + 3, true, TARGETING::TYPE_PROC }, // Read data back // MEMBUF TESTS @@ -310,6 +309,13 @@ class I2CTest: public CxxTest::TestSuite continue; } + // If a write op, wait 5ms for EEPROM to write data + // to its internal memory + if (testData[i].rnw == false) + { + nanosleep(0,5 * NS_PER_MSEC); // 5 msec + } + // compare data for the read, but ignore case where // data = I2C_TEST_IGNORE_DATA_COMPARE if( ( testData[i].rnw ) && @@ -346,7 +352,6 @@ class I2CTest: public CxxTest::TestSuite */ void testI2COffset ( void ) { - errlHndl_t err = NULL; int cmds = 0; int fails = 0; @@ -492,7 +497,6 @@ class I2CTest: public CxxTest::TestSuite // Before starting, clear original data buffer original_data = 0x0ull; - for (uint8_t j = 1; j <= 5; j++) { @@ -535,6 +539,14 @@ class I2CTest: public CxxTest::TestSuite continue; } + + // If a write op, wait 5ms for EEPROM to write data + // to its internal memory + if ( (j%2) == 0 ) + { + nanosleep(0,5 * NS_PER_MSEC); // 5 msec + } + // Handle loop-specific results // For Loop 1: save original data diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl index 09ed90a66..7bd8bdca7 100755 --- a/src/usr/targeting/common/genHwsvMrwXml.pl +++ b/src/usr/targeting/common/genHwsvMrwXml.pl @@ -3238,6 +3238,7 @@ sub addEeproms print " <field><id>byteAddrOffset</id><value>0x02</value></field>\n"; print " <field><id>maxMemorySizeKB</id><value>0x40</value></field>\n"; print " <field><id>writePageSize</id><value>0x80</value></field>\n"; + print " <field><id>writeCycleTime</id><value>0x05</value></field>\n"; print " </default>\n"; print " </attribute>\n"; } diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml index ed4be7400..2741fd408 100644 --- a/src/usr/targeting/common/xmltohb/attribute_types.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types.xml @@ -1078,6 +1078,14 @@ <type>uint64_t</type> <default>0x0</default> </field> + <field> + <name>writeCycleTime</name> + <description>The amount of time in milliseconds a device requires + on the completion of a write command to update its + internal memory.</description> + <type>uint64_t</type> + <default>0x0</default> + </field> </complexType> <persistency>non-volatile</persistency> <readable/> @@ -1139,6 +1147,14 @@ <type>uint64_t</type> <default>0x0</default> </field> + <field> + <name>writeCycleTime</name> + <description>The amount of time in milliseconds a device requires + on the completion of a write command to update its + internal memory.</description> + <type>uint64_t</type> + <default>0x0</default> + </field> </complexType> <persistency>non-volatile</persistency> <readable/> @@ -1200,6 +1216,14 @@ <type>uint64_t</type> <default>0x0</default> </field> + <field> + <name>writeCycleTime</name> + <description>The amount of time in milliseconds a device requires + on the completion of a write command to update its + internal memory.</description> + <type>uint64_t</type> + <default>0x0</default> + </field> </complexType> <persistency>non-volatile</persistency> <readable/> @@ -1261,6 +1285,14 @@ <type>uint64_t</type> <default>0x0</default> </field> + <field> + <name>writeCycleTime</name> + <description>The amount of time in milliseconds a device requires + on the completion of a write command to update its + internal memory.</description> + <type>uint64_t</type> + <default>0x0</default> + </field> </complexType> <persistency>non-volatile</persistency> <readable/> diff --git a/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml b/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml index 528dfc8a9..ceb8b7c2a 100644 --- a/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml +++ b/src/usr/targeting/common/xmltohb/simics_MURANO.system.xml @@ -5,7 +5,7 @@ <!-- --> <!-- IBM CONFIDENTIAL --> <!-- --> -<!-- COPYRIGHT International Business Machines Corp. 2011,2013 --> +<!-- COPYRIGHT International Business Machines Corp. 2011,2014 --> <!-- --> <!-- p1 --> <!-- --> @@ -536,6 +536,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -548,6 +549,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -560,6 +562,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -572,6 +575,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -1351,6 +1355,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1363,6 +1368,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1375,6 +1381,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1387,6 +1394,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -2168,6 +2176,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2180,6 +2189,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2192,6 +2202,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2204,6 +2215,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -2985,6 +2997,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2997,6 +3010,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -3009,6 +3023,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -3021,6 +3036,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -3601,6 +3617,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -3714,6 +3731,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -3827,6 +3845,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -3940,6 +3959,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4052,6 +4072,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4165,6 +4186,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4278,6 +4300,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4391,6 +4414,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4503,6 +4527,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4616,6 +4641,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4729,6 +4755,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4842,6 +4869,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -4954,6 +4982,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -5067,6 +5096,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -5180,6 +5210,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -5293,6 +5324,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> diff --git a/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml b/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml index 1fd97bc16..73bd11630 100644 --- a/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml +++ b/src/usr/targeting/common/xmltohb/simics_VENICE.system.xml @@ -5,7 +5,7 @@ <!-- --> <!-- IBM CONFIDENTIAL --> <!-- --> -<!-- COPYRIGHT International Business Machines Corp. 2011,2013 --> +<!-- COPYRIGHT International Business Machines Corp. 2011,2014 --> <!-- --> <!-- p1 --> <!-- --> @@ -528,6 +528,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -540,6 +541,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -552,6 +554,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -564,6 +567,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -1706,6 +1710,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1718,6 +1723,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1730,6 +1736,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -1742,6 +1749,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -2884,6 +2892,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2896,6 +2905,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2908,6 +2918,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -2920,6 +2931,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -4062,6 +4074,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -4074,6 +4087,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -4086,6 +4100,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -4098,6 +4113,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -5239,6 +5255,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -5251,6 +5268,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -5263,6 +5281,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -5275,6 +5294,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -6385,6 +6405,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -6397,6 +6418,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -6409,6 +6431,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -6421,6 +6444,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -7529,6 +7553,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -7541,6 +7566,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -7553,6 +7579,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -7565,6 +7592,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -8673,6 +8701,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -8685,6 +8714,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -8697,6 +8727,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute> @@ -8709,6 +8740,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x40</value></field> <field><id>writePageSize</id><value>0x80</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -9616,6 +9648,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -9729,6 +9762,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -9842,6 +9876,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -9955,6 +9990,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10068,6 +10104,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10181,6 +10218,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10294,6 +10332,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10407,6 +10446,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10520,6 +10560,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10633,6 +10674,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10746,6 +10788,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10859,6 +10902,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -10972,6 +11016,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11085,6 +11130,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11198,6 +11244,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11311,6 +11358,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11424,6 +11472,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11537,6 +11586,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11650,6 +11700,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11763,6 +11814,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11876,6 +11928,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -11989,6 +12042,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12102,6 +12156,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12215,6 +12270,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12328,6 +12384,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12441,6 +12498,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12554,6 +12612,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12667,6 +12726,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12780,6 +12840,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -12893,6 +12954,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -13006,6 +13068,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -13119,6 +13182,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> <attribute><id>EI_BUS_TX_MSBSWAP</id> @@ -13232,6 +13296,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13342,6 +13407,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13452,6 +13518,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13562,6 +13629,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13672,6 +13740,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13782,6 +13851,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -13892,6 +13962,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14002,6 +14073,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14112,6 +14184,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14222,6 +14295,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14332,6 +14406,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14442,6 +14517,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14552,6 +14628,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14662,6 +14739,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14772,6 +14850,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14882,6 +14961,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -14992,6 +15072,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15102,6 +15183,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15212,7 +15294,8 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> - </default> + <field><id>writeCycleTime</id><value>0x05</value></field> + </default> </attribute> </targetInstance> @@ -15322,6 +15405,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15432,6 +15516,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15542,6 +15627,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15652,6 +15738,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15762,6 +15849,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15872,6 +15960,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -15982,6 +16071,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16092,6 +16182,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16202,6 +16293,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16312,6 +16404,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16422,6 +16515,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16532,6 +16626,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> @@ -16642,6 +16737,7 @@ <field><id>byteAddrOffset</id><value>0x02</value></field> <field><id>maxMemorySizeKB</id><value>0x04</value></field> <field><id>writePageSize</id><value>0x20</value></field> + <field><id>writeCycleTime</id><value>0x05</value></field> </default> </attribute> </targetInstance> |