summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/usr/hwpf/hwp/bus_training/edi_regs.h54
-rw-r--r--src/usr/hwpf/hwp/bus_training/gcr_funcs.C321
-rw-r--r--src/usr/hwpf/hwp/bus_training/gcr_funcs.H253
-rw-r--r--src/usr/hwpf/hwp/bus_training/gcr_funcs_errors.xml39
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_cleanup.C598
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_cleanup.H5
-rwxr-xr-xsrc/usr/hwpf/hwp/bus_training/io_cleanup_errors.xml35
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_clear_firs.C5
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_dccal.C237
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_dccal_errors.xml226
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_errors.xml244
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_fir_isolation.C237
-rwxr-xr-xsrc/usr/hwpf/hwp/bus_training/io_fir_isolation_errors.xml204
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_funcs.C747
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_funcs.H40
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_funcs_errors.xml435
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_power_down_lanes.C306
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H8
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_power_down_lanes_errors.xml37
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_read_erepair.C223
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_read_erepair_errors.xml37
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_restore_erepair.C130
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_restore_erepair.H5
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_restore_erepair_errors.xml35
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_run_training.C2463
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_run_training.H67
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_run_training_errors.xml105
-rw-r--r--src/usr/hwpf/hwp/bus_training/makefile1
-rw-r--r--src/usr/hwpf/makefile12
29 files changed, 4437 insertions, 2672 deletions
diff --git a/src/usr/hwpf/hwp/bus_training/edi_regs.h b/src/usr/hwpf/hwp/bus_training/edi_regs.h
index 7dfdf3206..64ad59973 100644
--- a/src/usr/hwpf/hwp/bus_training/edi_regs.h
+++ b/src/usr/hwpf/hwp/bus_training/edi_regs.h
@@ -1,26 +1,25 @@
-/* IBM_PROLOG_BEGIN_TAG
- * This is an automatically generated prolog.
- *
- * $Source: src/usr/hwpf/hwp/bus_training/edi_regs.h $
- *
- * IBM CONFIDENTIAL
- *
- * COPYRIGHT International Business Machines Corp. 2012
- *
- * p1
- *
- * Object Code Only (OCO) source materials
- * Licensed Internal Code Source Materials
- * IBM HostBoot Licensed Internal Code
- *
- * The source code for this program is not published or other-
- * wise divested of its trade secrets, irrespective of what has
- * been deposited with the U.S. Copyright Office.
- *
- * Origin: 30
- *
- * IBM_PROLOG_END_TAG
- */
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/bus_training/edi_regs.h $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
//-----------------------------------------------------
// ____ ____ _ ______ ______
// / __ \/ __ \ / | / / __ \/_ __/
@@ -42,7 +41,7 @@
//-----------------------------------------------------
// Constant file for edi_reg_attribute.txt_fixed
// File generated at 16:23 on 8/31/2011 using system_pervasive/common/tools/CreateConstantsH.pl
-// $Id: edi_regs.h,v 1.9 2012/07/28 04:03:12 jmcgill Exp $
+// $Id: edi_regs.h,v 1.10 2014/02/20 13:27:29 varkeykv Exp $
// $URL: $
//
// *!**************************************************************************
@@ -474,14 +473,14 @@ tx_mode_pl,
ei4_rx_fir_mask_pb,
ei4_rx_fir_error_inject_pb,
ei4_rx_fir_msg_pb,
+ ei4_rx_dcd_adj_pl,
NUM_REGS
} GCR_sub_registers;
// merged ei4 and edi ext addresses
const uint32_t GCR_sub_reg_ext_addr[] = { 0x080, 0x081, 0x082, 0x085, 0x086, 0x087, 0x088, 0x08A, 0x08B, 0x08C, 0x08D, 0x08E, 0x08F, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x188, 0x189, 0x18A, 0x18B, 0x18C, 0x192, 0x193, 0x194, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0x19F, 0x1A0, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1D5, 0x1D6, 0x1D7, 0x1D8, 0x1D9, 0x1DA, 0x1DB, 0x1DC, 0x1E0, 0x1E1, 0x1E2, 0x1E3, 0x1E4, 0x1E5, 0x1E6, 0x1E7, 0x1E8, 0x1E9, 0x000, 0x001, 0x002, 0x003, 0x005, 0x008, 0x009, 0x00A, 0x00B, 0x00C, 0x00D, 0x00E, 0x00F, 0x010, 0x011, 0x012, 0x013, 0x014, 0x016, 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F, 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x027, 0x028, 0x029, 0x02A, 0x02B, 0x02C, 0x02D, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, 0x10B, 0x10C, 0x10D, 0x10F, 0x110, 0x111, 0x112, 0x113, 0x114, 0x117, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0x123, 0x124, 0x125, 0x126, 0x127, 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, 0x130, 0x131, 0x132, 0x133, 0x134, 0x135, 0x137, 0x138, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, 0x140, 0x141, 0x142, 0x143, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, 0x14C, 0x14D, 0x14E, 0x14F, 0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15E, 0x15F, 0x160, 0x161, 0x162, 0x168, 0x169, 0x16A, 0x16B, 0x16C, 0x16D, 0x16E, 0x16F, 0x170, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0x177, 0x178, 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1FF,
- 0x080, 0x081, 0x082, 0x085, 0x086, 0x087, 0x088, 0x08A, 0x08B, 0x08C, 0x08D, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x188, 0x189, 0x18A, 0x18B, 0x18C, 0x192, 0x193, 0x194, 0x198, 0x19D, 0x19F, 0x1A0, 0x1A1, 0x1A2, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, 0x1A8, 0x1C7, 0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1D6, 0x1D7, 0x1D8, 0x1D9, 0x1DB, 0x1DC, 0x000, 0x001, 0x002, 0x005, 0x008, 0x009, 0x00A, 0x00C, 0x00D, 0x00E, 0x00F, 0x016, 0x017, 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F, 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x027, 0x028, 0x029, 0x02B, 0x02C, 0x02D, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, 0x10B, 0x10C, 0x10F, 0x110, 0x111, 0x112, 0x113, 0x114, 0x117, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0x123, 0x124, 0x125, 0x126, 0x127, 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, 0x130, 0x131, 0x132, 0x133, 0x134, 0x135, 0x136, 0x137, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, 0x140, 0x142, 0x146, 0x147, 0x148, 0x149, 0x14E, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15F, 0x160, 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0x169, 0x16A, 0x16B, 0x16C, 0x16D, 0x171, 0x172, 0x173, 0x175, 0x176, 0x177, 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1FF
-};
+ 0x080, 0x081, 0x082, 0x085, 0x086, 0x087, 0x088, 0x08A, 0x08B, 0x08C, 0x08D, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x188, 0x189, 0x18A, 0x18B, 0x18C, 0x192, 0x193, 0x194, 0x198, 0x19D, 0x19F, 0x1A0, 0x1A1, 0x1A2, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, 0x1A8, 0x1C7, 0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1D6, 0x1D7, 0x1D8, 0x1D9, 0x1DB, 0x1DC, 0x000, 0x001, 0x002, 0x005, 0x008, 0x009, 0x00A, 0x00C, 0x00D, 0x00E, 0x00F, 0x016, 0x017, 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F, 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x027, 0x028, 0x029, 0x02B, 0x02C, 0x02D, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, 0x10B, 0x10C, 0x10F, 0x110, 0x111, 0x112, 0x113, 0x114, 0x117, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0x123, 0x124, 0x125, 0x126, 0x127, 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, 0x130, 0x131, 0x132, 0x133, 0x134, 0x135, 0x136, 0x137, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, 0x140, 0x142, 0x146, 0x147, 0x148, 0x149, 0x14E, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15F, 0x160, 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0x169, 0x16A, 0x16B, 0x16C, 0x16D, 0x171, 0x172, 0x173, 0x175, 0x176, 0x177, 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1FF,0x02E};
//merged ei4 and edi
const char* const GCR_sub_reg_names[] = {
"TX Lane Mode Reg",
@@ -895,7 +894,8 @@ const char* const GCR_sub_reg_names[] = {
"Per-Bus FIR Error Source-Isolation Reg",
"Per-Bus FIR Error Source-Isolation Mask Reg",
"Per-Bus FIR Error Injection Reg",
- "Per-Bus FIR Register Write Alias"
+ "Per-Bus FIR Register Write Alias",
+ "RX Clock Duty Cycle Adjust register"
};
// tx_mode_pl Register field name data value Description
diff --git a/src/usr/hwpf/hwp/bus_training/gcr_funcs.C b/src/usr/hwpf/hwp/bus_training/gcr_funcs.C
index 95e563a41..e02218179 100644
--- a/src/usr/hwpf/hwp/bus_training/gcr_funcs.C
+++ b/src/usr/hwpf/hwp/bus_training/gcr_funcs.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: gcr_funcs.C,v 1.10 2014/02/06 10:27:48 jaswamin Exp $
+// $Id: gcr_funcs.C,v 1.12 2014/03/10 16:29:43 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -35,58 +35,63 @@
// *! BACKUP NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
// *!
// *!***************************************************************************
-// CHANGE HISTORY:
+// CHANGE HISTORY:
//------------------------------------------------------------------------------
// Version:|Author: | Date: | Comment:
// --------|--------|--------|--------------------------------------------------
// 1.0 |varkeykv|01/19/12| Initial check in to solve hostboot linker
//------------------------------------------------------------------------------
-#include "gcr_funcs.H"
+#include <gcr_funcs.H>
+
using namespace fapi;
ReturnCode GCR_read(const Target& chip_target, io_interface_t interface,GCR_sub_registers target_io_reg, uint32_t group_address, uint32_t lane_address, ecmdDataBufferBase &databuf_16bit)
{
- ReturnCode rc;
- uint32_t rc_ecmd=0;
- ecmdDataBufferBase set_bits(16), clear_bits(16);
- rc_ecmd|=set_bits.flushTo0();
- rc_ecmd|=clear_bits.flushTo1();
+ ReturnCode rc;
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase set_bits(16), clear_bits(16);
+ rc_ecmd|=set_bits.flushTo0();
+ rc_ecmd|=clear_bits.flushTo1();
- if(rc_ecmd){
+ if(rc_ecmd)
+ {
FAPI_ERR("Unexpected error in buffer manipulation\n");
rc.setEcmdError(rc_ecmd);
- }
- else{
- rc=doGCRop(chip_target, interface, gcr_op_read, target_io_reg, group_address, lane_address, set_bits, clear_bits, databuf_16bit);
+ }
+ else
+ {
+ rc=doGCRop(chip_target, interface, gcr_op_read, target_io_reg, group_address, lane_address, set_bits, clear_bits, databuf_16bit);
if(!rc.ok())
{
FAPI_ERR("Unexpected error while performing GCR OP \n");
}
- }
+ }
- return rc;
+ return rc;
}
//------------------------------------------------------------------------------------------------------------------------------------
// GCR SCOM WRITE - main api for write - do not use doGCRop directly
//------------------------------------------------------------------------------------------------------------------------------------
ReturnCode GCR_write(const Target& chip_target, io_interface_t interface, GCR_sub_registers target_io_reg, uint32_t group_address, uint32_t lane_address, ecmdDataBufferBase set_bits, ecmdDataBufferBase clear_bits, int skipCheck,int bypass_rmw)
{
- ReturnCode rc;
- uint32_t rc_ecmd=0;
- ecmdDataBufferBase databuf_16bit(16);
- rc_ecmd|=databuf_16bit.flushTo0();
- skipCheck=1; //forcing this argument to one as this is redundant.
- if(rc_ecmd){
+ ReturnCode rc;
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase databuf_16bit(16);
+ rc_ecmd|=databuf_16bit.flushTo0();
+ skipCheck=1; // This is redundant -- forcing to 1
+ if(rc_ecmd)
+ {
FAPI_ERR("Unexpected error in buffer manipulation\n");
rc.setEcmdError(rc_ecmd);
- }
- else{
- rc=doGCRop(chip_target, interface, gcr_op_write, target_io_reg, group_address, lane_address, set_bits, clear_bits, databuf_16bit, skipCheck,bypass_rmw);
+ }
+ else
+ {
+ rc=doGCRop(chip_target, interface, gcr_op_write, target_io_reg, group_address, lane_address, set_bits, clear_bits, databuf_16bit, skipCheck,bypass_rmw);
if(!rc.ok())
{
FAPI_ERR("Unexpected error while performing GCR OP \n");
}
- }
- return rc;
+ }
+ return rc;
}
// UPPER LAYER FUNCTIONS
@@ -94,22 +99,23 @@ ReturnCode GCR_write(const Target& chip_target, io_interface_t interface, GCR_s
//------------------------------------------------------------------------------------------------------------------------------------
// generate the 64 bit scom address for the GCR
//------------------------------------------------------------------------------------------------------------------------------------
-uint64_t scom_address_64bit(uint32_t gcr_addr, uint64_t gcr_data) {
- uint32_t rc_ecmd=0;
- ecmdDataBufferBase reg_scom_address(64), temp(64);
- temp.flushTo0();
- temp.setDoubleWord(0,gcr_data);
+uint64_t scom_address_64bit(uint32_t gcr_addr, uint64_t gcr_data)
+{
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase reg_scom_address(64), temp(64);
+ temp.flushTo0();
+ temp.setDoubleWord(0,gcr_data);
- // 64 bit address
- rc_ecmd|= reg_scom_address.setWord(0,temp.getWord(0));
- rc_ecmd |= reg_scom_address.setWord(1,gcr_addr);
- rc_ecmd |= reg_scom_address.setBit(0);
+ // 64 bit address
+ rc_ecmd|= reg_scom_address.setWord(0,temp.getWord(0));
+ rc_ecmd |= reg_scom_address.setWord(1,gcr_addr);
+ rc_ecmd |= reg_scom_address.setBit(0);
- if(rc_ecmd)
- {
- FAPI_ERR("io_run_training: Unexpected failure in scom_address_64bit helper func");
- }
- return(reg_scom_address.getDoubleWord(0));
+ if(rc_ecmd)
+ {
+ FAPI_ERR("io_run_training: Unexpected failure in scom_address_64bit helper func");
+ }
+ return(reg_scom_address.getDoubleWord(0));
}
@@ -126,140 +132,147 @@ uint64_t scom_address_64bit(uint32_t gcr_addr, uint64_t gcr_data) {
/* gcr2 readvalid 39 1 # read data valid bit */
/*************************************************************************************************************************/
-ReturnCode doGCRop(const Target& chip_target, io_interface_t interface, gcr_op read_or_write, GCR_sub_registers target_io_reg, uint32_t group_address, uint32_t lane_address, ecmdDataBufferBase set_bits, ecmdDataBufferBase clear_bits, ecmdDataBufferBase &databuf_16bit, int skipCheck,int bypass_rmw) {
+ReturnCode doGCRop(const Target& chip_target,
+ io_interface_t interface,
+ gcr_op read_or_write,
+ GCR_sub_registers target_io_reg,
+ uint32_t group_address,
+ uint32_t lane_address,
+ ecmdDataBufferBase set_bits,
+ ecmdDataBufferBase clear_bits,
+ ecmdDataBufferBase &databuf_16bit,
+ int skipCheck,
+ int bypass_rmw)
+{
ReturnCode rc;
uint32_t rc_ecmd=0;
uint64_t scom_address64=0;
ecmdDataBufferBase getscom_data64(64), putscom_data64(64), local_data16(16);
- rc_ecmd |=getscom_data64.flushTo0();
- rc_ecmd |=putscom_data64.flushTo0();
- rc_ecmd |=local_data16.flushTo0();
+
+ do
+ {
+ rc_ecmd |=getscom_data64.flushTo0();
+ rc_ecmd |=putscom_data64.flushTo0();
+ rc_ecmd |=local_data16.flushTo0();
- // Generate the gcr2_register_data putscom data
- /* gcr2 reg_addr 12 9 # gcr ring (register) address (ext_addr) */
- // align the extended address to bit (12:20)
- rc_ecmd |= getscom_data64.insert( GCR_sub_reg_ext_addr[target_io_reg], 12, 9, 23 );
- FAPI_DBG("Register Extended address = %x\n",GCR_sub_reg_ext_addr[target_io_reg]);
+ // Generate the gcr2_register_data putscom data
+ /* gcr2 reg_addr 12 9 # gcr ring (register) address (ext_addr) */
+ // align the extended address to bit (12:20)
+ rc_ecmd |= getscom_data64.insert( GCR_sub_reg_ext_addr[target_io_reg], 12, 9, 23 );
+ FAPI_DBG("Register Extended address = %x\n",GCR_sub_reg_ext_addr[target_io_reg]);
- const char *temp;
- temp=GCR_sub_reg_names[target_io_reg];
- if(temp[0] == 'T' )
- {
- // This is a TX register/field need to set the TX bit
- rc_ecmd |= getscom_data64.setBit( 21 ); // does not include leading TX bit now since we are using only RX
- }
- /* gcr2 group 22 5 # does NOT include tx/rx as leading bit */
- // align the group address to bit (22:26)
- rc_ecmd |= getscom_data64.insert( group_address, 22, 5, 27); // does not include leading TX bit now since we are using only RX
+ const char *temp;
+ temp=GCR_sub_reg_names[target_io_reg];
+ if(temp[0] == 'T' )
+ {
+ // This is a TX register/field need to set the TX bit
+ rc_ecmd |= getscom_data64.setBit( 21 ); // does not include leading TX bit now since we are using only RX
+ }
+ /* gcr2 group 22 5 # does NOT include tx/rx as leading bit */
+ // align the group address to bit (22:26)
+ rc_ecmd |= getscom_data64.insert( group_address, 22, 5, 27); // does not include leading TX bit now since we are using only RX
- /* gcr2 lane 27 5 # lane address */
- // align the lane address to bit (27:31)
- rc_ecmd |= getscom_data64.insert( lane_address, 27, 5, 27 );
- if(rc_ecmd)
- {
- FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
- rc.setEcmdError(rc_ecmd);
- }
- else
- {
+ /* gcr2 lane 27 5 # lane address */
+ // align the lane address to bit (27:31)
+ rc_ecmd |= getscom_data64.insert( lane_address, 27, 5, 27 );
+ if(rc_ecmd)
+ {
+ FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+
FAPI_DBG("ei_reg_addr_GCR_scom[interface]=%x\n",ei_reg_addr_GCR_scom[interface]);
scom_address64 =scom_address_64bit(ei_reg_addr_GCR_scom[interface], getscom_data64.getDoubleWord(0));
- if(!bypass_rmw){
+ if(!bypass_rmw)
+ {
rc = fapiGetScom( chip_target, scom_address64, getscom_data64 );
}
- else{
- getscom_data64.flushTo0();
+ else
+ {
+ getscom_data64.flushTo0();
}
+
if(!rc.ok())
{
FAPI_ERR("IO gcr_funcs:GETSCOM error occurred ********\n");
- FAPI_ERR( "IO GCR FUNCS \tRead GCR %s, @ = %llX, Data = %08X%08X Failed group_address=%d\n",
- GCR_sub_reg_names[target_io_reg], scom_address64, getscom_data64.getWord(0), getscom_data64.getWord(1),group_address);
-
+ FAPI_ERR( "IO GCR FUNCS \tRead GCR %s, @ = %llX, Data = %08X%08X Failed group_address=%d\n",
+ GCR_sub_reg_names[target_io_reg], scom_address64, getscom_data64.getWord(0), getscom_data64.getWord(1),group_address);
+ break;
}
- else
- {
- FAPI_DBG( "\tRead GCR2 %s: GETSCOM 0x%llX %08X%08X \n",
- GCR_sub_reg_names[target_io_reg], scom_address64, getscom_data64.getWord(0), getscom_data64.getWord(1) );
- rc_ecmd|=getscom_data64.extract( local_data16, 48, 16 ); // return data on read ops -- for 54/52 onwards
+ FAPI_DBG( "\tRead GCR2 %s: GETSCOM 0x%llX %08X%08X \n",
+ GCR_sub_reg_names[target_io_reg], scom_address64, getscom_data64.getWord(0), getscom_data64.getWord(1) );
+ rc_ecmd|=getscom_data64.extract( local_data16, 48, 16 ); // return data on read ops -- for 54/52 onwards
- if(rc_ecmd)
- {
- FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
- rc.setEcmdError(rc_ecmd);
- }
- else
- {
- // register write operation
- if (read_or_write == gcr_op_read) {
- databuf_16bit = local_data16;
- }
- else
- { // write
- // write operation
- putscom_data64 = getscom_data64;
-
- // clear the desired bits first
- databuf_16bit = databuf_16bit & clear_bits;
+ if(rc_ecmd)
+ {
+ FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ // register write operation
+ if (read_or_write == gcr_op_read)
+ {
+ databuf_16bit = local_data16;
+ break;
+ }
+ // write operation
+ putscom_data64 = getscom_data64;
+
+ // clear the desired bits first
+ databuf_16bit = databuf_16bit & clear_bits;
- // now set desired bits
- databuf_16bit = databuf_16bit | set_bits;
-
- // data is now 64 bits and only last 16 bits are used 48:63 = 16bits # data
- rc_ecmd|=putscom_data64.insert( databuf_16bit, 48, 16); //-- for model 54/52 onwards
-
- if(rc_ecmd)
- {
- FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred");
- rc.setEcmdError(rc_ecmd);
- }
- else
- {
- FAPI_DBG( "\tWrite GCR2 %s: PUTSCOM 0x%llX 0x%08X%08X",
- GCR_sub_reg_names[target_io_reg], scom_address64, putscom_data64.getWord(0), putscom_data64.getWord(1) );
- rc = fapiPutScom( chip_target, scom_address64, putscom_data64);
- if(!rc.ok())
- {
- FAPI_ERR("IO gcr_funcs: PUTSCOM error occurred\n");
- }
- else
- {
- // check the write
- if(!skipCheck){
- rc = fapiGetScom( chip_target, scom_address64, getscom_data64 );
- }
- if(!rc.ok()){
- FAPI_ERR("IO gcr_funcs: GETSCOM error occurred\n");
- return(rc);
- }
- rc_ecmd=local_data16.insert(getscom_data64,0,16,48); //-- for 54/52 onwards
- if(rc_ecmd)
- {
- FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
- rc.setEcmdError(rc_ecmd);
- }
- else{
- if ( !skipCheck )
- { //add skipCheck for tx_err_inj since self resetting -- djd 2/11/11
- if ( local_data16 != databuf_16bit )
- {
- FAPI_ERR( "\t %s VALIDATE write failed: read=0x%04X write=%04X\n",
- GCR_sub_reg_names[target_io_reg], local_data16.getHalfWord(0), databuf_16bit.getHalfWord(0) );
- ecmdDataBufferBase &READ_BUF=local_data16;
- ecmdDataBufferBase &WRITE_BUF=databuf_16bit;
- FAPI_SET_HWP_ERROR(rc, IO_GCR_WRITE_MISMATCH_RC);
- }
- }
+ // now set desired bits
+ databuf_16bit = databuf_16bit | set_bits;
+
+ // data is now 64 bits and only last 16 bits are used 48:63 = 16bits # data
+ rc_ecmd|=putscom_data64.insert( databuf_16bit, 48, 16); //-- for model 54/52 onwards
+
+ if(rc_ecmd)
+ {
+ FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ FAPI_DBG( "\tWrite GCR2 %s: PUTSCOM 0x%llX 0x%08X%08X",
+ GCR_sub_reg_names[target_io_reg], scom_address64, putscom_data64.getWord(0), putscom_data64.getWord(1) );
+ rc = fapiPutScom( chip_target, scom_address64, putscom_data64);
+ if(!rc.ok())
+ {
+ FAPI_ERR("IO gcr_funcs: PUTSCOM error occurred\n");
+ break;
+ }
+ // check the write
+ if(!skipCheck)
+ {
+ rc = fapiGetScom( chip_target, scom_address64, getscom_data64 );
+ }
+ if(!rc.ok())
+ {
+ FAPI_ERR("IO gcr_funcs: GETSCOM error occurred\n");
+ break;
+ }
+ rc_ecmd=local_data16.insert(getscom_data64,0,16,48); //-- for 54/52 onwards
+ if(rc_ecmd)
+ {
+ FAPI_ERR("IO gcr_funcs: DataBuffer operation error occurred\n");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ if ( !skipCheck )
+ {
+ //add skipCheck for tx_err_inj since self resetting -- djd 2/11/11
+ if ( local_data16 != databuf_16bit )
+ {
+ FAPI_ERR( "\t %s VALIDATE write failed: read=0x%04X write=%04X\n",
+ GCR_sub_reg_names[target_io_reg], local_data16.getHalfWord(0), databuf_16bit.getHalfWord(0) );
+ ecmdDataBufferBase &READ_BUF=local_data16;
+ ecmdDataBufferBase &WRITE_BUF=databuf_16bit;
+ FAPI_SET_HWP_ERROR(rc, IO_GCR_WRITE_MISMATCH_RC);
+ }
+ }
- }
- }
-
- }
- }
- }
- }
- }
-
+ }while(0);
return(rc);
}
diff --git a/src/usr/hwpf/hwp/bus_training/gcr_funcs.H b/src/usr/hwpf/hwp/bus_training/gcr_funcs.H
index 52da6623f..16e6743c7 100644
--- a/src/usr/hwpf/hwp/bus_training/gcr_funcs.H
+++ b/src/usr/hwpf/hwp/bus_training/gcr_funcs.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* COPYRIGHT International Business Machines Corp. 2012,2014 */
/* */
/* p1 */
/* */
@@ -20,127 +20,130 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: gcr_funcs.H,v 1.19 2013/06/06 20:40:52 cswenson Exp $
-// *!***************************************************************************
-// *! (C) Copyright International Business Machines Corp. 1997, 1998
-// *! All Rights Reserved -- Property of IBM
-// *! *** IBM Confidential ***
-// *!***************************************************************************
-// *! FILENAME : gcr_funcs.H
-// *! TITLE :
-// *! DESCRIPTION :
-// *! CONTEXT :
-// *!
-// *! OWNER NAME : Varghese, Varkey Email: varkeykv@in.ibm.com
-// *! BACKUP NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
-// *!
-// *!***************************************************************************
-// CHANGE HISTORY:
-//------------------------------------------------------------------------------
-// Version:|Author: | Date: | Comment:
-// --------|--------|--------|--------------------------------------------------
-// 1.0 |jaswamin|09/13/11|
-// 2.0 |varkeykv|01/12/12| Post GFW review changes
-//------------------------------------------------------------------------------
-
-#ifndef GCR_FUNCS
-#define GCR_FUNCS
-
-/* Include some system headers */
-#include <list>
-#include <stdint.h>
-#include <fapi.H>
-using namespace fapi;
-
-#include "edi_regs.h"
-
-
-enum io_interface_t { CP_PSI,
- CP_FABRIC_X0,
- CP_FABRIC_A0,
- CP_IOMC0_P0,
- CP_IOMC1_P0,
- S1_FABRIC_SX0,
- S1_FABRIC_SA0,
- CEN_DMI,
- };
-
-// P8 chip interfaces
-const uint32_t NUM_INTERFACES=21;
-const char * const io_interface_name[NUM_INTERFACES] = { "CP_PSI",
- "CP_FABRIC_X0",
- "CP_FABRIC_A0",
- "CP_IOMC0_P0",
- "CP_IOMC1_P0",
- "S1_FABRIC_SX0",
- "S1_FABRIC_SA0",
- "CEN_DMI" };
-// EDI register addresses for CP
-const uint32_t ei_reg_addr_GCR_scom[NUM_INTERFACES] = { 0x00000000,
- 0x0401103F,
- 0x08010c3f,
- 0x02011a3F,
- 0x02011e3F,
- 0x03010c3f,
- 0x08010c3f,
- 0x0201043F };
-const uint32_t ei_reg_addr_Mode_scom[NUM_INTERFACES]= { 0x00000000,
- 0x04011020,
- 0x08010c20,
- 0x02011a20,
- 0x02011e20,
- 0x03010c20,
- 0x08010c20,
- 0x02010420 };
-
-
-// Register type
-typedef enum { tx_per_lane, tx_per_group, tx_per_pack, tx_per_bus, rx_per_lane, rx_per_group, rx_per_pack, rx_per_bus, num_register_type } register_type;
-
-typedef enum { gcr_op_read, gcr_op_write } gcr_op;
-
-
-// Lane Bit Defintions
-// 0x00 (lane 0), 0x01 (lane 1) , etc
-const uint8_t SELECT_ALL_LANES=0x1F; // The lane address is a 5 bit value 0b 11111 selects all lanes
-
-// Group Bit Definitions 0x00 group 0 , 0x01 group1 , etc
-const uint8_t RX_GROUP_BROADCAST =0x0F ; // (Write Only) The group address is a 6 bit value to select all groups ,
-const uint8_t TX_GROUP_BROADCAST =0x2F ; // (Write Only) The group address is a 6 bit value to select all groups ,
-
-// ROUTINES
-//------------------------------------------------------------------------------------------------------------------------------------
-// generate the 64 bit scom address for the GCR
-//------------------------------------------------------------------------------------------------------------------------------------
-uint64_t scom_address_64bit(uint32_t gcr_addr, uint64_t gcr_data );
-
-//------------------------------------------------------------------------------------------------------------------------------------
-// handle GCR operations - do not use directly!
-// use GCR_read and GCR_write for reg access - not this function!!!!
-//------------------------------------------------------------------------------------------------------------------------------------
-ReturnCode doGCRop(const Target& chip_target, io_interface_t interface,
- gcr_op read_or_write, GCR_sub_registers target_io_reg,
- uint32_t group_address, uint32_t lane_address,
- ecmdDataBufferBase set_bits, ecmdDataBufferBase clear_bits,
- ecmdDataBufferBase &databuf_16bit, int skipCheck=0,int bypass_rmw=0);
-
-//------------------------------------------------------------------------------------------------------------------------------------
-// GCR SCOM READ - main api for read - do not use doGCRop directly
-//------------------------------------------------------------------------------------------------------------------------------------
-ReturnCode GCR_read(const Target& chip_target, io_interface_t interface,
- GCR_sub_registers target_io_reg, uint32_t group_address,
- uint32_t lane_address, ecmdDataBufferBase &databuf_16bit);
-
-//------------------------------------------------------------------------------------------------------------------------------------
-// GCR SCOM WRITE - main api for write - do not use doGCRop directly
-//------------------------------------------------------------------------------------------------------------------------------------
-ReturnCode GCR_write(const Target& chip_target, io_interface_t interface,
- GCR_sub_registers target_io_reg, uint32_t group_address,
- uint32_t lane_address, ecmdDataBufferBase set_bits,
- ecmdDataBufferBase clear_bits, int skipCheck=0,int bypass_rmw=0);
-
-
-
-
-#endif
-
+// $Id: gcr_funcs.H,v 1.22 2014/03/07 13:13:29 varkeykv Exp $
+// *!***************************************************************************
+// *! (C) Copyright International Business Machines Corp. 1997, 1998
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *!***************************************************************************
+// *! FILENAME : gcr_funcs.H
+// *! TITLE :
+// *! DESCRIPTION :
+// *! CONTEXT :
+// *!
+// *! OWNER NAME : Varghese, Varkey Email: varkeykv@in.ibm.com
+// *! BACKUP NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
+// *!
+// *!***************************************************************************
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:|Author: | Date: | Comment:
+// --------|--------|--------|--------------------------------------------------
+// 1.0 |jaswamin|09/13/11|
+// 2.0 |varkeykv|01/12/12| Post GFW review changes
+//------------------------------------------------------------------------------
+
+#ifndef GCR_FUNCS
+#define GCR_FUNCS
+
+/* Include some system headers */
+#include <list>
+#include <stdint.h>
+#include <fapi.H>
+using namespace fapi;
+
+#include "edi_regs.h"
+
+
+enum io_interface_t { CP_PSI,
+ CP_FABRIC_X0,
+ CP_FABRIC_A0,
+ CP_IOMC0_P0,
+ CP_IOMC1_P0,
+ S1_FABRIC_SX0,
+ S1_FABRIC_SA0,
+ CEN_DMI,
+ };
+
+// P8 chip interfaces
+const uint32_t NUM_INTERFACES=21;
+const char * const io_interface_name[NUM_INTERFACES] = { "CP_PSI",
+ "CP_FABRIC_X0",
+ "CP_FABRIC_A0",
+ "CP_IOMC0_P0",
+ "CP_IOMC1_P0",
+ "S1_FABRIC_SX0",
+ "S1_FABRIC_SA0",
+ "CEN_DMI" };
+// EDI register addresses for CP
+const uint32_t ei_reg_addr_GCR_scom[NUM_INTERFACES] = { 0x00000000,
+ 0x0401103F,
+ 0x08010c3f,
+ 0x02011a3F,
+ 0x02011e3F,
+ 0x03010c3f,
+ 0x08010c3f,
+ 0x0201043F };
+const uint32_t ei_reg_addr_Mode_scom[NUM_INTERFACES]= { 0x00000000,
+ 0x04011020,
+ 0x08010c20,
+ 0x02011a20,
+ 0x02011e20,
+ 0x03010c20,
+ 0x08010c20,
+ 0x02010420 };
+
+
+// Register type
+typedef enum { tx_per_lane, tx_per_group, tx_per_pack, tx_per_bus, rx_per_lane, rx_per_group, rx_per_pack, rx_per_bus, num_register_type } register_type;
+
+typedef enum { gcr_op_read, gcr_op_write } gcr_op;
+
+ const uint32_t num_rxlanes_per_group[NUM_INTERFACES] ={1,20,24,24,24,20,24,18 };
+const uint32_t num_txlanes_per_group[NUM_INTERFACES] ={1,20,24,17,17,20,24,24 };
+const uint32_t num_groups_per_bus[NUM_INTERFACES] = { 1,4,1,1,1,4,1,1};
+
+// Lane Bit Defintions
+// 0x00 (lane 0), 0x01 (lane 1) , etc
+const uint8_t SELECT_ALL_LANES=0x1F; // The lane address is a 5 bit value 0b 11111 selects all lanes
+
+// Group Bit Definitions 0x00 group 0 , 0x01 group1 , etc
+const uint8_t RX_GROUP_BROADCAST =0x0F ; // (Write Only) The group address is a 6 bit value to select all groups ,
+const uint8_t TX_GROUP_BROADCAST =0x2F ; // (Write Only) The group address is a 6 bit value to select all groups ,
+
+// ROUTINES
+//------------------------------------------------------------------------------------------------------------------------------------
+// generate the 64 bit scom address for the GCR
+//------------------------------------------------------------------------------------------------------------------------------------
+uint64_t scom_address_64bit(uint32_t gcr_addr, uint64_t gcr_data );
+
+//------------------------------------------------------------------------------------------------------------------------------------
+// handle GCR operations - do not use directly!
+// use GCR_read and GCR_write for reg access - not this function!!!!
+//------------------------------------------------------------------------------------------------------------------------------------
+ReturnCode doGCRop(const Target& chip_target, io_interface_t interface,
+ gcr_op read_or_write, GCR_sub_registers target_io_reg,
+ uint32_t group_address, uint32_t lane_address,
+ ecmdDataBufferBase set_bits, ecmdDataBufferBase clear_bits,
+ ecmdDataBufferBase &databuf_16bit, int skipCheck=0,int bypass_rmw=0);
+
+//------------------------------------------------------------------------------------------------------------------------------------
+// GCR SCOM READ - main api for read - do not use doGCRop directly
+//------------------------------------------------------------------------------------------------------------------------------------
+ReturnCode GCR_read(const Target& chip_target, io_interface_t interface,
+ GCR_sub_registers target_io_reg, uint32_t group_address,
+ uint32_t lane_address, ecmdDataBufferBase &databuf_16bit);
+
+//------------------------------------------------------------------------------------------------------------------------------------
+// GCR SCOM WRITE - main api for write - do not use doGCRop directly
+//------------------------------------------------------------------------------------------------------------------------------------
+ReturnCode GCR_write(const Target& chip_target, io_interface_t interface,
+ GCR_sub_registers target_io_reg, uint32_t group_address,
+ uint32_t lane_address, ecmdDataBufferBase set_bits,
+ ecmdDataBufferBase clear_bits, int skipCheck=0,int bypass_rmw=0);
+
+
+
+
+#endif
+
diff --git a/src/usr/hwpf/hwp/bus_training/gcr_funcs_errors.xml b/src/usr/hwpf/hwp/bus_training/gcr_funcs_errors.xml
new file mode 100644
index 000000000..bc5206236
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/gcr_funcs_errors.xml
@@ -0,0 +1,39 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/gcr_funcs_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: gcr_funcs_errors.xml,v 1.2 2014/03/18 14:56:22 jgrell Exp $ -->
+
+<!-- Error definitions for gcr_func HWPS -->
+<hwpErrors>
+<!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_GCR_WRITE_MISMATCH_RC</rc>
+ <description>IO GCR write operation failed to readback data that was written</description>
+ <ffdc>READ_BUF</ffdc>
+ <ffdc>WRITE_BUF</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
+
diff --git a/src/usr/hwpf/hwp/bus_training/io_cleanup.C b/src/usr/hwpf/hwp/bus_training/io_cleanup.C
index 14e5f0d76..b8a6a2b64 100644
--- a/src/usr/hwpf/hwp/bus_training/io_cleanup.C
+++ b/src/usr/hwpf/hwp/bus_training/io_cleanup.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,308 +20,294 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_cleanup.C,v 1.3 2013/12/12 08:41:30 varkeykv Exp $
-// *!***************************************************************************
-// *! (C) Copyright International Business Machines Corp. 1997, 1998
-// *! All Rights Reserved -- Property of IBM
-// *! *** IBM Confidential ***
-// *!***************************************************************************
-// *! FILENAME : io_cleanup.C
-// *! TITLE :
-// *! DESCRIPTION : Cleanup procedure for re-init loop
-// *! CONTEXT :
-// *!
-// *! OWNER NAME : Varghese, Varkey Email: varkey.kv@in.ibm.com
-// *! BACKUP NAME : Janani Swaminathan Email: jaswamin@in.ibm.com
-// *!
-// *!***************************************************************************
-// CHANGE HISTORY:
-//------------------------------------------------------------------------------
-// Version:|Author: | Date: | Comment:
-// --------|--------|--------|--------------------------------------------------
-// 1.0 |varkeykv|07/30/11|Initial check in .
-//------------------------------------------------------------------------------
-#include <fapi.H>
-#include "io_cleanup.H"
-#include "gcr_funcs.H"
-
-
-
-extern "C" {
- using namespace fapi;
-// For clearing the FIR mask , used by io run training
-// As per Irving , it should be ok to clear all FIRs here since we will scom init , also we dont touch mask values
-ReturnCode clear_fir_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
- ReturnCode rc;
- ecmdDataBufferBase data(64);
- FAPI_INF("io_cleanup:In the Clear FIR RW register function ");
-
- // use FIR AND mask register to un-mask selected bits
- rc = fapiPutScom(i_target, fir_rw_reg_addr[i_chip_interface], data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing FIR mask register (=%08X)!",
- fir_rw_reg_addr[i_chip_interface]);
- }
- return(rc);
-}
-
-/*
- from Megan's ipl1.sh
-
- istep -s0..11
-## forcing channel fail
-getscom pu 02011C4A -pall -call -vs1
- getscom cen 0201080A -pall -call -vs1
- putscom pu 02011C4A 8000000480400000 -pall -call
- putscom cen 0201080A 8000000000000000 -pall -call
- getscom pu 02011C4A -pall -call -vs1
- getscom cen 0201080A -pall -call -vs1
-## masking fir bit
-putscom pu.mcs 2011843 FFFFFFFFFFFFFFFF -all
-### IO reset
-iotk put rx_fence=1 -t=p8:bmcs
-iotk put rx_fence=1 -t=cn
-iotk put ioreset_hard_bus0=111111 -t=p8:bmcs
-iotk put ioreset_hard_bus0=111111 -t=cn
-
-#exit
-##clear_fir
-./clear_fir.pl
-### Reload
-istep proc_dmi_scominit
-istep dmi_scominit
-##checking Zcal
-iotk get tx_zcal_p_4x -t=p8:bmcs
-iotk get tx_zcal_p_4x -t=cn
-iotk get tx_zcal_sm_min_val -t=p8:bmcs
-iotk get tx_zcal_sm_min_val -t=cn
-iotk get tx_zcal_sm_max_val -t=p8:bmcs
-iotk get tx_zcal_sm_max_val -t=cn
-### Loading Zcal
-iotk put tx_zcal_p_4x=00100
-iotk put tx_zcal_sm_min_val=0010101
-iotk put tx_zcal_sm_max_val=1000110
-## Runing Zcal
-istep dmi_io_dccal
-## forcing channel fail
- getscom pu 02011C4A -pall -call -vs1
- getscom cen 0201080A -pall -call -vs1
- putscom pu 02011C4A 8000000480400000 -pall -call
- putscom cen 0201080A 8000000000000000 -pall -call
- getscom pu 02011C4A -pall -call -vs1
- getscom cen 0201080A -pall -call -vs1
-
-
-
-
-
-*/
-
-ReturnCode do_cleanup(const Target &master_target,io_interface_t master_interface,uint32_t master_group,const Target &slave_target,io_interface_t slave_interface,uint32_t slave_group)
-{
- ReturnCode rc;
- uint32_t rc_ecmd = 0;
- uint8_t chip_unit = 0;
- // uint8_t link_fir_unmask_data = 0x8F;
- ecmdDataBufferBase data(64);
- ecmdDataBufferBase reg_data(16),set_bits(16),clear_bits(16),temp_bits(16);
-
- //iotk put rx_fence=1 -t=p8:bmcs
- // No other field in this reg , so no need for RMW
- rc_ecmd = temp_bits.setBit(0);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc=GCR_write(master_target, master_interface, rx_fence_pg, master_group,0, temp_bits, temp_bits,1,1);
- if(rc) return rc;
-
- //iotk put rx_fence=1 -t=cn
- rc=GCR_write(slave_target, slave_interface, rx_fence_pg, slave_group,0, temp_bits, temp_bits,1,1);
- if(rc) return rc;
-
- rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
- &master_target,
- chip_unit);
- if (!rc.ok())
- {
- FAPI_ERR("Error retreiving MCS chiplet number!");
- return rc;
- }
-
- // swizzle to DMI number
- if (master_interface == CP_IOMC0_P0)
- {
- chip_unit = 3-(chip_unit % 4);
- // swap 0 and 1 due to Clock group swap in layout
- if(chip_unit==1){
- chip_unit=0;
- }
- else if(chip_unit==0){
- chip_unit=1;
- }
-
-
- FAPI_DBG("CHIP UNIT IS %d",chip_unit);
-
- }
- rc = fapiGetScom(master_target, scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0], data);
- if (!rc.ok())
- {
- FAPI_ERR("Error Reading SCOM mode PB register for ioreset_hard_bus0 on master side(=%08X)!",
- scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0]);
- return rc;
- }
-
- rc_ecmd = data.setBit(2+chip_unit,1); // Scom_mode_pb ,ioreset starts at bit 2
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- FAPI_DBG("Writing the Hard reset on PU ");
- // use FIR AND mask register to un-mask selected bits
- rc = fapiPutScom(master_target, scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0], data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing SCOM mode PB register for ioreset_hard_bus0 on master side(=%08X)!",
- scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0]);
- return rc;
- }
-
- rc_ecmd = data.flushTo0();
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- // Centaur is always bus0 in reset register
- if(slave_interface == CEN_DMI){
- chip_unit=0;
- }
- rc = fapiGetScom(slave_target, scom_mode_pb_reg_addr[FIR_CEN_DMI], data);
- if (!rc.ok())
- {
- FAPI_ERR("Error Reading SCOM mode PB register for ioreset_hard_bus0 on Slave side(=%08X)!",
- scom_mode_pb_reg_addr[FIR_CEN_DMI]);
- return rc;
- }
- rc_ecmd = data.setBit(2+chip_unit,1); // Scom_mode_pb ,ioreset starts at bit 2
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- // use FIR AND mask register to un-mask selected bits
- rc = fapiPutScom(slave_target, scom_mode_pb_reg_addr[FIR_CEN_DMI], data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing SCOM mode PB register for ioreset_hard_bus0 on Slave side(=%08X)!",
- scom_mode_pb_reg_addr[FIR_CEN_DMI]);
- return rc;
- }
-
-
- // NOW We clear FIRS.. need to see if we need to do this or some other procedure will do this . Bellows/Irving to respond
-
- rc = clear_fir_reg(slave_target,FIR_CEN_DMI);
- if(rc)
- {
- return(rc);
- }
- rc = clear_fir_reg(master_target,FIR_CP_IOMC0_P0);
- if(rc)
- {
- return(rc);
- }
- return rc;
-}
-
-// Determines if target is a master...
-static ReturnCode isChipMaster(const Target& chip_target, io_interface_t chip_interface,uint32_t current_group, bool & masterchip_found ) {
- ReturnCode rc;
- ecmdDataBufferBase mode_data(16);
- masterchip_found=false;
-
- // Check if rx_master_mode bit is set for chip
- // Read rx_master_mode for chip
- if(chip_interface==CP_FABRIC_X0)
- {
- rc=GCR_read(chip_target , chip_interface, ei4_rx_mode_pg, current_group,0, mode_data);
- }
- else
- {
- rc=GCR_read(chip_target , chip_interface, rx_mode_pg, current_group,0, mode_data);
- }
- if (rc) {
- FAPI_ERR("io_cleanup: Error reading master mode bit\n");
- }
- else
- {
- // Check if chip is master
- if (mode_data.isBitSet(0)) {
- FAPI_DBG("This chip is a master\n");
- masterchip_found =true;
- }
- }
- return(rc);
-}
-
-
-// Cleans up for Centaur Reconfig or Abus hot plug case
-ReturnCode io_cleanup(const Target &master_target,const Target &slave_target){
- ReturnCode rc;
- io_interface_t master_interface,slave_interface;
- uint32_t master_group=0;
- uint32_t slave_group=0;
- // const uint32_t max_group=4; // Num of X bus groups in one bus
-
- bool is_master=false;
-
-
- // This is a DMI/MC bus
- if( (master_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )&& (slave_target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP)){
- FAPI_DBG("This is a DMI bus using base DMI scom address");
- master_interface=CP_IOMC0_P0; // base scom for MC bus
- slave_interface=CEN_DMI; // Centaur scom base
- master_group=3; // Design requires us to do this as per scom map and layout
- slave_group=0;
- rc=isChipMaster(master_target,master_interface,master_group,is_master);
- if(rc.ok()){
- if(!is_master)
- {
- FAPI_DBG("DMI Bus ..target swap performed");
- rc=do_cleanup(slave_target,slave_interface,slave_group,master_target,master_interface,master_group);
- if(rc) return rc;
- }
- else
- {
- rc=do_cleanup(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
- if(rc) return rc;
- }
- }
- }
- //This is an A Bus
- else if( (master_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT )&& (slave_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)){
- FAPI_DBG("This is an A Bus training invocation");
- master_interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
- slave_interface=CP_FABRIC_A0; //base scom for A bus
- master_group=0; // Design requires us to do this as per scom map and layout
- slave_group=0;
- rc=isChipMaster(master_target,master_interface,master_group,is_master);
- if(rc.ok()){
- // Now only for DMI
- }
- }
- else{
- FAPI_ERR("Invalid io_cleanup HWP invocation . Pair of targets dont belong to DMI or A bus instances");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
- }
- return rc;
-}
-
-
-
-} // extern
+// $Id: io_cleanup.C,v 1.5 2014/03/13 16:01:03 varkeykv Exp $
+// *!***************************************************************************
+// *! (C) Copyright International Business Machines Corp. 1997, 1998
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *!***************************************************************************
+// *! FILENAME : io_cleanup.C
+// *! TITLE :
+// *! DESCRIPTION : Cleanup procedure for re-init loop
+// *! CONTEXT :
+// *!
+// *! OWNER NAME : Varghese, Varkey Email: varkey.kv@in.ibm.com
+// *! BACKUP NAME : Janani Swaminathan Email: jaswamin@in.ibm.com
+// *!
+// *!***************************************************************************
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:|Author: | Date: | Comment:
+// --------|--------|--------|--------------------------------------------------
+// 1.0 |varkeykv|07/30/11|Initial check in .
+//------------------------------------------------------------------------------
+#include <fapi.H>
+#include "io_cleanup.H"
+#include "gcr_funcs.H"
+
+
+
+extern "C" {
+ using namespace fapi;
+// For clearing the FIR mask , used by io run training
+// As per Irving , it should be ok to clear all FIRs here since we will scom init , also we dont touch mask values
+ReturnCode clear_fir_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
+ ReturnCode rc;
+ ecmdDataBufferBase data(64);
+ FAPI_INF("io_cleanup:In the Clear FIR RW register function ");
+
+ // use FIR AND mask register to un-mask selected bits
+ rc = fapiPutScom(i_target, fir_rw_reg_addr[i_chip_interface], data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing FIR mask register (=%08X)!",
+ fir_rw_reg_addr[i_chip_interface]);
+ }
+ return(rc);
+}
+
+/*
+ from Megan's ipl1.sh
+
+ istep -s0..11
+## forcing channel fail
+getscom pu 02011C4A -pall -call -vs1
+ getscom cen 0201080A -pall -call -vs1
+ putscom pu 02011C4A 8000000480400000 -pall -call
+ putscom cen 0201080A 8000000000000000 -pall -call
+ getscom pu 02011C4A -pall -call -vs1
+ getscom cen 0201080A -pall -call -vs1
+## masking fir bit
+putscom pu.mcs 2011843 FFFFFFFFFFFFFFFF -all
+### IO reset
+iotk put rx_fence=1 -t=p8:bmcs
+iotk put rx_fence=1 -t=cn
+iotk put ioreset_hard_bus0=111111 -t=p8:bmcs
+iotk put ioreset_hard_bus0=111111 -t=cn
+
+#exit
+##clear_fir
+./clear_fir.pl
+### Reload
+istep proc_dmi_scominit
+istep dmi_scominit
+##checking Zcal
+iotk get tx_zcal_p_4x -t=p8:bmcs
+iotk get tx_zcal_p_4x -t=cn
+iotk get tx_zcal_sm_min_val -t=p8:bmcs
+iotk get tx_zcal_sm_min_val -t=cn
+iotk get tx_zcal_sm_max_val -t=p8:bmcs
+iotk get tx_zcal_sm_max_val -t=cn
+### Loading Zcal
+iotk put tx_zcal_p_4x=00100
+iotk put tx_zcal_sm_min_val=0010101
+iotk put tx_zcal_sm_max_val=1000110
+## Runing Zcal
+istep dmi_io_dccal
+## forcing channel fail
+ getscom pu 02011C4A -pall -call -vs1
+ getscom cen 0201080A -pall -call -vs1
+ putscom pu 02011C4A 8000000480400000 -pall -call
+ putscom cen 0201080A 8000000000000000 -pall -call
+ getscom pu 02011C4A -pall -call -vs1
+ getscom cen 0201080A -pall -call -vs1
+*/
+
+ReturnCode do_cleanup(const Target &master_target,io_interface_t master_interface,uint32_t master_group,const Target &slave_target,io_interface_t slave_interface,uint32_t slave_group)
+{
+ ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ uint8_t chip_unit = 0;
+ ecmdDataBufferBase data(64);
+ ecmdDataBufferBase reg_data(16),set_bits(16),clear_bits(16),temp_bits(16);
+
+ //iotk put rx_fence=1 -t=p8:bmcs
+ // No other field in this reg , so no need for RMW
+ rc_ecmd = temp_bits.setBit(0);
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ rc=GCR_write(master_target, master_interface, rx_fence_pg, master_group,0, temp_bits, temp_bits,1,1);
+ if(rc) return rc;
+
+ //iotk put rx_fence=1 -t=cn
+ rc=GCR_write(slave_target, slave_interface, rx_fence_pg, slave_group,0, temp_bits, temp_bits,1,1);
+ if(rc) return rc;
+
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &master_target,
+ chip_unit);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error retreiving MCS chiplet number!");
+ return rc;
+ }
+
+ // swizzle to DMI number
+ if (master_interface == CP_IOMC0_P0)
+ {
+ chip_unit = 3-(chip_unit % 4);
+ // swap 0 and 1 due to Clock group swap in layout
+ if(chip_unit==1){
+ chip_unit=0;
+ }
+ else if(chip_unit==0){
+ chip_unit=1;
+ }
+
+
+ FAPI_DBG("CHIP UNIT IS %d",chip_unit);
+
+ }
+ rc = fapiGetScom(master_target, scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0], data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error Reading SCOM mode PB register for ioreset_hard_bus0 on master side(=%08X)!",
+ scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0]);
+ return rc;
+ }
+
+ rc_ecmd = data.setBit(2+chip_unit,1); // Scom_mode_pb ,ioreset starts at bit 2
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ FAPI_DBG("Writing the Hard reset on PU ");
+ // use FIR AND mask register to un-mask selected bits
+ rc = fapiPutScom(master_target, scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0], data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing SCOM mode PB register for ioreset_hard_bus0 on master side(=%08X)!",
+ scom_mode_pb_reg_addr[FIR_CP_IOMC0_P0]);
+ return rc;
+ }
+
+ rc_ecmd = data.flushTo0();
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ // Centaur is always bus0 in reset register
+ if(slave_interface == CEN_DMI){
+ chip_unit=0;
+ }
+ rc = fapiGetScom(slave_target, scom_mode_pb_reg_addr[FIR_CEN_DMI], data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error Reading SCOM mode PB register for ioreset_hard_bus0 on Slave side(=%08X)!",
+ scom_mode_pb_reg_addr[FIR_CEN_DMI]);
+ return rc;
+ }
+ rc_ecmd = data.setBit(2+chip_unit,1); // Scom_mode_pb ,ioreset starts at bit 2
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ // use FIR AND mask register to un-mask selected bits
+ rc = fapiPutScom(slave_target, scom_mode_pb_reg_addr[FIR_CEN_DMI], data);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing SCOM mode PB register for ioreset_hard_bus0 on Slave side(=%08X)!",
+ scom_mode_pb_reg_addr[FIR_CEN_DMI]);
+ return rc;
+ }
+
+
+ // NOW We clear FIRS.. need to see if we need to do this or some other procedure will do this . Bellows/Irving to respond
+
+ rc = clear_fir_reg(slave_target,FIR_CEN_DMI);
+ if(rc)
+ {
+ return(rc);
+ }
+ rc = clear_fir_reg(master_target,FIR_CP_IOMC0_P0);
+ if(rc)
+ {
+ return(rc);
+ }
+ return rc;
+}
+
+// Determines if target is a master...
+static ReturnCode isChipMaster(const Target& chip_target, io_interface_t chip_interface,uint32_t current_group, bool & masterchip_found ) {
+ ReturnCode rc;
+ ecmdDataBufferBase mode_data(16);
+ masterchip_found=false;
+
+ // Check if rx_master_mode bit is set for chip
+ // Read rx_master_mode for chip
+ if(chip_interface==CP_FABRIC_X0)
+ {
+ rc=GCR_read(chip_target , chip_interface, ei4_rx_mode_pg, current_group,0, mode_data);
+ }
+ else
+ {
+ rc=GCR_read(chip_target , chip_interface, rx_mode_pg, current_group,0, mode_data);
+ }
+ if (rc) {
+ FAPI_ERR("io_cleanup: Error reading master mode bit\n");
+ }
+ else
+ {
+ // Check if chip is master
+ if (mode_data.isBitSet(0)) {
+ FAPI_DBG("This chip is a master\n");
+ masterchip_found =true;
+ }
+ }
+ return(rc);
+}
+
+
+// Cleans up for Centaur Reconfig or Abus hot plug case
+ReturnCode io_cleanup(const Target &master_target,const Target &slave_target){
+ ReturnCode rc;
+ io_interface_t master_interface,slave_interface;
+ uint32_t master_group=0;
+ uint32_t slave_group=0;
+ bool is_master=false;
+
+
+ // This is a DMI/MC bus
+ if( (master_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )&& (slave_target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP)){
+ FAPI_DBG("This is a DMI bus using base DMI scom address");
+ master_interface=CP_IOMC0_P0; // base scom for MC bus
+ slave_interface=CEN_DMI; // Centaur scom base
+ master_group=3; // Design requires us to do this as per scom map and layout
+ slave_group=0;
+ rc=isChipMaster(master_target,master_interface,master_group,is_master);
+ if(rc.ok()){
+ if(!is_master)
+ {
+ FAPI_DBG("DMI Bus ..target swap performed");
+ rc=do_cleanup(slave_target,slave_interface,slave_group,master_target,master_interface,master_group);
+ if(rc) return rc;
+ }
+ else
+ {
+ rc=do_cleanup(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
+ if(rc) return rc;
+ }
+ }
+ }
+ //This is an A Bus
+ else if( (master_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT )&& (slave_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)){
+ // This procedure only supports DMI for now
+ }
+ else{
+ const Target &MASTER_TARGET = master_target;
+ const Target &SLAVE_TARGET = slave_target;
+ FAPI_ERR("Invalid io_cleanup HWP invocation . Pair of targets dont belong to DMI or A bus instances");
+ FAPI_SET_HWP_ERROR(rc, IO_CLEANUP_INVALID_INVOCATION_RC);
+ }
+ return rc;
+}
+
+
+
+} // extern
diff --git a/src/usr/hwpf/hwp/bus_training/io_cleanup.H b/src/usr/hwpf/hwp/bus_training/io_cleanup.H
index 3368d20a2..713e25fda 100644
--- a/src/usr/hwpf/hwp/bus_training/io_cleanup.H
+++ b/src/usr/hwpf/hwp/bus_training/io_cleanup.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,7 +20,8 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-//$Id: io_cleanup.H,v 1.1 2013/07/30 12:00:50 varkeykv Exp $
+
+//$Id: io_cleanup.H,v 1.2 2013/12/10 09:22:24 varkeykv Exp $
#ifndef IO_CLEANUP_H_
#define IO_CLEANUP_H_
diff --git a/src/usr/hwpf/hwp/bus_training/io_cleanup_errors.xml b/src/usr/hwpf/hwp/bus_training/io_cleanup_errors.xml
new file mode 100755
index 000000000..9899996d1
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_cleanup_errors.xml
@@ -0,0 +1,35 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_cleanup_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_cleanup_errors.xml,v 1.3 2014/03/19 18:05:51 smcprek Exp $ -->
+<hwpErrors>
+ <hwpError>
+ <rc>IO_CLEANUP_INVALID_INVOCATION_RC</rc>
+ <description>io run training invoked with wrong pair of targets</description>
+ <ffdc>MASTER_TARGET</ffdc>
+ <ffdc>SLAVE_TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_clear_firs.C b/src/usr/hwpf/hwp/bus_training/io_clear_firs.C
index f4d9771fb..b7f4205e2 100644
--- a/src/usr/hwpf/hwp/bus_training/io_clear_firs.C
+++ b/src/usr/hwpf/hwp/bus_training/io_clear_firs.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_clear_firs.C,v 1.14 2013/06/20 13:29:37 jmcgill Exp $
+// $Id: io_clear_firs.C,v 1.16 2014/03/20 16:15:49 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 2012, 2013
// *! All Rights Reserved -- Property of IBM
@@ -151,6 +151,7 @@ ReturnCode io_clear_firs(const fapi::Target &i_target){
io_interface_t gcr_interface; // requires different base address for gcr scoms
uint32_t group=0;
uint32_t max_group=1;
+ const fapi::Target &ENDPOINT=i_target;
//on dmi
if( (i_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )){
diff --git a/src/usr/hwpf/hwp/bus_training/io_dccal.C b/src/usr/hwpf/hwp/bus_training/io_dccal.C
index 63fd6526d..d9d662193 100644
--- a/src/usr/hwpf/hwp/bus_training/io_dccal.C
+++ b/src/usr/hwpf/hwp/bus_training/io_dccal.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_dccal.C,v 1.31 2014/02/17 07:07:39 jaswamin Exp $
+// $Id: io_dccal.C,v 1.35 2014/03/20 08:37:35 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -115,26 +115,64 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
ecmdDataBufferBase rx_wt_timeout_sel_buf(16),rx_pdwn_lite_value_buf(16),rx_eo_latch_offset_done_buf(16),rx_wt_cu_pll_pgooddly_buf(16),rx_wt_cu_pll_pgooddly_buf_copy(16);
ecmdDataBufferBase set_bits(16);
ecmdDataBufferBase clear_bits(16);
+ const fapi::Target &TARGET=target;
//char printStr[200];
FAPI_DBG("In the Dccal procedure");
+ uint8_t ddlevel;
+
+ rc = FAPI_ATTR_GET(ATTR_CHIP_EC_FEATURE_MCD_HANG_RECOVERY_BUG, &target,ddlevel);
+ if(rc)
+ {
+ FAPI_ERR("IO_DCCAL :Error Reading DDLEVEL using MCD_HANG_RECOVERY attribute");
+ return rc;
+ }
+
+
+
+ FAPI_DBG("DDLevel FLAG is read as %d",ddlevel);
+
io_interface_t chip_interface=master_interface;//first we run on master chip
uint32_t group=master_group;
const Target *target_ptr=&target; // Assuming I am allowed to do this .
- rc=GCR_read(*target_ptr,master_interface,rx_training_status_pg ,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
+ rc=GCR_read(*target_ptr,master_interface,rx_training_status_pg ,group,0,data_buffer);
+ if (rc)
+ {
+ // have to add support for field parsing
+ FAPI_ERR("IO_DCCAL : GCR_read error for rx_training_status_pg");
+ return rc;
+ }
FAPI_DBG("IO_DCCAL : Starting Offset Calibration on interface %d group %d",chip_interface,group);
// read and save rx_pdwn_lite_disable
//int read_bit=rx_pdwn_lite_disable;
rc= GCR_read(*target_ptr,master_interface,rx_mode_pg ,group,0,rx_pdwn_lite_value_buf);if (rc) {return(rc);}
//int rx_pdwn_lite_value=rx_wt_timeout_sel_buf.getHalfWord(0) & read_bit;
-
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_read error for rx_mode_pg");
+ return rc;
+ }
// read and save rx_wt_timeout_sel
//read_bit=rx_wt_timeout_sel_tap7; //find the 3 bit value of the field. need it to be all 1's to do an &
- rc= GCR_read(*target_ptr,master_interface,rx_timeout_sel_pg ,group,0,rx_wt_timeout_sel_buf);if (rc) {return(rc);}
+ // -- REVIEW , think this read is safe
+ rc= GCR_read(*target_ptr,master_interface,rx_timeout_sel_pg ,group,0,rx_wt_timeout_sel_buf);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_read error for rx_timeout_sel_pg");
+ return rc;
+ }
+
//int rx_wt_timeout_value=rx_wt_timeout_sel_buf.getHalfWord(0) & read_bit;
//read and save rx_wt_cu_pll_pgooddly
//read_bit=rx_wt_cu_pll_pgooddly_disable; // selects 111 for the 3 bit field.need it to be all 1's to do an &
- rc= GCR_read(*target_ptr,master_interface,rx_wiretest_pll_cntl_pg,group,0,rx_wt_cu_pll_pgooddly_buf);if (rc) {return(rc);}
+ rc= GCR_read(*target_ptr,master_interface,rx_wiretest_pll_cntl_pg,group,0,rx_wt_cu_pll_pgooddly_buf);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_read error for rx_wiretest_pll_cntl_pgrx_wiretest_pll_cntl_pg");
+ return rc;
+ }
+
+
//int rx_wt_cu_pll_pgooddly_value=rx_wt_cu_pll_pgooddly_buf.getHalfWord(0) & read_bit;
//read and save rx_wt_cu_pll_reset
@@ -148,26 +186,31 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
// set power down lite disable, rx_pdwn_lite_disable
bits=rx_pdwn_lite_disable;
//bits=1;
- set_bits.insert(rx_pdwn_lite_value_buf,0,16);
+ rc_ecmd|=set_bits.insert(rx_pdwn_lite_value_buf,0,16);
//rc_ecmd|=set_bits.insert(bits,0,16);
//rc_ecmd|=set_bits.insert(bits,2,1);
//rc_ecmd|=set_bits.setOr(bits,0,16);
- set_bits.setBit(2);
+ rc_ecmd|=set_bits.setBit(2);
bits=rx_pdwn_lite_disable_clear;
//rc_ecmd|=clear_bits.insert(bits,0,16);
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
+ FAPI_ERR("IO_DCCAL : error power down lite disable");
rc.setEcmdError(rc_ecmd);
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_mode_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
-
+ rc=GCR_write(*target_ptr,chip_interface,rx_mode_pg,group,0,set_bits ,clear_bits);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_mode_pg");
+ return rc;
+ }
//write rx_wt_cu_pll_pgooddly to '111'
rc_ecmd|=set_bits.insert(rx_wt_cu_pll_pgooddly_buf,0,16);
- set_bits.setBit(2);
- set_bits.setBit(3);
- set_bits.setBit(4);
+ rc_ecmd|=set_bits.setBit(2);
+ rc_ecmd|=set_bits.setBit(3);
+ rc_ecmd|=set_bits.setBit(4);
bits=rx_wt_cu_pll_pgooddly_clear;
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
@@ -175,24 +218,43 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
rc.setEcmdError(rc_ecmd);
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
+ rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_wiretest_pll_cntl_pg");
+ return rc;
+ }
// write rx_wt_timeout_sel to '111'
bits=rx_wt_timeout_sel_tap7;
- set_bits.insert(rx_wt_timeout_sel_buf,0,16);
- set_bits.setBit(9);
- set_bits.setBit(10);
- set_bits.setBit(11);
+ rc_ecmd|=set_bits.insert(rx_wt_timeout_sel_buf,0,16);
+ //Update for DDLEVEL - as per Garys find
+ if(ddlevel==1){
+ rc_ecmd|= set_bits.setBit(9);
+ rc_ecmd|= set_bits.setBit(10);
+ rc_ecmd|= set_bits.setBit(11);
+ }else{
+ rc_ecmd|= set_bits.setBit(10);
+ rc_ecmd|= set_bits.setBit(11);
+ rc_ecmd|= set_bits.setBit(12);
+ }
bits=rx_wt_timeout_sel_clear;
//rc_ecmd|=clear_bits.insert(bits,0,16);
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
rc.setEcmdError(rc_ecmd);
+ FAPI_ERR("IO_DCCAL : error clearing bits for GCR_write rx_timeout_sel_pgrx_timeout_sel_pg");
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_timeout_sel_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
-
+ // -- REVIEW , here bits are not used , only set_bits which are now conditioanlized
+ rc=GCR_write(*target_ptr,chip_interface,rx_timeout_sel_pg,group,0,set_bits ,clear_bits);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_timeout_sel_pg");
+ return rc;
+ }
+
//writw rx_start_offset_cal to '1'
bits=rx_start_offset_cal;
@@ -202,15 +264,21 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
if(rc_ecmd)
{
rc.setEcmdError(rc_ecmd);
+ FAPI_ERR("IO_DCCAL : error setting up clear bits for GCR_write rx_training_start_pg");
return(rc);
}
rc=GCR_write(*target_ptr,chip_interface,rx_training_start_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
-
+
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_training_start_pg");
+ return rc;
+ }
//write rx_wt_cu_pll_reset to '1'
rc= GCR_read(*target_ptr,master_interface,rx_wiretest_pll_cntl_pg,group,0,rx_wt_cu_pll_pgooddly_buf_copy);if (rc) {return(rc);}
rc_ecmd|=set_bits.insert(rx_wt_cu_pll_pgooddly_buf_copy,0,16);
//set_bits.setBit(0);
- set_bits.setBit(1);
+ rc_ecmd|=set_bits.setBit(1);
//set_bits.setBit(2);
//set_bits.setBit(3);
//set_bits.setBit(4);
@@ -218,15 +286,26 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
+ FAPI_ERR("IO_DCCAL : error setting up set_bits and clear_bits for GCR_write rx_wiretest_pll_cntl_pg");
rc.setEcmdError(rc_ecmd);
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
+ rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);
+ if(rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_wiretest_pll_cntl_pg");
+ return rc;
+ }
//write rx_wt_cu_pll_pgood to '1'
- rc= GCR_read(*target_ptr,master_interface,rx_wiretest_pll_cntl_pg,group,0,rx_wt_cu_pll_pgooddly_buf_copy);if (rc) {return(rc);}
+ rc= GCR_read(*target_ptr,master_interface,rx_wiretest_pll_cntl_pg,group,0,rx_wt_cu_pll_pgooddly_buf_copy);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_read error for rx_wiretest_pll_cntl_pg");
+ return rc;
+ }
rc_ecmd|=set_bits.insert(rx_wt_cu_pll_pgooddly_buf_copy,0,16);
- set_bits.setBit(0);
+ rc_ecmd|=set_bits.setBit(0);
//set_bits.setBit(1);
//set_bits.setBit(2);
//set_bits.setBit(3);
@@ -235,41 +314,74 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
+ FAPI_ERR("IO_DCCAL : error setting up set_bits and clear_bits for GCR_write rx_wiretest_pll_cntl_pg");
rc.setEcmdError(rc_ecmd);
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
+ rc=GCR_write(*target_ptr,chip_interface,rx_wiretest_pll_cntl_pg,group,0,set_bits ,clear_bits);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : GCR_write error for rx_wiretest_pll_cntl_pg");
+ return rc;
+ }
fapiDelay(100000000,10000000); //Wait 100ms for zcal to complete before polling the status register
//write rx_wt_timeout_sel to '000'
- set_bits.insert(rx_wt_timeout_sel_buf,0,16);
- set_bits.clearBit(9);
- set_bits.clearBit(10);
- set_bits.clearBit(11);
+ rc_ecmd|= set_bits.insert(rx_wt_timeout_sel_buf,0,16);
+ if(ddlevel==1){
+ rc_ecmd|= set_bits.clearBit(9);
+ rc_ecmd|= set_bits.clearBit(10);
+ rc_ecmd|= set_bits.clearBit(11);
+ }else{
+ rc_ecmd|= set_bits.clearBit(10);
+ rc_ecmd|= set_bits.clearBit(11);
+ rc_ecmd|= set_bits.clearBit(12);
+ }
bits=rx_wt_timeout_sel_clear;
//rc_ecmd|=clear_bits.insert(bits,0,16);
rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
+ FAPI_ERR("IO_DCCAL : error setting up set_bits and clear_bits for GCR_write rx_timeout_sel_pg");
rc.setEcmdError(rc_ecmd);
return(rc);
}
- rc=GCR_write(*target_ptr,chip_interface,rx_timeout_sel_pg,group,0,set_bits ,clear_bits);if (rc) {return(rc);}
+ //-- REVIEW here also bits var is not used but above dlevel conditions take care
+ rc=GCR_write(*target_ptr,chip_interface,rx_timeout_sel_pg,group,0,set_bits ,clear_bits);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : error GCR_write rx_timeout_sel_pg");
+ return rc;
+ }
// Poll for the done bit
- rc=GCR_read(*target_ptr,master_interface,rx_training_status_pg ,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
+
+ rc=GCR_read(*target_ptr,master_interface,rx_training_status_pg ,group,0,data_buffer);
+ if (rc)
+ {
+ FAPI_ERR("IO_DCCAL : error GCR_read rx_training_status_pg");
+ return rc;
+ }
int done_bit=rx_offset_cal_done;
int fail_bit=rx_offset_cal_failed;
bool fail= data_buffer.getHalfWord(0) & fail_bit;
bool done = data_buffer.getHalfWord(0)& done_bit;
int timeoutCnt = 0;
- while ( ( !done ) && ( timeoutCnt < 5000 ) && !fail )
+ //Updating timeout as per Gary/Joe's defect SW251251 to be ~1s than the 50s earlier count
+ // This needs to be regressed in lab
+ while ( ( !done ) && ( timeoutCnt < 100 ) && !fail )
{
// wait for 80000 time units
// Time units may be something for simulation, and something else (or nothing) for hardware
// At any rate, this is intended to be approximately 100 us.
- rc=GCR_read(*target_ptr,chip_interface,rx_training_status_pg,group,0,data_buffer); if (rc) {return(rc);}// have to add support for field parsing
+ rc=GCR_read(*target_ptr,chip_interface,rx_training_status_pg,group,0,data_buffer);
+ if (rc)
+ {
+ // have to add support for field parsing
+ FAPI_ERR("IO_DCCAL : error GCR_read rx_training_status_pg in polling for done bit loop");
+ return rc;
+ }
fail= data_buffer.getHalfWord(0) & fail_bit;
done = data_buffer.getHalfWord(0)& done_bit;
fapiDelay(10000000,10000000);
@@ -280,29 +392,42 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
{
FAPI_ERR("IO Offset cal error on interface %d",chip_interface);
//Set HWP error
+ io_interface_t& CHIP_INTERFACE = chip_interface;
+ ecmdDataBufferBase& DATA_BUFFER = data_buffer;
+ int& FAIL_BIT = fail_bit;
+ const Target &TARGET = target;
+
FAPI_SET_HWP_ERROR(rc,IO_DCCAL_OFFCAL_ERROR_RC);
return rc;
}
// Check for errors
- else if ( timeoutCnt >= 5000 && !done && !fail )
+ else if ( timeoutCnt >=100 && !done && !fail )
{
FAPI_ERR("Timed out waiting for Done bit to be set");
//Set HWP error
+ int &TIMEOUTCNT=timeoutCnt;
FAPI_SET_HWP_ERROR(rc,IO_DCCAL_OFFCAL_TIMEOUT_RC);
return rc;
}
else
{
- FAPI_DBG("IO Offset cal Completed on interface %d",chip_interface);
+ FAPI_DBG("IO Offset cal Completed on interface %d with timeoutcount %d",chip_interface,timeoutCnt);
}
// clear eye opt offset cal done bit, rx_eo_latch_offset_done
- rc=GCR_read(*target_ptr,chip_interface,rx_eo_step_stat_pg,group,0,set_bits); if (rc) {return(rc);}// have to add support for field parsing
+ rc=GCR_read(*target_ptr,chip_interface,rx_eo_step_stat_pg,group,0,set_bits);
+ if (rc)
+ {
+ // have to add support for field parsing
+ FAPI_ERR("IO_DCCAL : error GCR_read rx_eo_step_stat_pg");
+ return rc;
+ }
rc_ecmd|=set_bits.clearBit(0);
bits=rx_eo_latch_offset_done_clear;
rc_ecmd|=clear_bits.insert(bits,0,16);
if(rc_ecmd)
{
+ FAPI_ERR("IO_DCCAL : error in set and clear bits for GCR_write rx_eo_step_stat_pg");
rc.setEcmdError(rc_ecmd);
return(rc);
}
@@ -328,15 +453,15 @@ ReturnCode run_offset_cal(const Target &target,io_interface_t master_interface,u
//bits=rx_wt_timeout_value;
bits=rx_wt_timeout_sel_tap3;
- set_bits.insert(rx_wt_timeout_sel_buf,0,16);
+ rc_ecmd|=set_bits.insert(rx_wt_timeout_sel_buf,0,16);
//rc_ecmd |= set_bits.setAnd(bits,9,3);
// if(target.getType() != fapi::TARGET_TYPE_MEMBUF_CHIP){
// rc_ecmd|=set_bits.insert(bits,9,3);
// }
// else
//rc_ecmd |= set_bits.clearBit(9);
- bits=rx_wt_timeout_sel_clear;
- rc_ecmd|=clear_bits.insert(bits,0,16);
+ // -- bits=rx_wt_timeout_sel_clear;
+ rc_ecmd|=clear_bits.flushTo0();
if(rc_ecmd)
{
rc.setEcmdError(rc_ecmd);
@@ -370,7 +495,7 @@ ReturnCode run_zcal_debug(const Target& target,io_interface_t interface,uint32_t
ecmdDataBufferBase data_buffer(16);
rc=GCR_read(target,interface,tx_impcal_nval_pb,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
rc=GCR_read(target,interface,tx_impcal_pval_pb,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
- rc=GCR_read(target,interface,tx_impcal_p_4x_pb,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
+ rc=GCR_read(target,interface,tx_impcal_p_4x_pb,group,0,data_buffer);if (rc) {return(rc);} // have to add support for field parsing
return rc;
}
@@ -385,8 +510,11 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
ecmdDataBufferBase set_bits(16);
ecmdDataBufferBase clear_bits(16);
ecmdDataBufferBase data_buffer(16);
- rc_ecmd|=set_bits.flushTo0();
+ rc_ecmd=set_bits.flushTo0();
rc_ecmd|=clear_bits.flushTo1(); // I dont want to clear anything by default
+ const fapi::Target &TARGET=target;
+ const uint32_t& K2 = k2;
+ const uint32_t& M = m;
if(rc_ecmd)
{
rc.setEcmdError(rc_ecmd);
@@ -394,14 +522,6 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
}
io_interface_t chip_interface=master_interface;//first we run on master chip
uint32_t group=master_group;
- // Get all the input attributes from PLAT
- /*
- Need to check if these attributes are required or not
- rc = FAPI_ATTR_GET(ATTR_IOD_MARGIN_RATIO, &target, m); // Fetch the attribute for the chip we are working on
- rc = FAPI_ATTR_GET(ATTR_IOD_POST_CURSOR_DRIVER_RATIO, &target, k2);
- // Find if we are in SW_OVERRIDE mode
- rc = FAPI_ATTR_GET(ATTR_IOD_ZCAL_SW_OVERRIDE, &target, swOverride);
- */
const uint32_t min = (10<<3); // impcntl min - - p8 - 10<<3
const uint32_t max = (40<<3); // impcntl max - - p8 - 40<<3
@@ -427,12 +547,7 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
FAPI_SET_HWP_ERROR(rc,IO_DCCAL_ZCAL_M_EXCEEDED_RC);
return rc;
}
-
- //if ( m < 0x40 ) {
- // FAPI_DBG("MARGIN RATIO m is less than 50 percent");
- // FAPI_SET_HWP_ERROR(rc,IO_DCCAL_ZCAL_M_LOW_RC);
- // return rc;
- //}
+
if ( ( ! zcal_override ) && ( ! swOverride ) )
{
@@ -475,6 +590,8 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
FAPI_DBG("IO Impedance cal error on interface %d ",chip_interface);
run_zcal_debug(*target_ptr,chip_interface,group);
//set HWP error
+ ecmdDataBufferBase& DATA_BUFFER=data_buffer;
+ bool &FAIL=fail;
FAPI_SET_HWP_ERROR(rc,IO_DCCAL_ZCAL_ERROR_RC);
return(rc);
@@ -484,6 +601,7 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
{
FAPI_DBG("Timed out waiting for Done bit to be set");
//set HWP error
+ int &TIMEOUTCNT=timeoutCnt;
FAPI_SET_HWP_ERROR(rc,IO_DCCAL_ZCAL_TIMEOUT_RC);
return rc;
}
@@ -511,12 +629,19 @@ ReturnCode run_zcal(const Target& target,io_interface_t master_interface,uint32_
if ( ( (uint32_t)zcal_n < min )|| ( (uint32_t)zcal_n > max ) )
{
FAPI_ERR("zcal_n value is out of impcntl range");
+ uint32_t &ZCAL_N=zcal_n;
+ const uint32_t &MIN=min;
+ const uint32_t &MAX=max;
+
FAPI_SET_HWP_ERROR(rc, IO_DCCAL_ZCALN_VALUE_OUT_OF_RANGE_RC);
return rc;
}
if ( ( (uint32_t)zcal_p < min )|| ( (uint32_t)zcal_p > max ) )
{
FAPI_ERR("zcal_p value is out of impcntl range");
+ uint32_t &ZCAL_P=zcal_p;
+ const uint32_t &MIN=min;
+ const uint32_t &MAX=max;
FAPI_SET_HWP_ERROR(rc, IO_DCCAL_ZCALP_VALUE_OUT_OF_RANGE_RC);
return rc;
}
@@ -643,7 +768,7 @@ ReturnCode io_dccal(const Target& target){
fapi::Target parent_target;
uint32_t ring_length=0;
uint32_t rc_ecmd=0;
-
+const fapi::Target& TARGET = target;
FAPI_DBG("Running IO DCCAL PROCEDURE");
// This is a DMI/MC bus
diff --git a/src/usr/hwpf/hwp/bus_training/io_dccal_errors.xml b/src/usr/hwpf/hwp/bus_training/io_dccal_errors.xml
new file mode 100644
index 000000000..7dfa3c325
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_dccal_errors.xml
@@ -0,0 +1,226 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_dccal_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_dccal_errors.xml,v 1.5 2014/03/18 14:58:40 jgrell Exp $ -->
+
+<!-- Error definitions for io_dccal HWPS -->
+<hwpErrors>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_OFFCAL_ERROR_RC</rc>
+ <ffdc>CHIP_INTERFACE</ffdc>
+ <ffdc>DATA_BUFFER</ffdc>
+ <ffdc>FAIL_BIT</ffdc>
+ <ffdc>TARGET</ffdc>
+ <description>io offset cal errored out</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_OFFCAL_TIMEOUT_RC</rc>
+ <ffdc>TIMEOUTCNT</ffdc>
+ <description>io offset cal timedout</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCAL_K2_EXCEEDED_RC</rc>
+ <ffdc>K2</ffdc>
+ <description>Post cursor drive ratio has exceeded 0.25</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCAL_M_EXCEEDED_RC</rc>
+ <ffdc>M</ffdc>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ <description>Margin Ratio has exceeded 100 percentage</description>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCAL_ERROR_RC</rc>
+ <ffdc>FAIL</ffdc>
+ <ffdc>DATA_BUFFER</ffdc>
+ <description>io impedance cal errored out</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCAL_TIMEOUT_RC</rc>
+ <ffdc>TIMEOUTCNT</ffdc>
+ <description>io impedance cal timed out</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCALN_VALUE_OUT_OF_RANGE_RC</rc>
+ <ffdc>ZCAL_N</ffdc>
+ <ffdc>MIN</ffdc>
+ <ffdc>MAX</ffdc>
+ <description>Impedance calibration zcal_n value out of range</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_ZCALP_VALUE_OUT_OF_RANGE_RC</rc>
+ <ffdc>ZCAL_P</ffdc>
+ <ffdc>MIN</ffdc>
+ <ffdc>MAX</ffdc>
+ <description>Impedance calibration zcal_p value out of range</description>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_DCCAL_INVALID_INVOCATION_RC</rc>
+ <ffdc>TARGET</ffdc>
+ <description>io dc cal invoked with wrong pair of targets</description>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ <callout>
+ <target>TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+
+</hwpErrors>
+
+
diff --git a/src/usr/hwpf/hwp/bus_training/io_errors.xml b/src/usr/hwpf/hwp/bus_training/io_errors.xml
deleted file mode 100644
index c3e7f48df..000000000
--- a/src/usr/hwpf/hwp/bus_training/io_errors.xml
+++ /dev/null
@@ -1,244 +0,0 @@
-<!-- IBM_PROLOG_BEGIN_TAG -->
-<!-- This is an automatically generated prolog. -->
-<!-- -->
-<!-- $Source: src/usr/hwpf/hwp/bus_training/io_errors.xml $ -->
-<!-- -->
-<!-- IBM CONFIDENTIAL -->
-<!-- -->
-<!-- COPYRIGHT International Business Machines Corp. 2012,2013 -->
-<!-- -->
-<!-- p1 -->
-<!-- -->
-<!-- Object Code Only (OCO) source materials -->
-<!-- Licensed Internal Code Source Materials -->
-<!-- IBM HostBoot Licensed Internal Code -->
-<!-- -->
-<!-- The source code for this program is not published or otherwise -->
-<!-- divested of its trade secrets, irrespective of what has been -->
-<!-- deposited with the U.S. Copyright Office. -->
-<!-- -->
-<!-- Origin: 30 -->
-<!-- -->
-<!-- IBM_PROLOG_END_TAG -->
-<!-- $Id: io_errors.xml,v 1.12 2013/12/06 19:17:34 jgrell Exp $ -->
-<!-- Error definitions for IO HWPS -->
-<hwpErrors>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_INVALID_ARGS_RC</rc>
- <description>Invalid or out-of-range argument value(s) presented to IO_RUN_TRAINING HWP.</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_INTERNAL_ERR_RC</rc>
- <description>Unexpected internal program logic error.</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_ERR_RC</rc>
- <description>Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_WIRETEST_RC</rc>
- <description>Wiretest Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_DESKEW_RC</rc>
- <description>Deskew Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_EYE_OPT_RC</rc>
- <description>Eye Optimization Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_REPAIR_RC</rc>
- <description>Static Repair Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FAIL_FUNC_MODE_RC</rc>
- <description>Functional mode Training fail was reported in a P8 or Centaur status register</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_WIRETEST_TIMEOUT_RC</rc>
- <ffdc>FFDC_NUM_CYCLES</ffdc>
- <description>io run training wiretest timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_DESKEW_TIMEOUT_RC</rc>
- <ffdc>FFDC_NUM_CYCLES</ffdc>
- <description>io run training deskew timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_EYE_OPT_TIMEOUT_RC</rc>
- <ffdc>FFDC_NUM_CYCLES</ffdc>
- <description>io run training eye opt timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_REPAIR_TIMEOUT_RC</rc>
- <ffdc>FFDC_NUM_CYCLES</ffdc>
- <description>io run training repair timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_FUNC_MODE_TIMEOUT_RC</rc>
- <ffdc>FFDC_NUM_CYCLES</ffdc>
- <description>io run training functional mode timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_GCR_WRITE_MISMATCH_RC</rc>
- <description>IO GCR write operation failed to readback data that was written</description>
- <ffdc>READ_BUF</ffdc>
- <ffdc>WRITE_BUF</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_DLL_WORKAROUND_FAIL</rc>
- <description>DLL Workaround failed to arrive at a solution</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_DLL_VAL_OUT_OF_BOUND_RC</rc>
- <description>DLL Workaround encountered unexpected start value</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_RUN_TRAINING_INVALID_INVOCATION_RC</rc>
- <description>io run training invoked with wrong pair of targets</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_OFFCAL_TIMEOUT_RC</rc>
- <description>io offset cal timedout</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_OFFCAL_ERROR_RC</rc>
- <description>io offset cal errored out</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_INVALID_INVOCATION_RC</rc>
- <description>io dc cal invoked with wrong pair of targets</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCAL_ERROR_RC</rc>
- <description>io impedance cal errored out</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCAL_TIMEOUT_RC</rc>
- <description>io impedance cal timed out</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCALN_VALUE_OUT_OF_RANGE_RC</rc>
- <description>Impedance calibration zcal_n value out of range</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCALP_VALUE_OUT_OF_RANGE_RC</rc>
- <description>Impedance calibration zcal_p value out of range</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCAL_K2_EXCEEDED_RC</rc>
- <description>Post cursor drive ratio has exceeded 0.25</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCAL_M_EXCEEDED_RC</rc>
- <description>Margin Ratio has exceeded 100 percentage</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_DCCAL_ZCAL_M_LOW_RC</rc>
- <description>Margin Ratio is less than 50 percent</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_CLEAR_FIRS_INVALID_INVOCATION_RC</rc>
- <description>io clear firs hwp invoked with wrong pair of targets</description>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_LANE_RX_PARITY_ERROR_RC</rc>
- <description>io lane level rx parity error set</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>LANE_ID</ffdc>
- <ffdc>RX_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_GROUP_RX_PARITY_ERROR_RC</rc>
- <description>io group level rx parity error set</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>RX_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_BUS_RX_PARITY_ERROR_RC</rc>
- <description>io bus level rx parity error set</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>RX_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_LANE_TX_PARITY_ERROR_RC</rc>
- <description>io lane level tx parity error set</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>LANE_ID</ffdc>
- <ffdc>TX_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_GROUP_TX_PARITY_ERROR_RC</rc>
- <description>io group level tx parity error set</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>TX_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_SPARES_DEPLOYED_FIR_RC</rc>
- <description>A spare has been deployed</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>SPARE_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_MAX_SPARES_EXCEEDED_FIR_RC</rc>
- <description>maximum spares possible to deploy exceeded</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>SPARE_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_GCR_HANG_ERROR_RC</rc>
- <description>gcr hang error detected</description>
- <ffdc>CHIP_TARGET</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_RECALIBRATION_ERROR_RC</rc>
- <description>recalibration or a repair error has been detected</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>RECAL_ERROR_REG</ffdc>
- </hwpError>
- <!-- *********************************************************************** -->
- <hwpError>
- <rc>IO_FIR_TOO_MANY_BUS_ERROR_RC</rc>
- <description>A bus has experienced too many random lane errors</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>BUS_ERROR_REG</ffdc>
- </hwpError>
-</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_fir_isolation.C b/src/usr/hwpf/hwp/bus_training/io_fir_isolation.C
index 5c19acaf2..d14737bf3 100644
--- a/src/usr/hwpf/hwp/bus_training/io_fir_isolation.C
+++ b/src/usr/hwpf/hwp/bus_training/io_fir_isolation.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,16 +20,16 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_fir_isolation.C,v 1.11 2013/11/13 10:50:44 jaswamin Exp $
+// $Id: io_fir_isolation.C,v 1.14 2014/03/20 14:06:08 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 2012 , 2013
// *! All Rights Reserved -- Property of IBM
// *! *** IBM Confidential ***
// *!***************************************************************************
// *! FILENAME : io_fir_isolation.C
-// *! TITLE :
+// *! TITLE :
// *! DESCRIPTION : To isolate the error causing the firs to flag
-// *! CONTEXT :
+// *! CONTEXT :
// *!
// *! OWNER NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
// *! BACKUP NAME : Varghese, Varkey Email: varkey.kv@in.ibm.com
@@ -40,14 +40,14 @@
// Version:|Author: | Date: | Comment:
// --------|--------|--------|--------------------------------------------------
// 1.9 |jaswamin|04/19/13| Fixes for firmware compile issues.
-// 1.8 |jaswamin|03/22/13| Added comments
+// 1.8 |jaswamin|03/22/13| Added comments
// 1.7 |jaswamin|03/18/13| Changed indentation
// 1.6 |jaswamin|03/13/13| Returncode logging
// 1.5 |jaswamin|03/12/13| Return in case of a gcr operation error.
// 1.4 |jaswamin|03/06/13| Removed commented out portion.
// 1.3 |jaswamin|03/04/13| Changes as per review comment.
// 1.2 |jaswamin|02/20/13| Changes as per review comment
-// 1.1 |jaswamin|02/14/13| Initial check in .
+// 1.1 |jaswamin|02/14/13| Initial check in .
//------------------------------------------------------------------------------
#include <fapi.H>
@@ -60,7 +60,6 @@ extern "C" {
using namespace fapi;
-
//! Function : io_fir_too_many_bus_err_isolation
//! Parameters : i_target => FAPI target,
//! chip_interface => io_chip_interface viz., A, X, DMI, CEN
@@ -73,23 +72,20 @@ using namespace fapi;
ReturnCode io_fir_too_many_bus_err_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
- //uint32_t bitPos=0x0080;
-
-
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir_training_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
if(error_data.isBitSet(8,1)){
- //error_data.setAnd(bitPos,0,16);
ecmdDataBufferBase & BUS_ERROR_REG = error_data; //bit1 of the register represnts the spare deployed bit.
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_TOO_MANY_BUS_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_UNRECOVERABLE);
}
- return(FAPI_RC_SUCCESS);
+ return(FAPI_RC_SUCCESS);
}
//! Function : io_fir_recal_error_isolation
@@ -105,18 +101,16 @@ ReturnCode io_fir_too_many_bus_err_isolation(const fapi::Target &i_target,
ReturnCode io_fir_recal_error_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
- //uint32_t bitPos=0x1200;
-
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir_training_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
if(error_data.isBitSet(3,1) || error_data.isBitSet(6,1)){ //can be caused by dynamic repair or recal error (bits 3 and 6 respectively)
- //error_data.setAnd(bitPos,0,16);
ecmdDataBufferBase & RECAL_ERROR_REG = error_data ; //bit1 of the register represnts the spare deployed bit.
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_RECALIBRATION_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
}
@@ -131,23 +125,21 @@ ReturnCode io_fir_recal_error_isolation(const fapi::Target &i_target,
//! This includes the target details and the source of the error.
//! Description : This function collects the register contents of the training register
//! that would help root cause the error as being from pre/during training,
- //! post training or during recal that caused the spares to exceed.
+ //! post training or during recal that caused the spares to exceed.
//! This is provided as FFDC dump.
ReturnCode io_fir_max_spares_exceeded_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
- //uint32_t bitPos=0x2680;
-
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir_training_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
if(error_data.isBitSet(2,1) || error_data.isBitSet(5,1)|| error_data.isBitSet(8,1)){ // can be caused by a static (pre training - bit 2) or dynamic (post training - bit 5) or recal(bit 8)
- //error_data.setAnd(bitPos,0,16);
ecmdDataBufferBase & SPARE_ERROR_REG = error_data; //bit2 /bit 5 /bit 8of the register represents the max spare exceeded bit.To determine what caused the max spares exceeded error
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_MAX_SPARES_EXCEEDED_FIR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_UNRECOVERABLE);
}
@@ -167,18 +159,16 @@ ReturnCode io_fir_max_spares_exceeded_isolation(const fapi::Target &i_target,
ReturnCode io_fir_spare_deployed_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
- //uint32_t bitPos=0x6900;
-
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir_training_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
if(error_data.isBitSet(1,1) || error_data.isBitSet(4,1) || error_data.isBitSet(7,1)){ // can be caused by a spare deployment prior to training , post training or during recal
- //error_data.setAnd(bitPos,0,16);
ecmdDataBufferBase & SPARE_ERROR_REG = error_data; //bit1 /bit4 / bit 7 of the register represnts the spare deployed bit. To determine which type of error caused the spare to be deployed
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_SPARES_DEPLOYED_FIR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
}
@@ -194,16 +184,16 @@ ReturnCode io_fir_spare_deployed_isolation(const fapi::Target &i_target,
//! and the lane id if it is a lane level error.
//! Description : This function collects the register contents that would help
//! determine the source of the parity error and provides it as a FFDC data dump.
-
+
ReturnCode io_fir_tx_parity_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
- uint32_t loop_val=0;
+ uint32_t loop_val=0;
uint32_t lane,group;
-
+
if(i_chip_interface==CP_FABRIC_X0){
lane=77;
}
@@ -216,16 +206,16 @@ ReturnCode io_fir_tx_parity_isolation(const fapi::Target &i_target,
else{
lane=24;
}
-
+
for(loop_val=0;loop_val<lane;loop_val++){
-
+
if(i_chip_interface==CP_FABRIC_X0){
group=loop_val%20;
}
else{
group=i_current_group;
}
-
+
o_rc=GCR_read(i_target , i_chip_interface, tx_fir_pl, group,loop_val, error_data);
if(o_rc){
FAPI_ERR("io_fir_isolation: Error reading rx fir per lane register\n");
@@ -233,35 +223,37 @@ ReturnCode io_fir_tx_parity_isolation(const fapi::Target &i_target,
}
//bit 0 for rx_fir_pl in case of X and bit 0 and 1 for A and DMI
if(error_data.isBitSet(0,1)){
-
+
// find the current lane and group to send information
-
+
uint32_t & LANE_ID = loop_val;
ecmdDataBufferBase & TX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_DBG("io_fir_rx_parity_isolation:A per lane register or state machine error has occured. Lane is %d\n",loop_val);
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_LANE_TX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
+ break;
}
}
-
-
+
+
o_rc=GCR_read(i_target ,i_chip_interface, tx_fir_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
for(loop_val=0;loop_val<16;loop_val++){
-
+
if(error_data.isBitSet(loop_val,1)){
-
+
ecmdDataBufferBase & TX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_GROUP_TX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
+ break;
}
}
-
+
return(FAPI_RC_SUCCESS);
-
+
}
//! Function : io_fir_rx_parity_isolation
@@ -276,13 +268,13 @@ ReturnCode io_fir_tx_parity_isolation(const fapi::Target &i_target,
ReturnCode io_fir_rx_parity_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group){
-
-
+
+
ReturnCode o_rc;
ecmdDataBufferBase error_data(16);
uint32_t loop_val=0;
uint32_t lane,group;
-
+
//in case its bit 0 it is the rx_parity error. To find which bit is set read the registers that contribute to it. This is a per lane register. Hence we need to loop through each
//lane to determine which is erroring out.
if(i_chip_interface==CP_FABRIC_X0){
@@ -297,80 +289,82 @@ ReturnCode io_fir_rx_parity_isolation(const fapi::Target &i_target,
else{
lane=17;
}
-
+
for(loop_val=0;loop_val<lane;loop_val++){
-
+
if(i_chip_interface==CP_FABRIC_X0){
group=loop_val%20;
}
else{
group=i_current_group;
}
-
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir_pl, group,loop_val, error_data);
-
+
if(o_rc){
FAPI_DBG("io_fir_isolation: Error reading rx fir per lane register\n");
return(o_rc);
}
//bit 0 for rx_fir_pl in case of X and bit 0 and 1 for A and DMI
if(error_data.isBitSet(0,1) || error_data.isBitSet(1,1)){
-
-
+
+
// find the current lane and group to send information
uint32_t & LANE_ID = loop_val;
ecmdDataBufferBase & RX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_DBG("io_fir_rx_parity_isolation:A per lane register or state machine error has occured. Lane is %d\n",loop_val);
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_LANE_RX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
+ break;
}
}
-
+
//for fir1_reg and fir2_reg it is group wise hence do not need lane information
-
+
o_rc=GCR_read(i_target ,i_chip_interface, rx_fir1_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
for(loop_val=0;loop_val<16;loop_val++){
-
+
if(error_data.isBitSet(loop_val,1)){
ecmdDataBufferBase & RX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_DBG("io_fir_isolation: %s\n",fir1_reg[loop_val]);
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_GROUP_RX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
-
+ break;
}
}
-
-
+
+
o_rc=GCR_read(i_target , i_chip_interface, rx_fir2_pg, i_current_group,0, error_data);
if(o_rc)
return o_rc;
for(loop_val=0;loop_val<16;loop_val++){
-
+
if(error_data.isBitSet(loop_val,1)){
ecmdDataBufferBase & RX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_DBG("io_fir_isolation: %s\n",fir2_reg[loop_val]);
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_GROUP_RX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
-
+ break;
}
}
-
-
+
+
o_rc=GCR_read(i_target,i_chip_interface,rx_fir_pb,i_current_group,0,error_data);
if(o_rc)
return o_rc;
for(loop_val=0;loop_val<16;loop_val++){
-
+
if(error_data.isBitSet(loop_val,1)){
ecmdDataBufferBase & RX_ERROR_REG = error_data;
- const fapi::Target & CHIP_TARGET= i_target;
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_BUS_RX_PARITY_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_RECOVERED);
+ break;
}
}
return(FAPI_RC_SUCCESS);
@@ -389,99 +383,99 @@ ReturnCode io_error_isolation(const fapi::Target &i_target,
io_interface_t i_chip_interface,
uint32_t i_current_group,
ecmdDataBufferBase &i_fir_data){
-
+
ReturnCode o_rc;
//ecmdDataBufferBase error_data(16),id_data(16);
-
-
+
+
//need to determine what error it represents.
-
+
//if it is a rx_parity error
- if(i_fir_data.isBitSet(RX_PARITY,1)){
+ if(i_fir_data.isBitSet(RX_PARITY,1)){
o_rc=io_fir_rx_parity_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
}
-
+
//check for tx_parity error
if(i_fir_data.isBitSet(TX_PARITY,1)){
-
+
o_rc=io_fir_tx_parity_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
}
-
+
//GCR hang error
- if(i_fir_data.isBitSet(GCR_HANG_ERROR,1)){
+ if(i_fir_data.isBitSet(GCR_HANG_ERROR,1)){
//check whether the gcr hang error bit is set
-
-
- const fapi::Target & CHIP_TARGET= i_target;
+
+
+ const fapi::Target & ENDPOINT = i_target;
FAPI_SET_HWP_ERROR(o_rc,IO_FIR_GCR_HANG_ERROR_RC);
fapiLogError(o_rc,FAPI_ERRL_SEV_UNRECOVERABLE); //since the logging of error needs to happen here for this error.
-
-
+
+
}
-
- //spare deploy?
+
+ //spare deploy?
if(i_fir_data.isBitSet(BUS0_SPARE_DEPLOYED,1) ||
i_fir_data.isBitSet(BUS1_SPARE_DEPLOYED,1) ||
i_fir_data.isBitSet(BUS2_SPARE_DEPLOYED,1) ||
i_fir_data.isBitSet(BUS3_SPARE_DEPLOYED,1) ||
- i_fir_data.isBitSet(BUS4_SPARE_DEPLOYED,1) ){
-
+ i_fir_data.isBitSet(BUS4_SPARE_DEPLOYED,1) ){
+
o_rc=io_fir_spare_deployed_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
-
-
+
+
}
-
- //maximum spares deployed and exceeded?
+
+ //maximum spares deployed and exceeded?
if(i_fir_data.isBitSet(BUS0_MAX_SPARES_EXCEEDED,1) ||
i_fir_data.isBitSet(BUS1_MAX_SPARES_EXCEEDED,1) ||
i_fir_data.isBitSet(BUS2_MAX_SPARES_EXCEEDED,1) ||
i_fir_data.isBitSet(BUS3_MAX_SPARES_EXCEEDED,1) ||
- i_fir_data.isBitSet(BUS4_MAX_SPARES_EXCEEDED,1)){
-
+ i_fir_data.isBitSet(BUS4_MAX_SPARES_EXCEEDED,1)){
+
o_rc=io_fir_max_spares_exceeded_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
-
+
}
-
- //recalibration error
+
+ //recalibration error
if(i_fir_data.isBitSet(BUS0_RECALIBRATION_ERROR,1) ||
i_fir_data.isBitSet(BUS1_RECALIBRATION_ERROR,1) ||
i_fir_data.isBitSet(BUS2_RECALIBRATION_ERROR,1) ||
i_fir_data.isBitSet(BUS3_RECALIBRATION_ERROR,1) ||
- i_fir_data.isBitSet(BUS4_RECALIBRATION_ERROR,1)){
-
-
+ i_fir_data.isBitSet(BUS4_RECALIBRATION_ERROR,1)){
+
+
o_rc=io_fir_recal_error_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
-
+
}
-
+
//too many bus errors
if(i_fir_data.isBitSet(BUS0_TOO_MANY_BUS_ERRORS,1) ||
i_fir_data.isBitSet(BUS1_TOO_MANY_BUS_ERRORS,1) ||
i_fir_data.isBitSet(BUS2_TOO_MANY_BUS_ERRORS,1) ||
i_fir_data.isBitSet(BUS3_TOO_MANY_BUS_ERRORS,1) ||
- i_fir_data.isBitSet(BUS4_TOO_MANY_BUS_ERRORS,1)){
-
+ i_fir_data.isBitSet(BUS4_TOO_MANY_BUS_ERRORS,1)){
+
o_rc=io_fir_too_many_bus_err_isolation(i_target,i_chip_interface,i_current_group);
if(o_rc)
return(o_rc);
-
+
}
-
+
return(FAPI_RC_SUCCESS); // Currently this does not cause any harm as you are returning all the errors in the middle of the function, but it is good to change this to "return(o_r)".
}
ReturnCode io_fir_isolation(const fapi::Target &i_target){
-
+
ReturnCode o_rc;
uint32_t rc_ecmd=0;
fir_io_interface_t interface;
@@ -489,8 +483,12 @@ ReturnCode io_fir_isolation(const fapi::Target &i_target){
uint32_t group;
ecmdDataBufferBase fir_data(64);
rc_ecmd|=fir_data.flushTo0();
- //rc_ecmd|=fir_data.setBitLength(64);
-
+ if(rc_ecmd)
+ {
+ o_rc.setEcmdError(rc_ecmd);
+ return(o_rc);
+ }
+
//on dmi
if( (i_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )){
FAPI_DBG("This is a Processor DMI bus using base DMI scom address");
@@ -501,7 +499,7 @@ ReturnCode io_fir_isolation(const fapi::Target &i_target){
if(o_rc)
return(o_rc);
o_rc=io_error_isolation(i_target,gcr_interface,group,fir_data);
-
+
}
//on cen side
else if((i_target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP)){
@@ -513,7 +511,7 @@ ReturnCode io_fir_isolation(const fapi::Target &i_target){
if(o_rc)
return(o_rc);
o_rc=io_error_isolation(i_target,gcr_interface,group,fir_data);
-
+
}
// on x bus
else if((i_target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT)){
@@ -525,7 +523,7 @@ ReturnCode io_fir_isolation(const fapi::Target &i_target){
if(o_rc)
return(o_rc);
o_rc=io_error_isolation(i_target,gcr_interface,group,fir_data);
-
+
}
//on a bus
else if((i_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)){
@@ -537,19 +535,18 @@ ReturnCode io_fir_isolation(const fapi::Target &i_target){
if(o_rc)
return(o_rc);
o_rc=io_error_isolation(i_target,gcr_interface,group,fir_data);
-
+
}
else{
- FAPI_ERR("Invalid io_clear_firs HWP invocation . Target doesnt belong to DMI/X/A instances");
- FAPI_SET_HWP_ERROR(o_rc, IO_CLEAR_FIRS_INVALID_INVOCATION_RC);
+ FAPI_ERR("Invalid io_fir HWP invocation . Target doesnt belong to DMI/X/A instances");
+ const fapi::Target & ENDPOINT = i_target;
+ FAPI_SET_HWP_ERROR(o_rc, IO_FIR_INVALID_INVOCATION_RC);
}
-
- return(o_rc);
-
-}
+ return(o_rc);
}
+}
diff --git a/src/usr/hwpf/hwp/bus_training/io_fir_isolation_errors.xml b/src/usr/hwpf/hwp/bus_training/io_fir_isolation_errors.xml
new file mode 100755
index 000000000..da002fce4
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_fir_isolation_errors.xml
@@ -0,0 +1,204 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_fir_isolation_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_fir_isolation_errors.xml,v 1.4 2014/03/20 14:09:56 varkeykv Exp $ -->
+<hwpErrors>
+ <hwpError>
+ <rc>IO_FIR_TOO_MANY_BUS_ERROR_RC</rc>
+ <description>A bus has experienced too many random lane errors</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>BUS_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_RECALIBRATION_ERROR_RC</rc>
+ <description>recalibration or a repair error has been detected</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>RECAL_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_MAX_SPARES_EXCEEDED_FIR_RC</rc>
+ <description>maximum spares possible to deploy exceeded</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>SPARE_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_SPARES_DEPLOYED_FIR_RC</rc>
+ <description>A spare has been deployed</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>SPARE_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_LANE_TX_PARITY_ERROR_RC</rc>
+ <description>io lane level tx parity error set</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>LANE_ID</ffdc>
+ <ffdc>TX_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_GROUP_TX_PARITY_ERROR_RC</rc>
+ <description>io group level tx parity error set</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>TX_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_LANE_RX_PARITY_ERROR_RC</rc>
+ <description>io lane level rx parity error set</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>LANE_ID</ffdc>
+ <ffdc>RX_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_GROUP_RX_PARITY_ERROR_RC</rc>
+ <description>io group level rx parity error set</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>RX_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_BUS_RX_PARITY_ERROR_RC</rc>
+ <description>io bus level rx parity error set</description>
+ <ffdc>ENDPOINT</ffdc>
+ <ffdc>RX_ERROR_REG</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_GCR_HANG_ERROR_RC</rc>
+ <description>gcr hang error detected</description>
+ <ffdc>ENDPOINT</ffdc>
+ <callout>
+ <target>ENDPOINT</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>ENDPOINT</target>
+ </deconfigure>
+ <gard>
+ <target>ENDPOINT</target>
+ </gard>
+ </hwpError>
+ <hwpError>
+ <rc>IO_FIR_INVALID_INVOCATION_RC</rc>
+ <description>io clear firs hwp invoked with wrong pair of targets</description>
+ <ffdc>ENDPOINT</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <hwpError>
+ <rc>IO_CLEAR_FIRS_INVALID_INVOCATION_RC</rc>
+ <description>io clear firs hwp invoked with wrong pair of targets</description>
+ <ffdc>ENDPOINT</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_funcs.C b/src/usr/hwpf/hwp/bus_training/io_funcs.C
index ebe838ad2..2cd372dde 100644
--- a/src/usr/hwpf/hwp/bus_training/io_funcs.C
+++ b/src/usr/hwpf/hwp/bus_training/io_funcs.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_funcs.C,v 1.19 2014/02/11 05:46:59 varkeykv Exp $
+// $Id: io_funcs.C,v 1.25 2014/03/20 08:36:49 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -82,6 +82,7 @@ ReturnCode edi_training::run_training(const Target& master_target, io_interfac
rc=training_function_status(master_target , master_interface,current_group, slave_target , slave_interface,current_group);
if(!rc.ok()){
FAPI_ERR("io_run_training : Failed Training");
+ return rc;
}
}
}
@@ -89,6 +90,7 @@ ReturnCode edi_training::run_training(const Target& master_target, io_interfac
rc=training_function_status(master_target , master_interface,master_group, slave_target , slave_interface,slave_group);
if(!rc.ok()){
FAPI_ERR("io_run_training : Failed Training");
+ return rc;
}
}
}
@@ -204,6 +206,14 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
rc_ecmd|=status_data.setBitLength(16);
rc_ecmd|=status_data.flushTo0();
+ //Reference variables matching error XML
+ const fapi::Target& MASTER_TARGET = master_chip_target;
+ const fapi::Target& SLAVE_TARGET = slave_chip_target;
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
if(rc_ecmd)
{
FAPI_ERR("io_run_training: Failed buffer intialization in training_function_status\n");
@@ -244,11 +254,11 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
if (status_data.getHalfWord(0) & fail_bit)
{
FAPI_ERR("io_run_training: the wiretest training state reported a fail \n");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_WIRETEST_RC);
+ // FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_WIRETEST_RC);
wire_test_status = FAILED ;
rx_wderf_failed[WIRE_TEST]=true;
// Run First FAILED Data Capture for Wire Test for FAILED bus
- dump_ffdc_wiretest(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
+ rc=dump_ffdc_wiretest(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
break;
}
@@ -272,8 +282,9 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
{
rx_wderf_failed[DESKEW]=true;
FAPI_ERR("io_run_training : deskew training state reported a fail \n");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_DESKEW_RC);
+ //FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_DESKEW_RC);
desckew_status = FAILED ;
+ rc=dump_ffdc_deskew(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
break;
}
else
@@ -295,9 +306,10 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
if (status_data.getHalfWord(0) & fail_bit)
{
FAPI_ERR("io_run_training : eye_opt_ training state reported a fail\n");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_EYE_OPT_RC);
+ //FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_EYE_OPT_RC);
rx_wderf_failed[EYE_OPT]=true;
eye_opt_status = FAILED ;
+ rc=dump_ffdc_eyeopt(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
break;
}
else
@@ -319,7 +331,8 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
if (status_data.getHalfWord(0) & fail_bit)
{
FAPI_DBG("io_run_training: static repair encountered an error \n");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_REPAIR_RC);
+ //FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_REPAIR_RC);
+ rc=dump_ffdc_repair(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
rx_wderf_failed[REPAIR]=true;
repair_status = FAILED ;
break;
@@ -346,7 +359,8 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
{
FAPI_DBG("io_run_training: rx_func_mode_failed \n");
rx_wderf_failed[FUNCTIONAL]=true;
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_FUNC_MODE_RC);
+ //FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FAIL_FUNC_MODE_RC);
+ rc=dump_ffdc_func(master_chip_target, master_chip_interface , master_group, slave_chip_target , slave_chip_interface,slave_group);
functional_status = FAILED ;
break;
}
@@ -389,27 +403,27 @@ ReturnCode edi_training::training_function_status(const Target& master_chip_ta
if (wire_test_selected && wire_test_status== RUNNING)
{
FAPI_ERR("io_run_training: wiretest timeout");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_WIRETEST_TIMEOUT_RC);
+ FAPI_SET_HWP_ERROR(rc, IO_FUNCS_WIRETEST_TIMEOUT_RC);
}
else if (desckew_selected && desckew_status == RUNNING)
{
FAPI_ERR("io_run_training: deskew timeout");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_DESKEW_TIMEOUT_RC);
+ FAPI_SET_HWP_ERROR(rc, IO_FUNCS_DESKEW_TIMEOUT_RC);
}
else if (repair_selected && repair_status == RUNNING)
{
FAPI_ERR("io_run_training: repair timeout");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_REPAIR_TIMEOUT_RC);
+ FAPI_SET_HWP_ERROR(rc, IO_FUNCS_REPAIR_TIMEOUT_RC);
}
else if (eye_opt_selected && eye_opt_status == RUNNING)
{
FAPI_ERR("io_run_training: eyeopt timeout");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_EYE_OPT_TIMEOUT_RC);
+ FAPI_SET_HWP_ERROR(rc, IO_FUNCS_EYEOPT_TIMEOUT_RC);
}
else
{
FAPI_ERR("io_run_training: func timeout");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_FUNC_MODE_TIMEOUT_RC);
+ FAPI_SET_HWP_ERROR(rc, IO_FUNCS_FUNC_MODE_TIMEOUT_RC);
}
break;
}
@@ -449,77 +463,666 @@ ReturnCode edi_training::isChipMaster(const Target& chip_target, io_interface_t
// First Fail Data Capture (wire_test)
// FFDC functions have not been tested in detail ..
-// Will need to tie this into the eRepair/PRD conversation that we are having with Zane
+// Will need to tie this into the eRepair/PRD conversation that we are having with Zane
+ // DUMP ALL THESE
+ // rx_lane_disabled_vec_0_15_pg,
+ // rx_lane_disabled_vec_16_31_pg,
+ // rx_lane_swapped_vec_0_15_pg,
+ // rx_lane_swapped_vec_16_31_pg,
+ // rx_init_state_pg,
+ // rx_wiretest_state_pg,
+ // rx_wiretest_laneinfo_pg,
+ // rx_wt_status_pl
+ //rx_main_init_state
+ //rx_wtl_state
+ //rx_wtm_state
+ //rx_wtr_state
+ //rx_wtr_bad_lane_count
+ //rx_wt_lane_bad_code ( per lane - can we?)
+ //rx_wtr_bad_lane_count
+ //rx_wiretest_failed
+ //rx_wt_clk_bad_lane_code?
+ //rx_wt_clk_lane_inverted?
+ //rx_wt_clk_status_pg
ReturnCode edi_training::dump_ffdc_wiretest(const Target& master_chip_target, io_interface_t master_chip_interface ,uint32_t master_group, const Target& slave_chip_target ,
io_interface_t slave_chip_interface,uint32_t slave_group)
{
- ReturnCode rc;
-
- ecmdDataBufferBase master_lane_bad_vec_0_15_data(16);
- ecmdDataBufferBase master_lane_bad_vec_16_31_data(16);
- ecmdDataBufferBase slave_lane_bad_vec_0_15_data(16);
- ecmdDataBufferBase slave_lane_bad_vec_16_31_data(16);
+ ReturnCode rc;
+ ReturnCode lane_rc; // for logging per lane FFDC
+
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
+ const fapi::Target &MASTER_TARGET=master_chip_target;
+ const fapi::Target &SLAVE_TARGET=slave_chip_target;
+
- ecmdDataBufferBase master_lane_bad_data(16);
+ //FFDC Buffers
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_16_31_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_DISABLED_VEC_0_15_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_DISABLED_VEC_16_31_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_SWAPPED_VEC_0_15_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_SWAPPED_VEC_16_31_PG(16);
+ ecmdDataBufferBase MASTER_RX_INIT_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_WIRETEST_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_WIRETEST_LANEINFO_PG(16);
+ ecmdDataBufferBase MASTER_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase MASTER_RX_WT_CLK_STATUS_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_16_31_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_DISABLED_VEC_0_15_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_DISABLED_VEC_16_31_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_SWAPPED_VEC_0_15_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_SWAPPED_VEC_16_31_PG(16);
+ ecmdDataBufferBase SLAVE_RX_INIT_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_WIRETEST_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_WIRETEST_LANEINFO_PG(16);
+ ecmdDataBufferBase SLAVE_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase SLAVE_RX_WT_CLK_STATUS_PG(16);
+
+ //These are for per-lane FFDC captures
+ ecmdDataBufferBase RX_WT_STATUS_PL(16);
+
+ const uint32_t NUM_PG_REGS=11;
+ // const uint32_t NUM_PL_REGS=0;
+
+ const GCR_sub_registers pg_reg_list[NUM_PG_REGS]={rx_lane_bad_vec_0_15_pg,rx_lane_bad_vec_16_31_pg,rx_lane_disabled_vec_0_15_pg, rx_lane_disabled_vec_16_31_pg,rx_lane_swapped_vec_0_15_pg,
+ rx_lane_swapped_vec_16_31_pg,rx_init_state_pg,rx_wiretest_state_pg,rx_wiretest_laneinfo_pg,rx_training_status_pg,rx_wt_clk_status_pg};
+
+ // const GCR_sub_registers pl_reg_list[NUM_PL_REGS]={};
+
+ ecmdDataBufferBase *MASTER_BUFFERS[NUM_PG_REGS]= { &MASTER_RX_LANE_BAD_0_15_PG,
+ &MASTER_RX_LANE_BAD_16_31_PG,
+ &MASTER_RX_LANE_DISABLED_VEC_0_15_PG,
+ &MASTER_RX_LANE_DISABLED_VEC_16_31_PG,
+ &MASTER_RX_LANE_SWAPPED_VEC_0_15_PG,
+ &MASTER_RX_LANE_SWAPPED_VEC_16_31_PG,
+ &MASTER_RX_INIT_STATE_PG,
+ &MASTER_RX_WIRETEST_STATE_PG,
+ &MASTER_RX_WIRETEST_LANEINFO_PG,
+ &MASTER_RX_TRAINING_STATUS_PG,
+ &MASTER_RX_WT_CLK_STATUS_PG
+ };
+
+ ecmdDataBufferBase *SLAVE_BUFFERS[NUM_PG_REGS]= { &SLAVE_RX_LANE_BAD_0_15_PG,
+ &SLAVE_RX_LANE_BAD_16_31_PG,
+ &SLAVE_RX_LANE_DISABLED_VEC_0_15_PG,
+ &SLAVE_RX_LANE_DISABLED_VEC_16_31_PG,
+ &SLAVE_RX_LANE_SWAPPED_VEC_0_15_PG,
+ &SLAVE_RX_LANE_SWAPPED_VEC_16_31_PG,
+ &SLAVE_RX_INIT_STATE_PG,
+ &SLAVE_RX_WIRETEST_STATE_PG,
+ &SLAVE_RX_WIRETEST_LANEINFO_PG,
+ &SLAVE_RX_TRAINING_STATUS_PG,
+ &SLAVE_RX_WT_CLK_STATUS_PG
+ };
FAPI_DBG("dump_ffdc_wiretest function entered \n");
+
+
- // DO MASTER HERE
- // Read rx_lane_bad_vec_0_15_pg & rx_lane_bad_vec_16_32_pg
- if(master_chip_interface==CP_FABRIC_X0)
- {
- rc=GCR_read(master_chip_target , master_chip_interface, ei4_rx_lane_bad_vec_0_15_pg, master_group,0, master_lane_bad_vec_0_15_data);
- }
- else
- {
- rc=GCR_read(master_chip_target , master_chip_interface, rx_lane_bad_vec_0_15_pg, master_group,0, master_lane_bad_vec_0_15_data);
- }
- if (rc)
- {
- FAPI_ERR("io_run_training : Error Reading rx_lane_bad_vec_0_15");
- }
- //avoiding else on purpose.. I want to try reading the second registe if first one on master fails
- if(master_chip_interface==CP_FABRIC_X0)
- {
- rc=GCR_read(master_chip_target , master_chip_interface, ei4_rx_lane_bad_vec_16_31_pg, master_group,0, master_lane_bad_vec_16_31_data);
- }
- else
- {
- rc=GCR_read(master_chip_target , master_chip_interface, rx_lane_bad_vec_16_31_pg, master_group,0, master_lane_bad_vec_16_31_data);
- }
- if (rc) {
- FAPI_ERR("io_run_training : Error Reading rx_lane_bad_vec_16_31");
- }
- // Not doing the else here on purpose.. if read on master fails .. we want to try reading slave side
+ // Capture MASTER Side registers
+
+ uint32_t rx_lane_end=num_rxlanes_per_group[master_chip_interface];
- // DO SLAVE HERE
- if(slave_chip_interface==CP_FABRIC_X0)
- {
- rc=GCR_read(slave_chip_target , slave_chip_interface, ei4_rx_lane_bad_vec_0_15_pg, slave_group,0, slave_lane_bad_vec_0_15_data);
- }
- else
- {
- rc=GCR_read(slave_chip_target , slave_chip_interface, rx_lane_bad_vec_0_15_pg, slave_group,0, slave_lane_bad_vec_0_15_data);
- }
- if (rc)
- {
- FAPI_ERR("io_run_training : Error Reading rx_lane_bad_vec_0_15 on slave chip");
-
- }
- if(slave_chip_interface==CP_FABRIC_X0)
- {
- rc=GCR_read(slave_chip_target , slave_chip_interface, ei4_rx_lane_bad_vec_16_31_pg, slave_group,0, slave_lane_bad_vec_16_31_data);
- }
- else
- {
- rc=GCR_read(slave_chip_target , slave_chip_interface, rx_lane_bad_vec_16_31_pg, slave_group,0, slave_lane_bad_vec_16_31_data);
- }
- if (rc) {
- FAPI_ERR("io_run_training : Error Reading rx_lane_bad_vec_16_31 on slave chip");
- }
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on MASTER side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(master_chip_target , master_chip_interface, pg_reg_list[reg_num], master_group,0, *MASTER_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+
+ }
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on SLAVE side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pg_reg_list[reg_num], slave_group,0, *SLAVE_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ FAPI_SET_HWP_ERROR(lane_rc,IO_FUNCS_WIRETEST_FAIL_RC);
+
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ FAPI_DBG("Reading per lane register RX_WT_STATUS_PL on lane %d",lane);
+ rc=GCR_read(master_chip_target , master_chip_interface, rx_wt_status_pl, master_group,lane, RX_WT_STATUS_PL);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading RX_WT_STATUS_PL");
+ }
+ else{
+ // we will continue to try other lanes data
+ const fapi::Target & CHIP_TARGET= master_chip_target;
+ uint32_t &LANEID=lane;
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_WIRETEST_FAIL_LANE_MASTER_DATA_RC);
+ }
+ }
+
+
+ // Capture SLAVE Side registers
+ rx_lane_end=num_rxlanes_per_group[slave_chip_interface];
+
+
+
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ FAPI_DBG("Reading per lane register RX_WT_STATUS_PL on lane %d",lane);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, rx_wt_status_pl, slave_group,lane, RX_WT_STATUS_PL);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading RX_WT_STATUS_PL");
+ }
+ else{
+ const fapi::Target & CHIP_TARGET= slave_chip_target;
+ uint32_t &LANEID=lane;
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_WIRETEST_FAIL_LANE_SLAVE_DATA_RC);
+ }
+ }
+
+ return(lane_rc);
+}
+
+
+ //rx_rxdsm_state
+ // rx_deskew_failed --> rx_training_status_pg
+ // rx_bad_block_lock --> rx_deskew_stat_pl
+ // rx_bad_skew --> rx_deskew_stat_pl
+ // rx_bad_deskew --> rx_deskew_stat_pl
+ // rx_some_skew_valid --> rx_stat_pl
+ // rx_some_block_locked --> rx_stat_pl
+ // rx_skew_value --> rx_stat_pl
+ // rx_vref --> rx_vref_pl
+ // rx_fifo_l2u_dly --> rx_fifo_stat_pl
+ // rx_phaserot_val --> rx_prot_status_pl
+
+ReturnCode edi_training::dump_ffdc_deskew(const Target& master_chip_target, io_interface_t master_chip_interface ,uint32_t master_group, const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,uint32_t slave_group)
+{
+ ReturnCode rc;
+ ReturnCode lane_rc; // for logging per lane FFDC
+
+ const fapi::Target &MASTER_TARGET=master_chip_target;
+ const fapi::Target &SLAVE_TARGET=slave_chip_target;
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
+
+ //FFDC Buffers;
+ ecmdDataBufferBase MASTER_RX_INIT_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase MASTER_RX_DESKEW_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_16_31_PG(16);
+
+ ecmdDataBufferBase SLAVE_RX_INIT_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase SLAVE_RX_DESKEW_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_16_31_PG(16);
+
+
+ //These are for per-lane FFDC captures
+ ecmdDataBufferBase RX_DESKEW_STAT_PL(16);
+ ecmdDataBufferBase RX_STAT_PL(16);
+ ecmdDataBufferBase RX_FIFO_STAT_PL(16);
+ ecmdDataBufferBase RX_PROT_STATUS_PL(16);
+
+ //EI4 only
+ ecmdDataBufferBase RX_VREF_PL(16);
+
+ const uint32_t NUM_PG_REGS=5;
+ const uint32_t NUM_PL_REGS=5;
+
+ const GCR_sub_registers pg_reg_list[NUM_PG_REGS]={rx_init_state_pg,rx_training_status_pg,rx_deskew_state_pg,rx_lane_bad_vec_0_15_pg,rx_lane_bad_vec_16_31_pg};
+
+ const GCR_sub_registers pl_reg_list[NUM_PL_REGS]={rx_deskew_stat_pl,rx_stat_pl,rx_fifo_stat_pl,rx_prot_status_pl,ei4_rx_vref_pl};
+
+ ecmdDataBufferBase *MASTER_BUFFERS[NUM_PG_REGS+NUM_PL_REGS]= { &MASTER_RX_INIT_STATE_PG,
+ &MASTER_RX_TRAINING_STATUS_PG,
+ &MASTER_RX_DESKEW_STATE_PG,&MASTER_RX_LANE_BAD_0_15_PG,&MASTER_RX_LANE_BAD_16_31_PG,
+ &RX_DESKEW_STAT_PL,
+ &RX_STAT_PL,
+ &RX_FIFO_STAT_PL,
+ &RX_PROT_STATUS_PL,
+ &RX_VREF_PL
+ };
+
+ ecmdDataBufferBase *SLAVE_BUFFERS[NUM_PG_REGS+NUM_PL_REGS]= { &SLAVE_RX_INIT_STATE_PG,
+ &SLAVE_RX_TRAINING_STATUS_PG,
+ & SLAVE_RX_DESKEW_STATE_PG,&SLAVE_RX_LANE_BAD_0_15_PG,&SLAVE_RX_LANE_BAD_16_31_PG,
+ &RX_DESKEW_STAT_PL,
+ &RX_STAT_PL,
+ &RX_FIFO_STAT_PL,
+ &RX_PROT_STATUS_PL,
+ &RX_VREF_PL
+ };
+
+
+ FAPI_DBG("dump_ffdc_deskew function entered \n");
+
+ // Capture MASTER Side registers
+
+ uint32_t rx_lane_end=num_rxlanes_per_group[master_chip_interface];
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on MASTER side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(master_chip_target , master_chip_interface, pg_reg_list[reg_num], master_group,0, *MASTER_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on SLAVE side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pg_reg_list[reg_num], slave_group,0, *SLAVE_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ FAPI_SET_HWP_ERROR(lane_rc,IO_FUNCS_DESKEW_FAIL_RC);
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ for(uint32_t lane_reg_num=0;lane_reg_num<NUM_PL_REGS;++lane_reg_num){
+ if(master_chip_interface!=CP_FABRIC_X0 && pl_reg_list[lane_reg_num] ==ei4_rx_vref_pl ){
+ continue; // VREF PL valid only for X bus
+ }
+ FAPI_DBG("Reading per lane register %s on lane %d",GCR_sub_reg_names[pl_reg_list[lane_reg_num]],lane);
+ rc=GCR_read(master_chip_target , master_chip_interface, pl_reg_list[lane_reg_num], master_group,lane, *MASTER_BUFFERS[NUM_PG_REGS+lane_reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pl_reg_list[lane_reg_num]]);
+ }
+ else{
+ // we will continue to try other lanes data
+ const fapi::Target & CHIP_TARGET= master_chip_target;
+ uint32_t &LANEID=lane;
+ FAPI_SET_HWP_ERROR(lane_rc,IO_FUNCS_DESKEW_FAIL_LANE_MASTER_DATA_RC);
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_DESKEW_FAIL_LANE_MASTER_DATA_RC);
+ }
+ }
+ }
+
+
+ // Capture SLAVE Side registers
+ rx_lane_end=num_rxlanes_per_group[slave_chip_interface];
+
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ for(uint32_t lane_reg_num=0;lane_reg_num<NUM_PL_REGS;++lane_reg_num){
+ if(slave_chip_interface!=CP_FABRIC_X0 && pl_reg_list[lane_reg_num] ==ei4_rx_vref_pl ){
+ continue; // VREF PL valid only for X bus
+ }
+ FAPI_DBG("Reading per lane register %s on lane %d",GCR_sub_reg_names[pl_reg_list[lane_reg_num]],lane);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pl_reg_list[lane_reg_num], slave_group,lane, *SLAVE_BUFFERS[NUM_PG_REGS+lane_reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pl_reg_list[lane_reg_num]]);
+ }
+ else{
+ // we will continue to try other lanes data
+ const fapi::Target & CHIP_TARGET= slave_chip_target;
+ uint32_t &LANEID=lane;
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_DESKEW_FAIL_LANE_SLAVE_DATA_RC);
+ }
+ }
+ }
+
+
+
+ return(lane_rc);
+}
+
+
+// FFDC AS per Rob
+//
+//rx_eye_opt_failed --> rx_training_status_pg
+//rx_eye_opt_state rx_eo_recal_pg
+//rx_ap_even_samp rx_ap_pl
+//rx_ap_odd_samp rx_ap_pl
+//rx_an_even_samp rx_an_pl
+//rx_an_odd_samp rx_an_pl
+//rx_amin_even rx_amin_pl
+//rx_amin_odd rx_amin_pl
+//rx_h1_even_samp1 rx_h1_even_pl
+//rx_h1_even_samp0 rx_h1_even_pl
+//rx_h1_odd_samp1 rx_h1_odd_pl
+//rx_h1_odd_samp0 rx_h1_odd_pl
+//rx_bad_eye_opt_ber rx_eye_opt_stat_pl
+//rx_bad_eye_opt_width rx_eye_opt_stat_pl
+//rx_bad_eye_opt_height rx_eye_opt_stat_pl
+//rx_bad_eye_opt_ddc rx_eye_opt_stat_pl
+//rx_eye_width rx_eye_width_status_pl
+//rx_hist_min_eye_width_valid rx_eye_width_status_pl
+//rx_hist_min_eye_width rx_eye_width_status_pl
+//rx_dcd_adjust rx_dcd_adj_pl
+
+ReturnCode edi_training::dump_ffdc_eyeopt(const Target& master_chip_target, io_interface_t master_chip_interface ,uint32_t master_group, const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,uint32_t slave_group)
+{
+ ReturnCode rc;
+ ReturnCode lane_rc; // for logging per lane FFDC
+
+ const fapi::Target &MASTER_TARGET=master_chip_target;
+ const fapi::Target &SLAVE_TARGET=slave_chip_target;
+
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
+ //FFDC Buffers;
+ ecmdDataBufferBase MASTER_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase MASTER_RX_EO_RECAL_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase MASTER_RX_LANE_BAD_16_31_PG(16);
+
+ ecmdDataBufferBase SLAVE_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase SLAVE_RX_EO_RECAL_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_0_15_PG(16);
+ ecmdDataBufferBase SLAVE_RX_LANE_BAD_16_31_PG(16);
+
+
+ //These are for per-lane FFDC captures
+ ecmdDataBufferBase RX_AP_PL(16);// EDI only
+ ecmdDataBufferBase RX_AN_PL(16);// EDI only
+ ecmdDataBufferBase RX_AMIN_PL(16);// EDI only
+ ecmdDataBufferBase RX_H1_EVEN_PL(16);// EDI only
+ ecmdDataBufferBase RX_H1_ODD_PL(16);// EDI only
+ ecmdDataBufferBase RX_EYE_OPT_STATE_PL(16); // both
+ ecmdDataBufferBase RX_EYE_WIDTH_STATUS_PL(16); //both
+ ecmdDataBufferBase RX_DCD_ADJ_PL(16); // ei4 only
+
+ const uint32_t NUM_PG_REGS=4;
+ const uint32_t NUM_PL_REGS=8;
+
+ const GCR_sub_registers pg_reg_list[NUM_PG_REGS]={rx_training_status_pg,rx_eo_recal_pg,rx_lane_bad_vec_0_15_pg,rx_lane_bad_vec_16_31_pg};
+
+ const GCR_sub_registers pl_reg_list[NUM_PL_REGS]={rx_ap_pl,rx_an_pl,rx_amin_pl,rx_h1_even_pl,rx_h1_odd_pl,rx_eye_opt_stat_pl,rx_eye_width_status_pl,ei4_rx_dcd_adj_pl};
+
+ ecmdDataBufferBase *MASTER_BUFFERS[NUM_PG_REGS+NUM_PL_REGS]= { &MASTER_RX_TRAINING_STATUS_PG,
+ &MASTER_RX_EO_RECAL_PG,&MASTER_RX_LANE_BAD_0_15_PG,&MASTER_RX_LANE_BAD_16_31_PG,
+ &RX_AP_PL,
+ &RX_AN_PL,
+ &RX_AMIN_PL,
+ &RX_H1_EVEN_PL,
+ &RX_H1_ODD_PL,
+ &RX_EYE_OPT_STATE_PL,
+ &RX_EYE_WIDTH_STATUS_PL,
+ &RX_DCD_ADJ_PL
+ };
+
+
+ ecmdDataBufferBase *SLAVE_BUFFERS[NUM_PG_REGS+NUM_PL_REGS]= { &SLAVE_RX_TRAINING_STATUS_PG,
+ &SLAVE_RX_EO_RECAL_PG,&SLAVE_RX_LANE_BAD_0_15_PG,&SLAVE_RX_LANE_BAD_16_31_PG,
+ &RX_AP_PL,
+ &RX_AN_PL,
+ &RX_AMIN_PL,
+ &RX_H1_EVEN_PL,
+ &RX_H1_ODD_PL,
+ &RX_EYE_OPT_STATE_PL,
+ &RX_EYE_WIDTH_STATUS_PL,
+ &RX_DCD_ADJ_PL
+ };
+
+
+
+ FAPI_DBG("dump_ffdc_eyeopt function entered \n");
+
+ // Capture MASTER Side registers
+
+ uint32_t rx_lane_end=num_rxlanes_per_group[master_chip_interface];
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on MASTER side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(master_chip_target , master_chip_interface, pg_reg_list[reg_num], master_group,0, *MASTER_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on SLAVE side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pg_reg_list[reg_num], slave_group,0, *SLAVE_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ FAPI_SET_HWP_ERROR(lane_rc,IO_FUNCS_EYEOPT_FAIL_RC);
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ for(uint32_t lane_reg_num=0;lane_reg_num<NUM_PL_REGS;++lane_reg_num){
+ if(master_chip_interface!=CP_FABRIC_X0 && pl_reg_list[lane_reg_num] ==ei4_rx_dcd_adj_pl ){
+ continue; // DCD ADJ PL valid only for X bus
+ }
+ if(master_chip_interface==CP_FABRIC_X0 && lane_reg_num<5 ){
+ continue; // Only 7,8,9 regs valid on X bus
+ }
+ FAPI_DBG("Reading per lane register %s on lane %d",GCR_sub_reg_names[pl_reg_list[lane_reg_num]],lane);
+ rc=GCR_read(master_chip_target , master_chip_interface, pl_reg_list[lane_reg_num], master_group,lane, *MASTER_BUFFERS[NUM_PG_REGS+lane_reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pl_reg_list[lane_reg_num]]);
+ }
+ else{
+ // we will continue to try other lanes data
+ const fapi::Target & CHIP_TARGET= master_chip_target;
+ uint32_t &LANEID=lane;
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_EYEOPT_FAIL_LANE_MASTER_DATA_RC);
+ }
+ }
+ }
+
+
+ // Capture SLAVE Side registers
+ rx_lane_end=num_rxlanes_per_group[slave_chip_interface];
+
+ //Lets do per-lane registers now , will Log and continue instead of wasting buffers and making it complex
+ for(uint32_t lane=0;lane<rx_lane_end;++lane){
+ for(uint32_t lane_reg_num=0;lane_reg_num<NUM_PL_REGS;++lane_reg_num){
+ if(slave_chip_interface!=CP_FABRIC_X0 && pl_reg_list[lane_reg_num] ==ei4_rx_dcd_adj_pl ){
+ continue; // DCD ADJ PL valid only for X bus
+ }
+ if(slave_chip_interface==CP_FABRIC_X0 && lane_reg_num<5 ){
+ continue; // Only 7,8,9 regs valid on X bus
+ }
+ FAPI_DBG("Reading per lane register %s on lane %d",GCR_sub_reg_names[pl_reg_list[lane_reg_num]],lane);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pl_reg_list[lane_reg_num], slave_group,lane, *SLAVE_BUFFERS[NUM_PG_REGS+lane_reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pl_reg_list[lane_reg_num]]);
+ }
+ else{
+ // we will continue to try other lanes data
+ const fapi::Target & CHIP_TARGET= slave_chip_target;
+ uint32_t &LANEID=lane;
+ //as per Andrea to save log space
+ FAPI_ADD_INFO_TO_HWP_ERROR(lane_rc,IO_FUNCS_EYEOPT_FAIL_LANE_SLAVE_DATA_RC);
+ }
+ }
+ }
+
+
+
+ return(lane_rc);
+}
+
+//FFDC for repair
+//rx_rpr_state rx_static_repair_state_pg
+//rx_repair_failed rx_training_status_pg
+//rx_bad_lane1_gcrmsg rx_bad_lane_enc_gcrmsg_pg
+//rx_bad_lane2_gcrmsgrx_bad_lane_enc_gcrmsg_pg
+
+ReturnCode edi_training::dump_ffdc_repair(const Target& master_chip_target, io_interface_t master_chip_interface ,uint32_t master_group, const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,uint32_t slave_group)
+{
+ ReturnCode rc;
+ ReturnCode lane_rc; // for logging per lane FFDC
+
+ const fapi::Target &MASTER_TARGET=master_chip_target;
+ const fapi::Target &SLAVE_TARGET=slave_chip_target;
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
+ //FFDC Buffers;
+ ecmdDataBufferBase MASTER_RX_STATIC_REPAIR_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase MASTER_RX_BAD_LANE_ENC_GCRMSG_PG(16);
+
+ ecmdDataBufferBase SLAVE_RX_STATIC_REPAIR_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_TRAINING_STATUS_PG(16);
+ ecmdDataBufferBase SLAVE_RX_BAD_LANE_ENC_GCRMSG_PG(16);
+
+
+
+ const uint32_t NUM_PG_REGS=3;
+
+ const GCR_sub_registers pg_reg_list[NUM_PG_REGS]={rx_static_repair_state_pg,rx_training_status_pg,rx_bad_lane_enc_gcrmsg_pg};
+
+
+ ecmdDataBufferBase *MASTER_BUFFERS[NUM_PG_REGS]= {
+ &MASTER_RX_STATIC_REPAIR_STATE_PG,
+ &MASTER_RX_TRAINING_STATUS_PG,
+ &MASTER_RX_BAD_LANE_ENC_GCRMSG_PG,
+ };
+
+
+ ecmdDataBufferBase *SLAVE_BUFFERS[NUM_PG_REGS]= {
+ &SLAVE_RX_STATIC_REPAIR_STATE_PG,
+ &SLAVE_RX_TRAINING_STATUS_PG,
+ &SLAVE_RX_BAD_LANE_ENC_GCRMSG_PG,
+ };
+
+
+
+
+ FAPI_DBG("dump_ffdc_repair function entered \n");
+
+ // Capture MASTER Side registers
+
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on MASTER side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(master_chip_target , master_chip_interface, pg_reg_list[reg_num], master_group,0, *MASTER_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on SLAVE side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pg_reg_list[reg_num], slave_group,0, *SLAVE_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ FAPI_SET_HWP_ERROR(rc,IO_FUNCS_REPAIR_FAIL_RC);
return(rc);
}
+ReturnCode edi_training::dump_ffdc_func(const Target& master_chip_target, io_interface_t master_chip_interface ,uint32_t master_group, const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,uint32_t slave_group)
+{
+ ReturnCode rc;
+ ReturnCode lane_rc; // for logging per lane FFDC
+
+ const fapi::Target &MASTER_TARGET=master_chip_target;
+ const fapi::Target &SLAVE_TARGET=slave_chip_target;
+ const io_interface_t& MASTER_CHIP_INTERFACE = master_chip_interface;
+ const uint32_t& MASTER_GROUP = master_group;
+ const io_interface_t& SLAVE_CHIP_INTERFACE = slave_chip_interface;
+ const uint32_t& SLAVE_GROUP = slave_group;
+
+ //FFDC Buffers;
+ ecmdDataBufferBase MASTER_RX_FUNC_STATE_PG(16);
+ ecmdDataBufferBase MASTER_RX_TRAINING_STATUS_PG(16);
+
+ ecmdDataBufferBase SLAVE_RX_FUNC_STATE_PG(16);
+ ecmdDataBufferBase SLAVE_RX_TRAINING_STATUS_PG(16);
+
+
+
+ const uint32_t NUM_PG_REGS=2;
+
+ const GCR_sub_registers pg_reg_list[NUM_PG_REGS]={rx_func_state_pg,rx_training_status_pg};
+
+
+ ecmdDataBufferBase *MASTER_BUFFERS[NUM_PG_REGS]= {
+ &MASTER_RX_FUNC_STATE_PG,
+ &MASTER_RX_TRAINING_STATUS_PG,
+ };
+
+
+ ecmdDataBufferBase *SLAVE_BUFFERS[NUM_PG_REGS]= {
+ &SLAVE_RX_FUNC_STATE_PG,
+ &SLAVE_RX_TRAINING_STATUS_PG,
+ };
+
+
+
+
+ FAPI_DBG("dump_ffdc_func function entered \n");
+
+ // Capture MASTER Side registers
+
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on MASTER side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(master_chip_target , master_chip_interface, pg_reg_list[reg_num], master_group,0, *MASTER_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ for(uint32_t reg_num=0;reg_num<NUM_PG_REGS;++reg_num){
+ FAPI_DBG("Reading register name %s on SLAVE side",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ rc=GCR_read(slave_chip_target , slave_chip_interface, pg_reg_list[reg_num], slave_group,0, *SLAVE_BUFFERS[reg_num]);
+ if (rc)
+ {
+ FAPI_ERR("io_run_training : Error Reading %s",GCR_sub_reg_names[pg_reg_list[reg_num]]);
+ }
+ // Not doing the else here on purpose.. if read on one reg fails , we want to try next and maybe the slave side if all fails
+ }
+
+ FAPI_SET_HWP_ERROR(rc,IO_FUNCS_FUNC_FAIL_RC);
+ return(rc);
+}
}
diff --git a/src/usr/hwpf/hwp/bus_training/io_funcs.H b/src/usr/hwpf/hwp/bus_training/io_funcs.H
index c5d061834..3ed1d2a21 100644
--- a/src/usr/hwpf/hwp/bus_training/io_funcs.H
+++ b/src/usr/hwpf/hwp/bus_training/io_funcs.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* COPYRIGHT International Business Machines Corp. 2012,2014 */
/* */
/* p1 */
/* */
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_funcs.H,v 1.16 2013/11/25 07:10:39 varkeykv Exp $
+// $Id: io_funcs.H,v 1.17 2014/02/20 13:27:29 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -139,6 +139,42 @@ public:
io_interface_t slave_chip_interface,
uint32_t slave_group
);
+
+ // First Fail Data Capture Routines
+ // Deskew First Fail Data Capture
+ ReturnCode dump_ffdc_deskew(const Target& master_chip_target,
+ io_interface_t master_chip_interface ,
+ uint32_t master_group,
+ const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,
+ uint32_t slave_group
+ );
+
+ // Eye opt First Fail Data Capture
+ ReturnCode dump_ffdc_eyeopt(const Target& master_chip_target,
+ io_interface_t master_chip_interface ,
+ uint32_t master_group,
+ const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,
+ uint32_t slave_group
+ );
+
+ // Repair First Fail Data Capture
+ ReturnCode dump_ffdc_repair(const Target& master_chip_target,
+ io_interface_t master_chip_interface ,
+ uint32_t master_group,
+ const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,
+ uint32_t slave_group
+ );
+ // FUnc mode First Fail Data Capture
+ ReturnCode dump_ffdc_func(const Target& master_chip_target,
+ io_interface_t master_chip_interface ,
+ uint32_t master_group,
+ const Target& slave_chip_target ,
+ io_interface_t slave_chip_interface,
+ uint32_t slave_group
+ );
// Utility functions
// Determines if target chip is a Master (reads rx_master_mode bit)
diff --git a/src/usr/hwpf/hwp/bus_training/io_funcs_errors.xml b/src/usr/hwpf/hwp/bus_training/io_funcs_errors.xml
new file mode 100644
index 000000000..1d34406e4
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_funcs_errors.xml
@@ -0,0 +1,435 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_funcs_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_funcs_errors.xml,v 1.4 2014/03/18 14:58:41 jgrell Exp $ -->
+
+<hwpErrors>
+
+ <!-- **********************TIMEOUT FAILS************************************************* -->
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_WIRETEST_TIMEOUT_RC</rc>
+ <ffdc>FFDC_NUM_CYCLES</ffdc>
+ <description>io run training wiretest timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_DESKEW_TIMEOUT_RC</rc>
+ <ffdc>FFDC_NUM_CYCLES</ffdc>
+ <description>io run training deskew timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_EYEOPT_TIMEOUT_RC</rc>
+ <ffdc>FFDC_NUM_CYCLES</ffdc>
+ <description>io run training Eyeopt timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_REPAIR_TIMEOUT_RC</rc>
+ <ffdc>FFDC_NUM_CYCLES</ffdc>
+ <description>io run training repair timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_FUNC_MODE_TIMEOUT_RC</rc>
+ <ffdc>FFDC_NUM_CYCLES</ffdc>
+ <description>io run training functional mode timed out waiting for pass/fail indication in the p8 or centaur Status Registers</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_WIRETEST_FAIL_RC</rc>
+ <description>Wiretest Training fail was reported in a P8 or Centaur status register</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <ffdc>MASTER_RX_LANE_DISABLED_VEC_0_15_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_DISABLED_VEC_16_31_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_SWAPPED_VEC_0_15_PG</ffdc>
+ <ffdc>MASTER_RX_INIT_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_WIRETEST_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_WIRETEST_LANEINFO_PG</ffdc>
+ <ffdc>MASTER_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>MASTER_RX_WT_CLK_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_DISABLED_VEC_0_15_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_DISABLED_VEC_16_31_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_SWAPPED_VEC_0_15_PG</ffdc>
+ <ffdc>SLAVE_RX_INIT_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_WIRETEST_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_WIRETEST_LANEINFO_PG</ffdc>
+ <ffdc>SLAVE_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_WT_CLK_STATUS_PG</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+
+
+ <hwpError>
+ <rc>IO_FUNCS_WIRETEST_FAIL_LANE_MASTER_DATA_RC</rc>
+ <description>FFDC for Wiretest failure in training ( PER LANE MASTER DATA ) </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_WT_STATUS_PL</ffdc>
+ </hwpError>
+
+ <hwpError>
+ <rc>IO_FUNCS_WIRETEST_FAIL_LANE_SLAVE_DATA_RC</rc>
+ <description>FFDC for Wiretest failure in training (PER LANE SLAVE DATA ) </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_WT_STATUS_PL</ffdc>
+ </hwpError>
+
+ <!-- ********************DESKEW *************************************************** -->
+
+ <hwpError>
+ <rc>IO_FUNCS_DESKEW_FAIL_RC</rc>
+ <description>Deskew Training fail was reported in a P8 or Centaur status register</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <ffdc>MASTER_RX_INIT_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>MASTER_RX_DESKEW_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_BAD_0_15_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_BAD_16_31_PG</ffdc>
+ <ffdc>SLAVE_RX_INIT_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_DESKEW_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_BAD_0_15_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_BAD_16_31_PG</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+
+
+
+ <hwpError>
+ <rc>IO_FUNCS_DESKEW_FAIL_LANE_MASTER_DATA_RC</rc>
+ <description>FFDC for Deskew in training ( PER LANE MASTER DATA )</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_DESKEW_STAT_PL</ffdc>
+ <ffdc>RX_STAT_PL</ffdc>
+ <ffdc>RX_VREF_PL</ffdc>
+ <ffdc>RX_FIFO_STAT_PL</ffdc>
+ <ffdc>RX_PROT_STATUS_PL</ffdc>
+ </hwpError>
+
+ <hwpError>
+ <rc>IO_FUNCS_DESKEW_FAIL_LANE_SLAVE_DATA_RC</rc>
+ <description>FFDC for Deskew in training ( PER LANE SLAVE DATA )</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_DESKEW_STAT_PL</ffdc>
+ <ffdc>RX_STAT_PL</ffdc>
+ <ffdc>RX_VREF_PL</ffdc>
+ <ffdc>RX_FIFO_STAT_PL</ffdc>
+ <ffdc>RX_PROT_STATUS_PL</ffdc>
+ </hwpError>
+
+ <!-- ********************EYEOPT*************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_EYEOPT_FAIL_RC</rc>
+ <description>Eye Optimization Training fail was reported in a P8 or Centaur status register</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <ffdc>MASTER_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>MASTER_RX_EO_RECAL_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_BAD_0_15_PG</ffdc>
+ <ffdc>MASTER_RX_LANE_BAD_16_31_PG</ffdc>
+ <ffdc>SLAVE_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_EO_RECAL_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_BAD_0_15_PG</ffdc>
+ <ffdc>SLAVE_RX_LANE_BAD_16_31_PG</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+
+
+ <hwpError>
+ <rc>IO_FUNCS_EYEOPT_FAIL_LANE_MASTER_DATA_RC</rc>
+ <description>FFDC for Deskew in training ( PER LANE MASTER DATA )</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_AP_PL</ffdc>
+ <ffdc>RX_AN_PL</ffdc>
+ <ffdc>RX_AMIN_PL</ffdc>
+ <ffdc>RX_H1_EVEN_PL</ffdc>
+ <ffdc>RX_H1_ODD_PL</ffdc>
+ <ffdc>RX_EYE_OPT_STATE_PL</ffdc>
+ <ffdc>RX_EYE_WIDTH_STATUS_PL</ffdc>
+ <ffdc>RX_DCD_ADJ_PL</ffdc>
+
+ </hwpError>
+
+ <hwpError>
+ <rc>IO_FUNCS_EYEOPT_FAIL_LANE_SLAVE_DATA_RC</rc>
+ <description>FFDC for Deskew in training ( PER LANE SLAVE DATA )</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>LANEID</ffdc>
+ <ffdc>RX_AP_PL</ffdc>
+ <ffdc>RX_AN_PL</ffdc>
+ <ffdc>RX_AMIN_PL</ffdc>
+ <ffdc>RX_H1_EVEN_PL</ffdc>
+ <ffdc>RX_H1_ODD_PL</ffdc>
+ <ffdc>RX_EYE_OPT_STATE_PL</ffdc>
+ <ffdc>RX_EYE_WIDTH_STATUS_PL</ffdc>
+ <ffdc>RX_DCD_ADJ_PL</ffdc>
+
+ </hwpError>
+
+
+ <!-- ********************REPAIR *************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_REPAIR_FAIL_RC</rc>
+ <description>Static Repair Training fail was reported in a P8 or Centaur status register</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <ffdc>MASTER_RX_STATIC_REPAIR_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>MASTER_RX_BAD_LANE_ENC_GCRMSG_PG</ffdc>
+ <ffdc>SLAVE_RX_STATIC_REPAIR_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_BAD_LANE_ENC_GCRMSG_PG</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+
+
+ <!-- ********************FUNC MODE *************************************************** -->
+ <hwpError>
+ <rc>IO_FUNCS_FUNC_FAIL_RC</rc>
+ <description>Functional mode Training fail was reported in a P8 or Centaur status register</description>
+ <ffdc>MASTER_CHIP_INTERFACE</ffdc>
+ <ffdc>MASTER_GROUP</ffdc>
+ <ffdc>SLAVE_CHIP_INTERFACE</ffdc>
+ <ffdc>SLAVE_GROUP</ffdc>
+ <ffdc>MASTER_RX_FUNC_STATE_PG</ffdc>
+ <ffdc>MASTER_RX_TRAINING_STATUS_PG</ffdc>
+ <ffdc>SLAVE_RX_FUNC_STATE_PG</ffdc>
+ <ffdc>SLAVE_RX_TRAINING_STATUS_PG</ffdc>
+ <callout>
+ <target>MASTER_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>SLAVE_TARGET</target>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <bus>MASTER_TARGET,SLAVE_TARGET</bus>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>SLAVE_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>SLAVE_TARGET</target>
+ </gard>
+ </hwpError>
+
+
+ </hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.C b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.C
index 4133f68a5..7b7675652 100644
--- a/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.C
+++ b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_power_down_lanes.C,v 1.12 2014/02/14 09:04:48 varkeykv Exp $
+// $Id: io_power_down_lanes.C,v 1.13 2014/03/06 11:12:24 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -35,7 +35,7 @@
// *! BACKUP NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
// *!
// *!***************************************************************************
-// CHANGE HISTORY:
+// CHANGE HISTORY:
//------------------------------------------------------------------------------
// Version:|Author: | Date: | Comment:
// --------|--------|--------|--------------------------------------------------
@@ -60,159 +60,171 @@ using namespace fapi;
ReturnCode io_power_down_lanes(const Target& target,const std::vector<uint8_t> &tx_lanes,const std::vector<uint8_t> &rx_lanes)
{
- ReturnCode rc;
- ecmdDataBufferBase data(16);
- ecmdDataBufferBase mask(16);
- ecmdDataBufferBase mode_reg(16);
- uint8_t lane=0;
- bool msbswap=false;
- const uint8_t xbus_lanes_per_group=20;
- uint8_t end_lane=0;
+ ReturnCode rc;
+ ecmdDataBufferBase data(16);
+ ecmdDataBufferBase mask(16);
+ ecmdDataBufferBase mode_reg(16);
+ uint8_t lane=0;
+ bool msbswap=false;
+ const uint8_t xbus_lanes_per_group=20;
+ uint8_t end_lane=0;
- io_interface_t interface=CP_IOMC0_P0; // Since G
- uint32_t rc_ecmd=0;
- uint8_t clock_group=0;
- uint8_t start_group=0;
-
- rc_ecmd=mask.flushTo1();
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- // Both TX and RX power down bits are on bit 0
- rc_ecmd=mask.clearBit(0);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
+ io_interface_t interface=CP_IOMC0_P0; // Since G
+ uint32_t rc_ecmd=0;
+ uint8_t clock_group=0;
+ uint8_t start_group=0;
+
+ do
+ {
+ // Both TX and RX power down bits are on bit 0
+ rc_ecmd=mask.flushTo1();
+ rc_ecmd=mask.clearBit(0);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("io_power_down_lanes error occured while"
+ " flushing and clearing bits for mask");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
- // Check which type of bus this is and do setup needed
- if(target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT) {
- start_group=0;
- interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
- }
- else if(target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT ) {
- start_group=0;
- interface=CP_FABRIC_X0; // base scom for X bus
- }
- else if(target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET){
- start_group=3;
- interface=CP_IOMC0_P0; // base scom for MC bus
- }
- else if(target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP){
- start_group=0;
- interface=CEN_DMI; // base scom Centaur chip
- }
- else{
- FAPI_ERR("Invalid io_power_down_lanes HWP invocation");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
- return(rc);
- }
+ // Check which type of bus this is and do setup needed
+ fapi::TargetType l_type= target.getType();
+ switch (l_type)
+ {
+ case fapi::TARGET_TYPE_ABUS_ENDPOINT:
+ start_group=0;
+ interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
+ break;
+ case fapi::TARGET_TYPE_XBUS_ENDPOINT:
+ start_group=0;
+ interface=CP_FABRIC_X0; // base scom for X bus
+ break;
+ case fapi::TARGET_TYPE_MCS_CHIPLET:
+ start_group=3;
+ interface=CP_IOMC0_P0; // base scom for MC bus
+ break;
+ case fapi::TARGET_TYPE_MEMBUF_CHIP:
+ start_group=0;
+ interface=CEN_DMI; // base scom Centaur chip
+ break;
+ default:
+ FAPI_ERR("Invalid io_power_down_lanes HWP invocation");
+ const fapi::Target &TARGET=target;
+ FAPI_SET_HWP_ERROR(rc, IO_POWER_DOWN_LANES_INVALID_INVOCATION_RC);
+ break;
+ }
+ if (rc)
+ {
+ break;
+ }
- FAPI_INF("Power down IO lanes\n");
+ FAPI_INF("Power down IO lanes\n");
- rc_ecmd|=data.flushTo0();
- rc_ecmd|=data.setBit(0); // Power down is on bit 0 always
-
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
+ rc_ecmd|=data.flushTo0();
+ rc_ecmd|=data.setBit(0); // Power down is on bit 0 always
+ if(rc_ecmd)
+ {
+ FAPI_ERR("io_power_down_lanes error occured while"
+ " flushing and clearing bits for data");
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
- rc = GCR_read( target, interface,tx_mode_pg, start_group, 0, mode_reg);
- if(rc){return rc;}
+ rc = GCR_read( target, interface,tx_mode_pg, start_group, 0, mode_reg);
+ if(rc)
+ {
+ FAPI_ERR("GCR_read returned an error while reading tx_mode_pg");
+ break;
+ }
- if(mode_reg.isBitSet(5)){
- FAPI_DBG("TX MSB-LSB SWAP MODE ON on this target %d \n",tx_end_lane_id);
- msbswap=true;
- }
+ if(mode_reg.isBitSet(5))
+ {
+ FAPI_DBG("TX MSB-LSB SWAP MODE ON on this target %d \n",tx_end_lane_id);
+ msbswap=true;
+ }
- //TX Lanes power down
- for(uint8_t i=0;i<tx_lanes.size();++i){
- lane=tx_lanes[i];
- //For Xbus figure out the clock group number
- if(interface==CP_FABRIC_X0){
- clock_group=start_group;
- while(lane>(xbus_lanes_per_group-1)){
- lane=lane-xbus_lanes_per_group;
- clock_group++;
- }
- }
- else{
- clock_group=start_group;
- // MSBLSB SWAP condition can be there in MC or A
- if(msbswap){
- // We can read out tx_end_lane_id now for swap correction
- rc = GCR_read( target, interface,tx_id3_pg, clock_group, 0, mode_reg);
- if(rc){return rc;}
- rc_ecmd=mode_reg.extract(&end_lane,9,7);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- end_lane=end_lane>>1;// move left aligned extract by 1
- FAPI_DBG("END lane id is %d\n",end_lane);
- lane=end_lane-tx_lanes[i]; // GFW VPD does not know about MSBSWAP , this adjusts for swapping
- }
- }
- //Power down this lane
- rc = GCR_read( target,interface,tx_mode_pl, clock_group, lane, data);
- if(rc){return rc;}
- FAPI_DBG("read out tx_mode_pl successfully for clock group%d lane %d",clock_group,lane);
- rc_ecmd=data.setBit(0);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = GCR_write( target, interface, tx_mode_pl, clock_group, lane, data,mask );
- if(rc){return rc;}
- FAPI_DBG("Wrote tx_mode_pl successfullyfor clock group%d lane %d",clock_group,lane);
- }
+ //TX Lanes power down
+ for(uint8_t i=0;i<tx_lanes.size();++i)
+ {
+ lane=tx_lanes[i];
+ //For Xbus figure out the clock group number
+ if(interface==CP_FABRIC_X0)
+ {
+ clock_group=start_group;
+ while(lane>(xbus_lanes_per_group-1))
+ {
+ lane=lane-xbus_lanes_per_group;
+ clock_group++;
+ }
+ }
+ else
+ {
+ clock_group=start_group;
+ // MSBLSB SWAP condition can be there in MC or A
+ if(msbswap)
+ {
+ // We can read out tx_end_lane_id now for swap correction
+ rc = GCR_read( target, interface,tx_id3_pg, clock_group, 0, mode_reg);
+ if(rc)
+ {
+ FAPI_ERR("GCR_read returned an error during call to read tx_id3_pg");
+ break;
+ }
+
+ rc_ecmd=mode_reg.extract(&end_lane,9,7);
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ end_lane=end_lane>>1;// move left aligned extract by 1
+ FAPI_DBG("END lane id is %d\n",end_lane);
+ lane=end_lane-tx_lanes[i]; // GFW VPD does not know about MSBSWAP , this adjusts for swapping
+ }
+ }
+
+ //Power down this lane
+ rc = GCR_write( target, interface, tx_mode_pl, clock_group, lane, data,mask );
+ if(rc)
+ {
+ FAPI_ERR("GCR_write returned an error while writing tx_mode_pl");
+ break;
+ }
+ }
- // Process RX lane powerdown
- for(uint8_t i=0;i<rx_lanes.size();++i){
- lane=rx_lanes[i];
- //For X bus set the right clock group number
- if(interface==CP_FABRIC_X0){
- clock_group=start_group;
- while(lane>(xbus_lanes_per_group-1)){
- lane=lane-xbus_lanes_per_group;
- clock_group++;
- }
- }
- else{
- clock_group=start_group;
- }
- //Power down this lane
- rc = GCR_read( target,interface,rx_mode_pl, clock_group, lane, data);
- if(rc){return rc;}
- rc_ecmd=data.setBit(0);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = GCR_write( target, interface, rx_mode_pl, clock_group, lane, data,mask );
- if(rc){return rc;}
- FAPI_DBG("Read rx_mode_pl successfully for clock group%d lane %d",clock_group,lane);
- // As per Gary/ Defect SW244284 , as per Design team inputs add rx_wt_lane_disabled
- rc = GCR_read( target,interface, rx_wt_status_pl, clock_group, lane, data);
- if(rc){return rc;}
- rc_ecmd=data.setBit(0);
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = GCR_write( target, interface, rx_wt_status_pl, clock_group, lane, data,mask );
- FAPI_DBG("Wrote rx_mode_pl successfully for clock group%d lane %d",clock_group,lane);
- }
- return rc;
+ //break out of larger while loop
+ if (rc)
+ {
+ break;
+ }
+ // Process RX lane powerdown
+ for(uint8_t i=0;i<rx_lanes.size();++i)
+ {
+ lane=rx_lanes[i];
+ //For X bus set the right clock group number
+ if(interface==CP_FABRIC_X0)
+ {
+ clock_group=start_group;
+ while(lane>(xbus_lanes_per_group-1))
+ {
+ lane=lane-xbus_lanes_per_group;
+ clock_group++;
+ }
+ }
+ else
+ {
+ clock_group=start_group;
+ }
+ //Power down this lane
+ rc = GCR_write( target, interface, rx_mode_pl, clock_group, lane, data,mask );
+ if(rc)
+ {
+ FAPI_ERR("GCR_write returned an error while writing rx_mode_pl");
+ break;
+ }
+ }
+ }while(0);
+ return rc;
}
} //end extern C
diff --git a/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H
index 7db744d37..9cb3e2b3b 100644
--- a/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H
+++ b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H
@@ -1,11 +1,11 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
-/* $Source: src/usr/hwpf/hwp/io_power_down_lanes/io_power_down_lanes.H $ */
+/* $Source: src/usr/hwpf/hwp/bus_training/io_power_down_lanes.H $ */
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,12 +20,12 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_power_down_lanes.H,v 1.4 2013/02/12 07:32:04 varkeykv Exp $
+// $Id: io_power_down_lanes.H,v 1.5 2014/03/06 11:12:24 varkeykv Exp $
#ifndef IO_POWER_DOWN_LANES_H_
#define IO_POWER_DOWN_LANES_H_
-#include <fapi.H>
+#include <fapi.H>
/**
* @brief IO Power down lanes
diff --git a/src/usr/hwpf/hwp/bus_training/io_power_down_lanes_errors.xml b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes_errors.xml
new file mode 100644
index 000000000..11f5d44a9
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_power_down_lanes_errors.xml
@@ -0,0 +1,37 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_power_down_lanes_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_power_down_lanes_errors.xml,v 1.2 2014/03/18 14:58:41 jgrell Exp $ -->
+
+<!-- Error definitions for io_power_down_lanes.o_power_down_lanes.CC -->
+<hwpErrors>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_POWER_DOWN_LANES_INVALID_INVOCATION_RC</rc>
+ <description>io_power_down_lanes invoked with incorrect target type</description>
+ <ffdc>TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_read_erepair.C b/src/usr/hwpf/hwp/bus_training/io_read_erepair.C
index 16aae79d8..0aa7a399a 100644
--- a/src/usr/hwpf/hwp/bus_training/io_read_erepair.C
+++ b/src/usr/hwpf/hwp/bus_training/io_read_erepair.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_read_erepair.C,v 1.9 2014/02/04 15:16:02 varkeykv Exp $
+// $Id: io_read_erepair.C,v 1.11 2014/03/06 11:44:04 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -59,118 +59,133 @@ using namespace fapi;
*/
ReturnCode io_read_erepair(const Target& target,std::vector<uint8_t> &rx_lanes)
{
- ReturnCode rc;
- ecmdDataBufferBase data_one(16);
- ecmdDataBufferBase mask(16);
- uint8_t lane=0;
+ ReturnCode rc;
+ ecmdDataBufferBase data_one(16);
+ ecmdDataBufferBase mask(16);
+ uint8_t lane=0;
- io_interface_t interface=CP_IOMC0_P0; // Since G
- uint32_t rc_ecmd=0;
- uint8_t start_group=0;
- uint8_t end_group=0;
+ io_interface_t interface=CP_IOMC0_P0; // Since G
+ uint32_t rc_ecmd=0;
+ uint8_t start_group=0;
+ uint8_t end_group=0;
+ const fapi::Target &TARGET=target;
+ rc_ecmd=mask.flushTo1();
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
- rc_ecmd=mask.flushTo1();
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
-
- // Check which type of bus this is and do setup needed
- if(target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT) {
- start_group=0;
- end_group=0;
- interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
- }
- else if(target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT ) {
- start_group=0;
- end_group=0;
- interface=CP_FABRIC_X0; // base scom for X bus
- }
- else if(target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET){
- start_group=3;
- end_group=3;
- interface=CP_IOMC0_P0; // base scom for MC bus
- }
- else if(target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP){
- start_group=0;
- end_group=0;
- interface=CEN_DMI; // base scom Centaur chip
- }
- else{
- FAPI_ERR("Invalid io_read_erepair HWP invocation");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
- return(rc);
- }
+ // Check which type of bus this is and do setup needed
+ fapi::TargetType l_type = target.getType();
+ switch (l_type)
+ {
+ case fapi::TARGET_TYPE_ABUS_ENDPOINT:
+ start_group=0;
+ end_group=0;
+ interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
+ break;
+ case fapi::TARGET_TYPE_XBUS_ENDPOINT:
+ start_group=0;
+ end_group=3;
+ interface=CP_FABRIC_X0; // base scom for X bus
+ break;
+ case fapi::TARGET_TYPE_MCS_CHIPLET:
+ start_group=3;
+ end_group=3;
+ interface=CP_IOMC0_P0; // base scom for MC bus
+ break;
+ case fapi::TARGET_TYPE_MEMBUF_CHIP:
+ start_group=0;
+ end_group=0;
+ interface=CEN_DMI; // base scom Centaur chip
+ break;
+ default:
+ FAPI_ERR("Invalid io_read_erepair HWP invocation");
+ FAPI_SET_HWP_ERROR(rc, IO_READ_EREPAIR_INVALID_INVOCATION_RC);
+ break;
+ }
+ if (rc)
+ {
+ return(rc);
+ }
- FAPI_INF("Reading erepair data \n");
+ FAPI_INF("Reading erepair data \n");
- for(uint8_t clock_group=start_group;clock_group<=end_group;++clock_group){
- // This is only for X bus ..where multi groups are translated to consecutive lane numbers
- if(interface==CP_FABRIC_X0){
- if(clock_group==0){
- lane=0;
- }
- else if(clock_group==1){
- lane=20;
- }
- else if(clock_group==2){
- lane=40;
- }
- else if(clock_group==3){
- lane=60;
- }
- }
+ for(uint8_t clock_group=start_group;clock_group<=end_group;++clock_group)
+ {
+ // This is only for X bus ..where multi groups are translated to consecutive lane numbers
+ if(interface==CP_FABRIC_X0)
+ {
+ switch (clock_group)
+ {
+ case 0:
+ lane=0;
+ break;
+ case 1:
+ lane=20;
+ break;
+ case 2:
+ lane=40;
+ break;
+ case 3:
+ lane=60;
+ break;
+ default:
+ //don't need to do anything?
+ FAPI_ERR("io_read_erepair has a non-known clock groupd");
+ break;
+ }
+ }
- //Collect the RX bad lanes
- rc_ecmd|=data_one.flushTo0();
+ //Collect the RX bad lanes
+ rc_ecmd|=data_one.flushTo0();
- if(rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
-
- rc = GCR_read( target, interface, rx_bad_lane_enc_gcrmsg_pg, clock_group, 0, data_one);
- if(rc){return rc;}
-
- // RX lane records
- // Set the RX bad lanes in the RX vector
- uint8_t status=0;
+ if(rc_ecmd)
+ {
+ FAPI_ERR("io_read_erepair hit an error while flushing data");
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
- // Get first bad lane
- data_one.extract(&status,14,2);
- status=status>>6;
- FAPI_DBG("Bad lane status is %d",status);
-
- if(status!=0){
- if(status>=1){
- if(!data_one.isBitClear(0,7))
- {
- data_one.extract(&lane,0,7);
- lane=lane>>1;
- FAPI_DBG("First bad lane is %d",lane);
- rx_lanes.push_back(lane); // 0 to 15 bad lanes
- }
- }
- // Get second bad lane if any
- if(status>=2){
- if(!data_one.isBitClear(7,7)){
- data_one.extract(&lane,7,7);
- lane=lane>>1;
- FAPI_DBG("Second bad lane is %d",lane);
- rx_lanes.push_back(lane); // 16 to 31 bad lanes
- }
- }
- }
- else{
- // No bad lanes to report
- FAPI_DBG("No bad lane to report!!");
- }
+ rc = GCR_read( target, interface, rx_bad_lane_enc_gcrmsg_pg, clock_group, 0, data_one);
+ if(rc)
+ {
+ FAPI_ERR("io_read_erepair hit an error while writing rx_bad_lane_enc_gcrmsg_pg");
+ return(rc);
+ }
+ // RX lane records
+ // Set the RX bad lanes in the RX vector
+ uint8_t status=0;
+
+ // Get first bad lane
+ data_one.extract(&status,14,2);
+ status=status>>6;
+ FAPI_DBG("Bad lane status is %d",status);
+
+ if(status!=0){
+ if(status>=1){
+ data_one.extract(&lane,0,7);
+ lane=lane>>1;
+ FAPI_DBG("First bad lane is %d",lane);
+ rx_lanes.push_back(lane); // 0 to 15 bad lanes
+ }
+ // Get second bad lane if any
+ if(status>=2){
+ data_one.extract(&lane,7,7);
+ lane=lane>>1;
+ FAPI_DBG("Second bad lane is %d",lane);
+ rx_lanes.push_back(lane); // 16 to 31 bad lanes
+ }
+ }
+ else{
+ // No bad lanes to report
+ FAPI_DBG("No bad lane to report!!");
+ }
- }
- return rc;
+ }
+ return rc;
}
} //end extern C
diff --git a/src/usr/hwpf/hwp/bus_training/io_read_erepair_errors.xml b/src/usr/hwpf/hwp/bus_training/io_read_erepair_errors.xml
new file mode 100644
index 000000000..6aa602eeb
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_read_erepair_errors.xml
@@ -0,0 +1,37 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_read_erepair_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_read_erepair_errors.xml,v 1.2 2014/03/18 14:58:41 jgrell Exp $ -->
+
+<!-- Error definitions for IO_READ_EREPAIR HWPS -->
+<hwpErrors>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_READ_EREPAIR_INVALID_INVOCATION_RC</rc>
+ <description>io_run_training invoked with wrong pair of targets</description>
+ <ffdc>TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_restore_erepair.C b/src/usr/hwpf/hwp/bus_training/io_restore_erepair.C
index 683214eb5..ca92249cb 100644
--- a/src/usr/hwpf/hwp/bus_training/io_restore_erepair.C
+++ b/src/usr/hwpf/hwp/bus_training/io_restore_erepair.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_restore_erepair.C,v 1.16 2013/11/14 08:50:21 varkeykv Exp $
+// $Id: io_restore_erepair.C,v 1.17 2014/03/05 12:01:03 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -42,18 +42,19 @@
// 1.0 |varkeykv|09/27/11|Initial check in . Have to modify targets once bus target is defined and available.Not tested in any way other than in unit SIM IOTK
//------------------------------------------------------------------------------
+
#include <fapi.H>
#include "io_restore_erepair.H"
-#include "gcr_funcs.H"
-#include "io_power_down_lanes.H"
+#include "gcr_funcs.H"
+#include "io_power_down_lanes.H"
#include <erepairAccessorHwpFuncs.H>
extern "C" {
using namespace fapi;
-
-
+
+
//! Read repair values from VPD into the HW
/*
This function will perform erepair for one IO type target -- eithe MCS or XBUS or ABUS
@@ -69,7 +70,7 @@ ReturnCode io_restore_erepair(const Target& target,std::vector<uint8_t> &tx_lane
ecmdDataBufferBase data_two(16);
ecmdDataBufferBase mode_reg(16);
ecmdDataBufferBase mask(16);
- uint8_t lane=0;
+ uint8_t lane=0;
bool lane_valid=false;
io_interface_t interface=CP_IOMC0_P0; // Since G
@@ -107,7 +108,8 @@ ReturnCode io_restore_erepair(const Target& target,std::vector<uint8_t> &tx_lane
}
else{
FAPI_ERR("Invalid io_restore_erepair HWP invocation");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
+ const fapi::Target &TARGET = target;
+ FAPI_SET_HWP_ERROR(rc, IO_RESTORE_EREPAIR_INVALID_INVOCATION_RC);
return(rc);
}
// Use the accessor to fetch VPD data for this particular target instance
@@ -137,67 +139,77 @@ ReturnCode io_restore_erepair(const Target& target,std::vector<uint8_t> &tx_lane
{
rc.setEcmdError(rc_ecmd);
return(rc);
- }
-
- // Read in original data
-
- // Read in values for RMW
- rc = GCR_read( target,interface,rx_lane_bad_vec_0_15_pg, clock_group, 0, data_one);
- if(rc){return rc;}
- rc = GCR_read( target,interface,rx_lane_bad_vec_16_31_pg, clock_group, 0, data_two);
- if(rc){return rc;}
+ }
+
+ // Read in original data
+
+ // Read in values for RMW
+ rc = GCR_read( target,interface,rx_lane_bad_vec_0_15_pg, clock_group, 0, data_one);
+ if(rc){return rc;}
+ rc = GCR_read( target,interface,rx_lane_bad_vec_16_31_pg, clock_group, 0, data_two);
+ if(rc){return rc;}
// RX lane records
// Set the RX bad lanes in the buffer
- for(uint8_t i=0;i<rx_lanes.size();++i){
-
- if(interface==CP_FABRIC_X0){
- if(clock_group==0 && rx_lanes[i]<20){
- lane=rx_lanes[i];
- lane_valid=true;
- }
- else if(clock_group==1 && (rx_lanes[i]>19 && rx_lanes[i]<40)){
- lane=rx_lanes[i]-20;
- lane_valid=true;
- }
- else if(clock_group==2 && (rx_lanes[i]>39 && rx_lanes[i]<60)){
- lane=rx_lanes[i]-40;
- lane_valid=true;
- }
- else if(clock_group==3 && (rx_lanes[i]>59 && rx_lanes[i]<80) ){
- lane=rx_lanes[i]-60;
- lane_valid=true;
- }
- else{
- lane_valid=false;
- }
- }
- else{
- lane=rx_lanes[i];
- lane_valid=true;
+ for(uint8_t i=0;i<rx_lanes.size();++i){
+
+ if(interface==CP_FABRIC_X0){
+ if(clock_group==0 && rx_lanes[i]<20){
+ lane=rx_lanes[i];
+ lane_valid=true;
+ }
+ else if(clock_group==1 && (rx_lanes[i]>19 && rx_lanes[i]<40)){
+ lane=rx_lanes[i]-20;
+ lane_valid=true;
+ }
+ else if(clock_group==2 && (rx_lanes[i]>39 && rx_lanes[i]<60)){
+ lane=rx_lanes[i]-40;
+ lane_valid=true;
+ }
+ else if(clock_group==3 && (rx_lanes[i]>59 && rx_lanes[i]<80) ){
+ lane=rx_lanes[i]-60;
+ lane_valid=true;
+ }
+ else{
+ lane_valid=false;
+ }
+ }
+ else{
+ lane=rx_lanes[i];
+ lane_valid=true;
}
- if (lane < 16 && lane_valid) {
- data_one.setBit(lane);
+ if (lane < 16 && lane_valid) {
+ rc_ecmd = data_one.setBit(lane);
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
}
- else if(lane>=16 && lane_valid) {
- data_two.setBit(lane-16);
+ else if(lane>=16 && lane_valid) {
+ rc_ecmd = data_two.setBit(lane-16);
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
}
- }
+ }
FAPI_DBG("#2 Corrected RX lane is %d\n",lane);
- //Now write the bad lanes in one shot on the slave side RX
- if(!data_one.isBitClear(0,16)){
- rc = GCR_write( target, interface, rx_lane_bad_vec_0_15_pg, clock_group, 0, data_one,mask );
- if(rc){return rc;}
- }
- if(!data_two.isBitClear(0,16)){
- //Now write the bad lanes in one shot on the slave side RX
- rc = GCR_write( target, interface, rx_lane_bad_vec_16_31_pg, clock_group, 0, data_two,mask);
- if(rc){return rc;}
+ //Now write the bad lanes in one shot on the slave side RX
+ if(!data_one.isBitClear(0,16)){
+ rc = GCR_write( target, interface, rx_lane_bad_vec_0_15_pg, clock_group, 0, data_one,mask );
+ if(rc){return rc;}
+ }
+ if(!data_two.isBitClear(0,16)){
+ //Now write the bad lanes in one shot on the slave side RX
+ rc = GCR_write( target, interface, rx_lane_bad_vec_16_31_pg, clock_group, 0, data_two,mask);
+ if(rc){return rc;}
}
- }
+ }
FAPI_EXEC_HWP(rc, io_power_down_lanes,target,tx_lanes,rx_lanes);
return rc;
-}
+}
} //end extern C
diff --git a/src/usr/hwpf/hwp/bus_training/io_restore_erepair.H b/src/usr/hwpf/hwp/bus_training/io_restore_erepair.H
index df3f713d8..cd878dc00 100644
--- a/src/usr/hwpf/hwp/bus_training/io_restore_erepair.H
+++ b/src/usr/hwpf/hwp/bus_training/io_restore_erepair.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* COPYRIGHT International Business Machines Corp. 2013,2014 */
/* */
/* p1 */
/* */
@@ -20,10 +20,11 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_restore_erepair.H,v 1.8 2012/12/10 17:30:46 varkeykv Exp $
+// $Id: io_restore_erepair.H,v 1.9 2014/03/05 12:01:04 varkeykv Exp $
#ifndef IO_RESTORE_EREPAIR_H_
#define IO_RESTORE_EREPAIR_H_
+
#include <fapi.H>
/**
diff --git a/src/usr/hwpf/hwp/bus_training/io_restore_erepair_errors.xml b/src/usr/hwpf/hwp/bus_training/io_restore_erepair_errors.xml
new file mode 100644
index 000000000..53ae65cc7
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_restore_erepair_errors.xml
@@ -0,0 +1,35 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_restore_erepair_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_restore_erepair_errors.xml,v 1.2 2014/03/17 18:54:00 dedahle Exp $ -->
+<!-- Error definitions for IO_RESTORE_EREPAIR -->
+<hwpErrors>
+ <hwpError>
+ <rc>IO_RESTORE_EREPAIR_INVALID_INVOCATION_RC</rc>
+ <description>io_restore_erepair invoked with incorrect target type</description>
+ <ffdc>TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/io_run_training.C b/src/usr/hwpf/hwp/bus_training/io_run_training.C
index 108847e8d..33ba7ee4e 100644
--- a/src/usr/hwpf/hwp/bus_training/io_run_training.C
+++ b/src/usr/hwpf/hwp/bus_training/io_run_training.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_run_training.C,v 1.57 2014/02/10 16:15:52 varkeykv Exp $
+// $Id: io_run_training.C,v 1.59 2014/03/13 15:59:48 varkeykv Exp $
// *!***************************************************************************
// *! (C) Copyright International Business Machines Corp. 1997, 1998
// *! All Rights Reserved -- Property of IBM
@@ -52,1353 +52,1394 @@
extern "C" {
- using namespace fapi;
-
-
-
-ReturnCode io_training_set_pll_post_wiretest(const Target& target){
- ReturnCode rc;
- uint8_t pb_bndy_dmipll_data[231]={0},ab_bndy_pll_data[80]={0},tp_bndy_pll_data[80]={0};
-
- // For the PLL Partial updation logic we need PFD360 offsets into the Ring now
- uint32_t proc_dmi_cupll_pfd360_offset[8];
- uint32_t memb_dmi_cupll_pfd360_offset;
- uint32_t proc_abus_cupll_pfd360_offset[3];
- // REFCLK SEL offsets
- //uint32_t proc_dmi_cupll_refclksel_offset[8];
- // uint32_t memb_dmi_cupll_refclksel_offset;
- //uint32_t proc_abus_cupll_refclksel_offset[3];
-
- ecmdDataBufferBase ring_data;
- fapi::Target parent_target;
- uint32_t ring_length=0;
- uint32_t rc_ecmd=0;
- uint8_t chip_unit = 0;
-
- FAPI_DBG("Running PLL updation code");
-
-
-
- // This is a DMI/MC bus
- if (target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET)
- {
- FAPI_DBG("This is a Processor DMI bus using base DMI scom address");
-
- // Lets get chip unit pos , used for PLL table lookup
- rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
- &target,
- chip_unit);
-
+ using namespace fapi;
+
+
+
+ ReturnCode io_training_set_pll_post_wiretest(const Target& target){
+ ReturnCode rc;
+ uint8_t pb_bndy_dmipll_data[231]={0},ab_bndy_pll_data[80]={0},tp_bndy_pll_data[80]={0};
+
+ // For the PLL Partial updation logic we need PFD360 offsets into the Ring now
+ uint32_t proc_dmi_cupll_pfd360_offset[8];
+ uint32_t memb_dmi_cupll_pfd360_offset;
+ uint32_t proc_abus_cupll_pfd360_offset[3];
+ // REFCLK SEL offsets
+ //uint32_t proc_dmi_cupll_refclksel_offset[8];
+ // uint32_t memb_dmi_cupll_refclksel_offset;
+ //uint32_t proc_abus_cupll_refclksel_offset[3];
+
+ ecmdDataBufferBase ring_data;
+ fapi::Target parent_target;
+ uint32_t ring_length=0;
+ uint32_t rc_ecmd=0;
+ uint8_t chip_unit = 0;
+
+ FAPI_DBG("Running PLL updation code");
+
+
+
+ // This is a DMI/MC bus
+ if (target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET)
+ {
+ FAPI_DBG("This is a Processor DMI bus using base DMI scom address");
+
+ // Lets get chip unit pos , used for PLL table lookup
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &target,
+ chip_unit);
+
if (rc)
{
FAPI_ERR("Error retreiving MCS chiplet number!");
return rc;
}
-
- // obtain parent chip target needed for ring manipulation
- rc = fapiGetParentChip(target, parent_target);
- if (rc)
- {
- FAPI_ERR("Error from fapiGetParentChip");
- return(rc);
- }
- // install PLL config for dccal operation
- rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_LENGTH, &parent_target, ring_length); // -- get length of scan ring
- if (rc)
- {
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_PB_BNDY_DMIPLL_LENGTH)");
- return(rc);
- }
-// rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_dmipll_FOR_RUNTIME_DATA, &parent_target, pb_bndy_dmipll_data); // -- get scan ring data
- rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_DATA, &parent_target, pb_bndy_dmipll_data); // -- get scan ring data
- if (rc)
- {
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_PB_BNDY_DMIPLL_FOR_DCCAL_DATA)");
- return(rc);
- }
-
- // Now we need the partial offset data also . First let us get PFD360 offsets
- rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_PFD360_OFFSET, &parent_target, proc_dmi_cupll_pfd360_offset); // -- get length of scan ring
- if (rc)
- {
- FAPI_ERR("Error fetching PFD360 offsets on MCS");
- return(rc);
- }
- //rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_REFCLKSEL_OFFSET, &parent_target, proc_dmi_cupll_refclksel_offset); // -- get length of scan ring
- //if (rc)
- //{
- // FAPI_ERR("Error fetching REFCLKSEL offsets on MCS");
- // return(rc);
- //}
-
- rc_ecmd |= ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
-
- rc =fapiGetRing(parent_target,PB_BNDY_DMIPLL_RING_ADDR ,ring_data,RING_MODE_SET_PULSE);
- if (rc)
- {
- FAPI_ERR("Error performing GetRing operation on PB_BNDY_DMIPLL");
- return(rc);
- }
+ // obtain parent chip target needed for ring manipulation
+ rc = fapiGetParentChip(target, parent_target);
+ if (rc)
+ {
+ FAPI_ERR("Error from fapiGetParentChip");
+ return(rc);
+ }
+
+ // install PLL config for dccal operation
+ rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_LENGTH, &parent_target, ring_length); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_PB_BNDY_DMIPLL_LENGTH)");
+ return(rc);
+ }
+ // rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_dmipll_FOR_RUNTIME_DATA, &parent_target, pb_bndy_dmipll_data); // -- get scan ring data
+ rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_DATA, &parent_target, pb_bndy_dmipll_data); // -- get scan ring data
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_PB_BNDY_DMIPLL_FOR_DCCAL_DATA)");
+ return(rc);
+ }
+
+ // Now we need the partial offset data also . First let us get PFD360 offsets
+ rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_PFD360_OFFSET, &parent_target, proc_dmi_cupll_pfd360_offset); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error fetching PFD360 offsets on MCS");
+ return(rc);
+ }
+ //rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_REFCLKSEL_OFFSET, &parent_target, proc_dmi_cupll_refclksel_offset); // -- get length of scan ring
+ //if (rc)
+ //{
+ // FAPI_ERR("Error fetching REFCLKSEL offsets on MCS");
+ // return(rc);
+ //}
+
+ rc_ecmd |= ring_data.setBitLength(ring_length);
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+
+ rc =fapiGetRing(parent_target,PB_BNDY_DMIPLL_RING_ADDR ,ring_data,RING_MODE_SET_PULSE);
+ if (rc)
+ {
+ FAPI_ERR("Error performing GetRing operation on PB_BNDY_DMIPLL");
+ return(rc);
+ }
FAPI_DBG("PFD bit to be cleared for DMI unit %d is %d",chip_unit,proc_dmi_cupll_pfd360_offset[chip_unit]);
- rc_ecmd |= ring_data.clearBit(proc_dmi_cupll_pfd360_offset[chip_unit]);
- // Now
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = proc_a_x_pci_dmi_pll_scan_bndy(parent_target,
- NEST_CHIPLET_0x02000000,
- PB_BNDY_DMIPLL_RING_ADDR,
- ring_data,
- true);
- if (rc)
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- return(rc);
- }
+ rc_ecmd |= ring_data.clearBit(proc_dmi_cupll_pfd360_offset[chip_unit]);
+ // Now
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ rc = proc_a_x_pci_dmi_pll_scan_bndy(parent_target,
+ NEST_CHIPLET_0x02000000,
+ PB_BNDY_DMIPLL_RING_ADDR,
+ ring_data,
+ true);
+ if (rc)
+ {
+ FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
+ return(rc);
+ }
-
- }
- else if (target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP)
- {
- FAPI_DBG("This is a Centaur DMI bus using base DMI scom address");
- // install PLL config for dccal operation
- rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_LENGTH, &target, ring_length); // -- get length of scan ring
- if (rc)
- {
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_MEMB_TP_BNDY_PLL_LENGTH)");
- return(rc);
}
-// rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_FOR_RUNTIME_DATA, &target, tp_bndy_pll_data); // -- get scan ring data
- rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_DATA, &target, tp_bndy_pll_data); // -- get scan ring data
- if (rc)
+ else if (target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP)
{
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_MEMB_TP_BNDY_PLL_FOR_DCCAL_DATA)");
- return(rc);
- }
-
- // Now we need the partial offset data also . First let us get PFD360 offsets
- rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_PFD360_OFFSET, &target, memb_dmi_cupll_pfd360_offset); // -- get length of scan ring
- if (rc)
- {
- FAPI_ERR("Error fetching PFD360 offsets on Centaur");
- return(rc);
- }
- //rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_REFCLKSEL_OFFSET, &target, memb_dmi_cupll_refclksel_offset); // -- get length of scan ring
- //if (rc)
- //{
- // FAPI_ERR("Error fetching REFCLKSEL offsets on Centaur");
- // return(rc);
- //}
-
- FAPI_DBG("Centaur PFD offset = %d",memb_dmi_cupll_pfd360_offset);
- // FAPI_DBG("Centaur REFCLKSEL offset = %d",memb_dmi_cupll_refclksel_offset);
-
- FAPI_DBG("Ring length is %d",ring_length);
- rc_ecmd |= ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
-
- rc=fapiGetRing(target,MEMB_TP_BNDY_PLL_RING_ADDR ,ring_data,RING_MODE_SET_PULSE);
- if (rc)
- {
- FAPI_ERR("Get ring error on MEMB ");
- return(rc);
- }
- // rc_ecmd |= ring_data.insert(pb_bndy_dmipll_data, 0, ring_length, 0); // -- put data into ecmd buffer
+ FAPI_DBG("This is a Centaur DMI bus using base DMI scom address");
+
+ // install PLL config for dccal operation
+ rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_LENGTH, &target, ring_length); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_MEMB_TP_BNDY_PLL_LENGTH)");
+ return(rc);
+ }
+ // rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_FOR_RUNTIME_DATA, &target, tp_bndy_pll_data); // -- get scan ring data
+ rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_DATA, &target, tp_bndy_pll_data); // -- get scan ring data
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_MEMB_TP_BNDY_PLL_FOR_DCCAL_DATA)");
+ return(rc);
+ }
+
+ // Now we need the partial offset data also . First let us get PFD360 offsets
+ rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_PFD360_OFFSET, &target, memb_dmi_cupll_pfd360_offset); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error fetching PFD360 offsets on Centaur");
+ return(rc);
+ }
+ //rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_REFCLKSEL_OFFSET, &target, memb_dmi_cupll_refclksel_offset); // -- get length of scan ring
+ //if (rc)
+ //{
+ // FAPI_ERR("Error fetching REFCLKSEL offsets on Centaur");
+ // return(rc);
+ //}
+
+ FAPI_DBG("Centaur PFD offset = %d",memb_dmi_cupll_pfd360_offset);
+ // FAPI_DBG("Centaur REFCLKSEL offset = %d",memb_dmi_cupll_refclksel_offset);
+
+ FAPI_DBG("Ring length is %d",ring_length);
+ rc_ecmd |= ring_data.setBitLength(ring_length);
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+
+ rc=fapiGetRing(target,MEMB_TP_BNDY_PLL_RING_ADDR ,ring_data,RING_MODE_SET_PULSE);
+ if (rc)
+ {
+ FAPI_ERR("Get ring error on MEMB ");
+ return(rc);
+ }
+ // rc_ecmd |= ring_data.insert(pb_bndy_dmipll_data, 0, ring_length, 0); // -- put data into ecmd buffer
FAPI_DBG("PFD bit to be cleared for centaur is %d",memb_dmi_cupll_pfd360_offset);
- rc_ecmd |=ring_data.clearBit(memb_dmi_cupll_pfd360_offset);
-
- //rc_ecmd |= ring_data.insert(tp_bndy_pll_data, 0, ring_length, 0); // -- put data into ecmd buffer
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = proc_a_x_pci_dmi_pll_scan_bndy(target,
- TP_CHIPLET_0x01000000,
- MEMB_TP_BNDY_PLL_RING_ADDR,
- ring_data,
- true);
- if (rc)
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- return(rc);
- }
+ rc_ecmd |=ring_data.clearBit(memb_dmi_cupll_pfd360_offset);
+
+ //rc_ecmd |= ring_data.insert(tp_bndy_pll_data, 0, ring_length, 0); // -- put data into ecmd buffer
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ rc = proc_a_x_pci_dmi_pll_scan_bndy(target,
+ TP_CHIPLET_0x01000000,
+ MEMB_TP_BNDY_PLL_RING_ADDR,
+ ring_data,
+ true);
+ if (rc)
+ {
+ FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
+ return(rc);
+ }
-
- }
- //This is an X Bus
- else if (target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT)
- {
- FAPI_DBG("This is a X Bus training invocation");
- }
- //This is an A Bus
- else if (target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)
- {
- FAPI_DBG("This is an A Bus training invocation");
-
- // Lets get chip unit pos , used for PLL table lookup
- rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
- &target,
- chip_unit);
-
- if (!rc.ok())
- {
- FAPI_ERR("Error retreiving Abus chiplet number!");
- return rc;
- }
-
- // obtain parent chip target needed for ring manipulation
- rc = fapiGetParentChip(target, parent_target);
- if (rc)
- {
- FAPI_ERR("Error from fapiGetParentChip");
- return(rc);
- }
- // install PLL config for dccal operation
- rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_LENGTH, &parent_target, ring_length); // -- get length of scan ring
- if (rc)
- {
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_AB_BNDY_PLL_LENGTH)");
- return(rc);
}
-// rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_FOR_RUNTIME_DATA, &parent_target, ab_bndy_pll_data); // -- get scan ring data
- rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_DATA, &parent_target, ab_bndy_pll_data); // -- get scan ring data
- if (rc)
+ //This is an X Bus
+ else if (target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT)
{
- FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_AB_BNDY_PLL_FOR_DCCAL_DATA)");
- return(rc);
+ FAPI_DBG("This is a X Bus training invocation");
}
-
-
- // Now we need the partial offset data also . First let us get PFD360 offsets
- rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_PFD360_OFFSET, &parent_target, proc_abus_cupll_pfd360_offset); // -- get length of scan ring
- if (rc)
+ //This is an A Bus
+ else if (target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)
{
- FAPI_ERR("Error fetching PFD360 offsets on Abus");
- return(rc);
- }
- //rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_REFCLKSEL_OFFSET, &parent_target, proc_abus_cupll_refclksel_offset); // -- get length of scan ring
- //if (rc)
- //{
- // FAPI_ERR("Error fetching REFCLKSEL offsets on Abus");
- // return(rc);
- //}
+ FAPI_DBG("This is an A Bus training invocation");
+
+ // Lets get chip unit pos , used for PLL table lookup
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &target,
+ chip_unit);
+
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error retreiving Abus chiplet number!");
+ return rc;
+ }
+
+ // obtain parent chip target needed for ring manipulation
+ rc = fapiGetParentChip(target, parent_target);
+ if (rc)
+ {
+ FAPI_ERR("Error from fapiGetParentChip");
+ return(rc);
+ }
+
+ // install PLL config for dccal operation
+ rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_LENGTH, &parent_target, ring_length); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_AB_BNDY_PLL_LENGTH)");
+ return(rc);
+ }
+ // rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_FOR_RUNTIME_DATA, &parent_target, ab_bndy_pll_data); // -- get scan ring data
+ rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_DATA, &parent_target, ab_bndy_pll_data); // -- get scan ring data
+ if (rc)
+ {
+ FAPI_ERR("Error from FAPI_ATTR_GET (ATTR_PROC_AB_BNDY_PLL_FOR_DCCAL_DATA)");
+ return(rc);
+ }
+
+
+ // Now we need the partial offset data also . First let us get PFD360 offsets
+ rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_PFD360_OFFSET, &parent_target, proc_abus_cupll_pfd360_offset); // -- get length of scan ring
+ if (rc)
+ {
+ FAPI_ERR("Error fetching PFD360 offsets on Abus");
+ return(rc);
+ }
+ //rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_REFCLKSEL_OFFSET, &parent_target, proc_abus_cupll_refclksel_offset); // -- get length of scan ring
+ //if (rc)
+ //{
+ // FAPI_ERR("Error fetching REFCLKSEL offsets on Abus");
+ // return(rc);
+ //}
rc_ecmd |= ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
rc =fapiGetRing(parent_target,AB_BNDY_PLL_RING_ADDR ,ring_data,RING_MODE_SET_PULSE);
- if (rc)
- {
- FAPI_ERR("GetRing error on AB ring");
- return(rc);
- }
+ if (rc)
+ {
+ FAPI_ERR("GetRing error on AB ring");
+ return(rc);
+ }
FAPI_DBG("PFD bit to be cleared for Abus number %d is %d",chip_unit,proc_abus_cupll_pfd360_offset[chip_unit]);
rc_ecmd|=ring_data.clearBit(proc_abus_cupll_pfd360_offset[chip_unit]);
- if (rc_ecmd)
- {
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
- rc = proc_a_x_pci_dmi_pll_scan_bndy(parent_target,
- A_BUS_CHIPLET_0x08000000,
- AB_BNDY_PLL_RING_ADDR,
- ring_data,
- true);
- if (rc)
+ if (rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+ rc = proc_a_x_pci_dmi_pll_scan_bndy(parent_target,
+ A_BUS_CHIPLET_0x08000000,
+ AB_BNDY_PLL_RING_ADDR,
+ ring_data,
+ true);
+ if (rc)
+ {
+ FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
+ return(rc);
+ }
+
+ }
+ else
{
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- return(rc);
+ FAPI_ERR("Invalid target passed to PLL Update code.. target does not belong to DMI/X/A instances");
+ const fapi::Target &TARGET = target;
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_SET_PLL_INVALID_INVOCATION_RC);
}
-
- }
- else
- {
- FAPI_ERR("Invalid target passed to PLL Update code.. target does not belong to DMI/X/A instances");
- FAPI_SET_HWP_ERROR(rc, IO_DCCAL_INVALID_INVOCATION_RC);
+ return rc;
}
- return rc;
-}
-// For clearing the FIR mask , used by io run training
-ReturnCode clear_fir_mask_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
+ // For clearing the FIR mask , used by io run training
+ ReturnCode clear_fir_mask_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
- ReturnCode rc;
- uint32_t rc_ecmd = 0;
- uint8_t chip_unit = 0;
- uint8_t link_fir_unmask_data = 0xFF;
- ecmdDataBufferBase data(64);
- FAPI_INF("io_run_training:In the Clear FIR MASK register function ");
+ ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ uint8_t chip_unit = 0;
+ uint8_t link_fir_unmask_data = 0xFF;
+ ecmdDataBufferBase data(64);
+ FAPI_INF("io_run_training:In the Clear FIR MASK register function ");
- do
- {
- // initialize mask to all 1s
- rc_ecmd |= data.invert();
-
- // set FIR mask appropriately based on interface type / link being trained
- if ((i_chip_interface == FIR_CP_FABRIC_A0) ||
- (i_chip_interface == FIR_CP_IOMC0_P0))
+ do
{
- rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
- &i_target,
- chip_unit);
- if (!rc.ok())
+ // initialize mask to all 1s
+ rc_ecmd |= data.invert();
+ // check buffer manipulation return codes
+ if (rc_ecmd)
{
- FAPI_ERR("Error retreiving chiplet number!");
+ FAPI_ERR("Error 0x%X setting up FIR mask data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
break;
}
-
- // adjust for DMI number
- if (i_chip_interface == FIR_CP_IOMC0_P0)
+ // set FIR mask appropriately based on interface type / link being trained
+ if ((i_chip_interface == FIR_CP_FABRIC_A0) ||
+ (i_chip_interface == FIR_CP_IOMC0_P0))
{
- chip_unit = chip_unit % 4;
- // BUS ID Remapped to linear by John Rell so commenting this out
- link_fir_unmask_data = 0x87; // as per Gary via SW245014
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &i_target,
+ chip_unit);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error retreiving chiplet number!");
+ break;
+ }
+
+ // adjust for DMI number
+ if (i_chip_interface == FIR_CP_IOMC0_P0)
+ {
+ chip_unit = chip_unit % 4;
+ // BUS ID Remapped to linear by John Rell so commenting this out
+ link_fir_unmask_data = 0x87; // as per Gary via SW245014
+ }
+ // adjust for ABUS number
+ else
+ {
+ chip_unit = chip_unit + 1;
+ link_fir_unmask_data = 0x87;// as per Gary via SW245014, leave at this value
+ }
}
- // adjust for ABUS number
- else
+
+ // SW228820 , for Xbus all data goes into BUS0 fields regardless of instance
+ else if ((i_chip_interface == FIR_CEN_DMI) ||
+ (i_chip_interface == FIR_CP_FABRIC_X0))
{
- chip_unit = chip_unit + 1;
- link_fir_unmask_data = 0x87;// as per Gary via SW245014, leave at this value
+ chip_unit = 0;
+ if (i_chip_interface == FIR_CEN_DMI)
+ {
+ //link_fir_unmask_data = 0x8F;
+ link_fir_unmask_data = 0x87; // as per Gary via SW245014
+ }
+ else
+ {
+ //link_fir_unmask_data = 0x87;
+ link_fir_unmask_data = 0x97; // as per Gary via SW245014
+ }
}
- }
- // SW228820 , for Xbus all data goes into BUS0 fields regardless of instance
- else if ((i_chip_interface == FIR_CEN_DMI) ||
- (i_chip_interface == FIR_CP_FABRIC_X0))
- {
- chip_unit = 0;
- if (i_chip_interface == FIR_CEN_DMI)
+ rc_ecmd |= data.insert(link_fir_unmask_data,
+ 8+(8*chip_unit),
+ 8);
+
+ // check buffer manipulation return codes
+ if (rc_ecmd)
{
- //link_fir_unmask_data = 0x8F;
- link_fir_unmask_data = 0x87; // as per Gary via SW245014
+ FAPI_ERR("Error 0x%X setting up FIR mask data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
}
- else
+
+ // use FIR AND mask register to un-mask selected bits
+ rc = fapiPutScom(i_target, fir_clear_mask_reg_addr[i_chip_interface], data);
+ if (!rc.ok())
{
- //link_fir_unmask_data = 0x87;
- link_fir_unmask_data = 0x97; // as per Gary via SW245014
+ FAPI_ERR("Error writing FIR mask register (=%08X)!",
+ fir_clear_mask_reg_addr[i_chip_interface]);
+ break;
}
- }
- rc_ecmd |= data.insert(link_fir_unmask_data,
- 8+(8*chip_unit),
- 8);
+ } while(0);
- // check buffer manipulation return codes
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%X setting up FIR mask data buffer",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
+ return(rc);
+ }
+
+ // For clearing out spare deployed summary bit , in case of false HW triggers on known bad lanes
+ // io_clear_firs only clear out lower level regs, not the summary FIR
+ ReturnCode clear_fir_summary_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
+
+ ReturnCode rc;
+ uint32_t rc_ecmd = 0;
+ uint8_t chip_unit = 0;
+ ecmdDataBufferBase data(64);
+ uint64_t scom_address64=0;
+ ecmdDataBufferBase temp(64);
+
+ FAPI_INF("io_run_training:In the Clear FIR MASK register function ");
- // use FIR AND mask register to un-mask selected bits
- rc = fapiPutScom(i_target, fir_clear_mask_reg_addr[i_chip_interface], data);
- if (!rc.ok())
+ do
{
- FAPI_ERR("Error writing FIR mask register (=%08X)!",
- fir_clear_mask_reg_addr[i_chip_interface]);
- break;
- }
- } while(0);
+ // set FIR mask appropriately based on interface type / link being trained
+ if ((i_chip_interface == FIR_CP_FABRIC_A0) ||
+ (i_chip_interface == FIR_CP_IOMC0_P0))
+ {
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
+ &i_target,
+ chip_unit);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error retreiving chiplet number!");
+ break;
+ }
- return(rc);
-}
+ // adjust for DMI number
+ if (i_chip_interface == FIR_CP_IOMC0_P0)
+ {
+ chip_unit = chip_unit % 4;
+ // BUS ID Remapped to linear by John Rell/Joe so removed remap logic
+ }
+ // adjust for ABUS number
+ else
+ {
+ chip_unit = chip_unit + 1;
+ }
+ }
-// For clearing out spare deployed summary bit , in case of false HW triggers on known bad lanes
-// io_clear_firs only clear out lower level regs, not the summary FIR
-ReturnCode clear_fir_summary_reg(const Target &i_target,fir_io_interface_t i_chip_interface){
+ // SW228820 , for Xbus all data goes into BUS0 fields regardless of instance
+ else if ((i_chip_interface == FIR_CEN_DMI) ||
+ (i_chip_interface == FIR_CP_FABRIC_X0))
+ {
+ chip_unit = 0;
+ }
- ReturnCode rc;
- uint32_t rc_ecmd = 0;
- uint8_t chip_unit = 0;
- ecmdDataBufferBase data(64);
- uint64_t scom_address64=0;
- ecmdDataBufferBase temp(64);
-
- FAPI_INF("io_run_training:In the Clear FIR MASK register function ");
- do
- {
- // set FIR mask appropriately based on interface type / link being trained
- if ((i_chip_interface == FIR_CP_FABRIC_A0) ||
- (i_chip_interface == FIR_CP_IOMC0_P0))
- {
- rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,
- &i_target,
- chip_unit);
+
+ rc_ecmd=temp.setDoubleWord(0,fir_rw_reg_addr[i_chip_interface]);
+ // check buffer manipulation return codes
+ if (rc_ecmd)
+ {
+ FAPI_ERR("Error 0x%X setting up FIR mask data buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
+ }
+ scom_address64=temp.getDoubleWord(0);
+
+ //read the 64 bit fir register
+ rc=fapiGetScom(i_target,scom_address64,data);
+
if (!rc.ok())
{
- FAPI_ERR("Error retreiving chiplet number!");
+ FAPI_ERR("Problem in fapi get scom ");
break;
}
- // adjust for DMI number
- if (i_chip_interface == FIR_CP_IOMC0_P0)
+ FAPI_DBG("Clearing spare deployed bit at %d",(8*(chip_unit+1)+1));
+ rc_ecmd |= data.clearBit(8*(chip_unit+1)+1);
+
+ // check buffer manipulation return codes
+ if (rc_ecmd)
{
- chip_unit = chip_unit % 4;
- // BUS ID Remapped to linear by John Rell/Joe so removed remap logic
+ FAPI_ERR("ECMD Error 0x%X setting up FIR data Buffer",
+ rc_ecmd);
+ rc.setEcmdError(rc_ecmd);
+ break;
}
- // adjust for ABUS number
- else
+ // Clear spare deployed bit on appropriate bits
+ rc = fapiPutScom(i_target, scom_address64, data);
+ if (!rc.ok())
{
- chip_unit = chip_unit + 1;
+ FAPI_ERR("Problem in put scom ");
+ break;
}
+
+ } while(0);
+
+ return(rc);
+ }
+
+ // FIR Workaround Code -- Pre Training Section - HW205368 - procedure from Rob /Pete
+ ReturnCode fir_workaround_pre_training(const Target& master_target, io_interface_t master_interface,uint32_t master_group, const Target& slave_target, io_interface_t slave_interface,uint32_t slave_group,
+ ecmdDataBufferBase *slave_data_one_old,ecmdDataBufferBase *slave_data_two_old,ecmdDataBufferBase *master_data_one_old,ecmdDataBufferBase *master_data_two_old)
+ {
+ ReturnCode rc;
+ //Start - Workaround Pre Training Section - HW205368 - procedure from Rob /Pete
+
+ uint8_t max_group=1;
+
+ if(master_interface==CP_FABRIC_X0){
+ max_group=4;
}
- // SW228820 , for Xbus all data goes into BUS0 fields regardless of instance
- else if ((i_chip_interface == FIR_CEN_DMI) ||
- (i_chip_interface == FIR_CP_FABRIC_X0))
- {
- chip_unit = 0;
- }
-
-
-
-
- rc_ecmd=temp.setDoubleWord(0,fir_rw_reg_addr[i_chip_interface]);
- scom_address64=temp.getDoubleWord(0);
-
- // check buffer manipulation return codes
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%X setting up FIR mask data buffer",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- //read the 64 bit fir register
- rc=fapiGetScom(i_target,scom_address64,data);
-
- if (!rc.ok())
- {
- FAPI_ERR("Problem in fapi get scom ");
- break;
- }
-
- FAPI_DBG("Clearing spare deployed bit at %d",(8*(chip_unit+1)+1));
- rc_ecmd |= data.clearBit(8*(chip_unit+1)+1);
-
- // check buffer manipulation return codes
- if (rc_ecmd)
- {
- FAPI_ERR("ECMD Error 0x%X setting up FIR data Buffer",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- // Clear spare deployed bit on appropriate bits
- rc = fapiPutScom(i_target, scom_address64, data);
- if (!rc.ok())
- {
- FAPI_ERR("Problem in put scom ");
- break;
- }
-
- } while(0);
-
- return(rc);
-}
-
-// FIR Workaround Code -- Pre Training Section - HW205368 - procedure from Rob /Pete
-ReturnCode fir_workaround_pre_training(const Target& master_target, io_interface_t master_interface,uint32_t master_group, const Target& slave_target, io_interface_t slave_interface,uint32_t slave_group,
- ecmdDataBufferBase *slave_data_one_old,ecmdDataBufferBase *slave_data_two_old,ecmdDataBufferBase *master_data_one_old,ecmdDataBufferBase *master_data_two_old)
-{
- ReturnCode rc;
- //Start - Workaround Pre Training Section - HW205368 - procedure from Rob /Pete
-
- uint8_t max_group=1;
-
- if(master_interface==CP_FABRIC_X0){
- max_group=4;
- }
-
- // Take backup of slave bad lane data restored by FW prior to training
- FAPI_DBG("io_run_training: Saving Bad lane information for HW workaround ");
- if(master_interface==CP_FABRIC_X0){
- for (int current_group = 0 ; current_group < max_group; current_group++){
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, slave_data_one_old[current_group]);
- if(rc){return rc;}
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, slave_data_two_old[current_group]);
- if(rc){return rc;}
- }
- //Take backup of master bad lane data restored by FW prior to training
- for (int current_group = 0 ; current_group < max_group; current_group++){
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, master_data_one_old[current_group]);
- if(rc){return rc;}
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, master_data_two_old[current_group]);
- if(rc){return rc;}
- }
- }else{
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, slave_group, 0, slave_data_one_old[0]);
- if(rc){return rc;}
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, slave_group, 0, slave_data_two_old[0]);
- if(rc){return rc;}
- //Take backup of master bad lane data restored by FW prior to training
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, master_group, 0, master_data_one_old[0]);
- if(rc){return rc;}
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, master_group, 0, master_data_two_old[0]);
- if(rc){return rc;}
- }
- // End - Workaround HW205368
+ // Take backup of slave bad lane data restored by FW prior to training
+ FAPI_DBG("io_run_training: Saving Bad lane information for HW workaround ");
+ if(master_interface==CP_FABRIC_X0){
+ for (int current_group = 0 ; current_group < max_group; current_group++){
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, slave_data_one_old[current_group]);
+ if(rc){return rc;}
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, slave_data_two_old[current_group]);
+ if(rc){return rc;}
+ }
+ //Take backup of master bad lane data restored by FW prior to training
+ for (int current_group = 0 ; current_group < max_group; current_group++){
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, master_data_one_old[current_group]);
+ if(rc){return rc;}
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, master_data_two_old[current_group]);
+ if(rc){return rc;}
+ }
+ }else{
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, slave_group, 0, slave_data_one_old[0]);
+ if(rc){return rc;}
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, slave_group, 0, slave_data_two_old[0]);
+ if(rc){return rc;}
+ //Take backup of master bad lane data restored by FW prior to training
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, master_group, 0, master_data_one_old[0]);
+ if(rc){return rc;}
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, master_group, 0, master_data_two_old[0]);
+ if(rc){return rc;}
+ }
+ // End - Workaround HW205368
return(rc);
-}
-
-ReturnCode fir_workaround_post_training(const Target& master_target, io_interface_t master_interface,uint32_t master_group, const Target& slave_target, io_interface_t slave_interface,uint32_t slave_group,
- ecmdDataBufferBase *slave_data_one_old,ecmdDataBufferBase *slave_data_two_old,ecmdDataBufferBase *master_data_one_old,ecmdDataBufferBase *master_data_two_old)
-{
- ReturnCode rc;
- //These buffers will store new bad lane info after training
- ecmdDataBufferBase slave_data_one_new[4];
- ecmdDataBufferBase slave_data_two_new[4];
- ecmdDataBufferBase master_data_one_new[4];
- ecmdDataBufferBase master_data_two_new[4];
- fir_io_interface_t fir_master_interface=FIR_CP_IOMC0_P0;
- fir_io_interface_t fir_slave_interface=FIR_CEN_DMI;
-
- uint8_t max_group=1;
-
- //Translate some enums in training header to fir enums
- if(master_interface==CP_FABRIC_X0){
- fir_master_interface=FIR_CP_FABRIC_X0;
- }
- else if(master_interface==CP_IOMC0_P0){
- fir_master_interface= FIR_CP_IOMC0_P0;
- }
- else if(master_interface== CEN_DMI){
- fir_master_interface=FIR_CEN_DMI;
- }
- else if(master_interface== CP_FABRIC_A0){
- fir_master_interface=FIR_CP_FABRIC_A0;
- }
- if(slave_interface==CP_FABRIC_X0){
- fir_slave_interface=FIR_CP_FABRIC_X0;
- }
- else if(slave_interface==CP_IOMC0_P0){
- fir_slave_interface= FIR_CP_IOMC0_P0;
- }
- else if(slave_interface== CEN_DMI){
- fir_slave_interface=FIR_CEN_DMI;
- }
- else if(slave_interface== CP_FABRIC_A0){
- fir_slave_interface=FIR_CP_FABRIC_A0;
- }
+ }
+
+ ReturnCode fir_workaround_post_training(const Target& master_target, io_interface_t master_interface,uint32_t master_group, const Target& slave_target, io_interface_t slave_interface,uint32_t slave_group,
+ ecmdDataBufferBase *slave_data_one_old,ecmdDataBufferBase *slave_data_two_old,ecmdDataBufferBase *master_data_one_old,ecmdDataBufferBase *master_data_two_old)
+ {
+ ReturnCode rc;
+ //These buffers will store new bad lane info after training
+ ecmdDataBufferBase slave_data_one_new[4];
+ ecmdDataBufferBase slave_data_two_new[4];
+ ecmdDataBufferBase master_data_one_new[4];
+ ecmdDataBufferBase master_data_two_new[4];
+ fir_io_interface_t fir_master_interface=FIR_CP_IOMC0_P0;
+ fir_io_interface_t fir_slave_interface=FIR_CEN_DMI;
+
+ uint8_t max_group=1;
+
+ //Translate some enums in training header to fir enums
+ if(master_interface==CP_FABRIC_X0){
+ fir_master_interface=FIR_CP_FABRIC_X0;
+ }
+ else if(master_interface==CP_IOMC0_P0){
+ fir_master_interface= FIR_CP_IOMC0_P0;
+ }
+ else if(master_interface== CEN_DMI){
+ fir_master_interface=FIR_CEN_DMI;
+ }
+ else if(master_interface== CP_FABRIC_A0){
+ fir_master_interface=FIR_CP_FABRIC_A0;
+ }
+ if(slave_interface==CP_FABRIC_X0){
+ fir_slave_interface=FIR_CP_FABRIC_X0;
+ }
+ else if(slave_interface==CP_IOMC0_P0){
+ fir_slave_interface= FIR_CP_IOMC0_P0;
+ }
+ else if(slave_interface== CEN_DMI){
+ fir_slave_interface=FIR_CEN_DMI;
+ }
+ else if(slave_interface== CP_FABRIC_A0){
+ fir_slave_interface=FIR_CP_FABRIC_A0;
+ }
else{
- FAPI_DBG("This is not a possible state since checking of these parms is done in top layer and error code returned ");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
- return(rc);
+ FAPI_DBG("This is not a possible state since checking of these parms is done in top layer and error code returned ");
+ const fapi::Target &TARGET = master_target;
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_POST_TRAINING_INVALID_INVOCATION_RC);
+ return(rc);
}
-
-
- if(master_interface==CP_FABRIC_X0){
- max_group=4;
- }
-
- FAPI_DBG("io_run_training : Starting post training HW workaround ");
- // Start post training part of Workaround - HW205368 - procedure from Rob /Pete
- // Read slave side bad lane data after training
- if(master_interface==CP_FABRIC_X0){
- for (int current_group = 0 ; current_group < max_group; current_group++){
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, slave_data_one_new[current_group]);
- if(rc){return rc;}
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, slave_data_two_new[current_group]);
- if(rc){return rc;}
- }
- //Take backup of master bad lane data restored by FW prior to training
- for (int current_group = 0 ; current_group < max_group; current_group++){
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, master_data_one_new[current_group]);
- if(rc){return rc;}
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, master_data_two_new[current_group]);
- if(rc){return rc;}
- }
- }else{
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, slave_group, 0, slave_data_one_new[0]);
- if(rc){return rc;}
- rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, slave_group, 0, slave_data_two_new[0]);
- if(rc){return rc;}
- //Take backup of master bad lane data restored by FW prior to training
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, master_group, 0, master_data_one_new[0]);
- if(rc){return rc;}
- rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, master_group, 0, master_data_two_new[0]);
- if(rc){return rc;}
- }
- // Now we will compare the old and new bad lane data and take appropriate action
- if(master_interface==CP_FABRIC_X0)
- {
- for (int current_group = 0 ; current_group < max_group; current_group++){
- if(slave_data_one_new[current_group]==slave_data_one_old[current_group] && slave_data_two_new[current_group]==slave_data_two_old[current_group] ){
- // If old and new data is same , no need to present FIRs to PRD
- if( !( slave_data_one_new[current_group].isBitClear(0,16) && slave_data_two_new[current_group].isBitClear(0,16) )){
- FAPI_DBG("io_run_training : Clear invalid FIRs on the slave side ");
- // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
- io_clear_firs(slave_target);
- clear_fir_summary_reg(slave_target,fir_slave_interface);
- if(rc) return rc;
- clear_fir_summary_reg(master_target,fir_master_interface);
- if(rc) return rc;
- }
- }
- if(master_data_one_new[current_group]==master_data_one_old[current_group] && master_data_two_new[current_group]==master_data_two_old[current_group] ){
- // If old and new data is same , no need to present FIRs to PRD
- if( !( master_data_one_new[current_group].isBitClear(0,16) && master_data_two_new[current_group].isBitClear(0,16) )){
- FAPI_DBG("io_run_training : Clear invalid FIRs on the master side ");
- // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
- io_clear_firs(master_target);
- clear_fir_summary_reg(slave_target,fir_slave_interface);
- if(rc) return rc;
- clear_fir_summary_reg(master_target,fir_master_interface);
- if(rc) return rc;
- }
- }
- }
- }
- else
- {
- if(slave_data_one_new[0]==slave_data_one_old[0] && slave_data_two_new[0]==slave_data_two_old[0] ){
- // If old and new data is same , no need to present FIRs to PRD
- if( !( slave_data_one_new[0].isBitClear(0,16) && slave_data_two_new[0].isBitClear(0,16) )){
- FAPI_DBG("io_run_training : Clear invalid FIRs on the slave side ");
- // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
- io_clear_firs(slave_target);
- clear_fir_summary_reg(slave_target,fir_slave_interface);
- if(rc) return rc;
- clear_fir_summary_reg(master_target,fir_master_interface);
- if(rc) return rc;
- }
- }
- if(master_data_one_new[0]==master_data_one_old[0] && master_data_two_new[0]==master_data_two_old[0] ){
- // If old and new data is same , no need to present FIRs to PRD
- if( !( master_data_one_new[0].isBitClear(0,16) && master_data_two_new[0].isBitClear(0,16) )){
- FAPI_DBG("io_run_training : Clear invalid FIRs on the master side ");
- // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
- io_clear_firs(master_target);
- clear_fir_summary_reg(slave_target,fir_slave_interface);
- if(rc) return rc;
- clear_fir_summary_reg(master_target,fir_master_interface);
- if(rc) return rc;
- }
- }
- }
-
-
- FAPI_DBG("io_run_training : Clearing FIR masks now-- REORDER");
- //Finally Unmask the LFIR to let PRD take action post training
- rc=clear_fir_mask_reg(slave_target,fir_slave_interface);
- if(rc) return rc;
- rc=clear_fir_mask_reg(master_target,fir_master_interface);
- // END post training part of Workaround - HW205368 - procedure from Rob /Pete
-
-
-return rc;
-
-}
-
-// //HW249235 --For DLL workaround
-// This function will check DLL status on slave and slave side . If any DLL has failed it will update to the next valid
-// DLL value . 3,4,5,6 are valid values that we are given to select.
-// This will continue until we run out of valid DLL reg selects or when the DLL cal passes
-
-ReturnCode check_dll_status_and_modify(const Target &master_target, io_interface_t master_interface,const Target &slave_target,
- io_interface_t slave_interface,bool dll_master_array[],
- bool dll_slave_array[],bool &dll_workaround_done,bool &dll_workaround_fail)
-{
- ReturnCode rc;
- uint32_t rc_ecmd=0;
- ecmdDataBufferBase dll_reg(16),set_bits(16),clear_bits(16),temp_bits(16);
- const uint16_t dll_vals[]={2,3,4,5,6,7};
- uint16_t bits=0;
- uint16_t dll_value=0;
- bool found_dll_master=false;
- bool found_dll_slave=false;
- bool found_dll_master_groups=false;
- bool found_dll_slave_groups=false;
- //bool dump_ffdc=false;
-
- bits=ei4_rx_dll_vreg_ref_sel_clear;
- rc_ecmd=clear_bits.insert(bits,0,16);
-
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return(rc);
- }
-
- FAPI_INF("DLL WORKAROUND CODE executing");
- // First we will populate current DLL values into std::vector
- for (int current_group = 0 ; current_group < 4; current_group++){
+
+
+ if(master_interface==CP_FABRIC_X0){
+ max_group=4;
+ }
+
+ FAPI_DBG("io_run_training : Starting post training HW workaround ");
+ // Start post training part of Workaround - HW205368 - procedure from Rob /Pete
+ // Read slave side bad lane data after training
+ if(master_interface==CP_FABRIC_X0){
+ for (int current_group = 0 ; current_group < max_group; current_group++){
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, slave_data_one_new[current_group]);
+ if(rc){return rc;}
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, slave_data_two_new[current_group]);
+ if(rc){return rc;}
+ }
+ //Take backup of master bad lane data restored by FW prior to training
+ for (int current_group = 0 ; current_group < max_group; current_group++){
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, current_group, 0, master_data_one_new[current_group]);
+ if(rc){return rc;}
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, current_group, 0, master_data_two_new[current_group]);
+ if(rc){return rc;}
+ }
+ }else{
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_0_15_pg, slave_group, 0, slave_data_one_new[0]);
+ if(rc){return rc;}
+ rc = GCR_read( slave_target, slave_interface, rx_lane_bad_vec_16_31_pg, slave_group, 0, slave_data_two_new[0]);
+ if(rc){return rc;}
+ //Take backup of master bad lane data restored by FW prior to training
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_0_15_pg, master_group, 0, master_data_one_new[0]);
+ if(rc){return rc;}
+ rc = GCR_read( master_target, master_interface, rx_lane_bad_vec_16_31_pg, master_group, 0, master_data_two_new[0]);
+ if(rc){return rc;}
+ }
+ // Now we will compare the old and new bad lane data and take appropriate action
+ if(master_interface==CP_FABRIC_X0)
+ {
+ for (int current_group = 0 ; current_group < max_group; current_group++){
+ if(slave_data_one_new[current_group]==slave_data_one_old[current_group] && slave_data_two_new[current_group]==slave_data_two_old[current_group] ){
+ // If old and new data is same , no need to present FIRs to PRD
+ if( !( slave_data_one_new[current_group].isBitClear(0,16) && slave_data_two_new[current_group].isBitClear(0,16) )){
+ FAPI_DBG("io_run_training : Clear invalid FIRs on the slave side ");
+ // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
+ rc = io_clear_firs(slave_target);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(slave_target,fir_slave_interface);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(master_target,fir_master_interface);
+ if(rc) return rc;
+ }
+ }
+ if(master_data_one_new[current_group]==master_data_one_old[current_group] && master_data_two_new[current_group]==master_data_two_old[current_group] ){
+ // If old and new data is same , no need to present FIRs to PRD
+ if( !( master_data_one_new[current_group].isBitClear(0,16) && master_data_two_new[current_group].isBitClear(0,16) )){
+ FAPI_DBG("io_run_training : Clear invalid FIRs on the master side ");
+ // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
+ rc = io_clear_firs(master_target);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(slave_target,fir_slave_interface);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(master_target,fir_master_interface);
+ if(rc) return rc;
+ }
+ }
+ }
+ }
+ else
+ {
+ if(slave_data_one_new[0]==slave_data_one_old[0] && slave_data_two_new[0]==slave_data_two_old[0] ){
+ // If old and new data is same , no need to present FIRs to PRD
+ if( !( slave_data_one_new[0].isBitClear(0,16) && slave_data_two_new[0].isBitClear(0,16) )){
+ FAPI_DBG("io_run_training : Clear invalid FIRs on the slave side ");
+ // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
+ rc = io_clear_firs(slave_target);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(slave_target,fir_slave_interface);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(master_target,fir_master_interface);
+ if(rc) return rc;
+ }
+ }
+ if(master_data_one_new[0]==master_data_one_old[0] && master_data_two_new[0]==master_data_two_old[0] ){
+ // If old and new data is same , no need to present FIRs to PRD
+ if( !( master_data_one_new[0].isBitClear(0,16) && master_data_two_new[0].isBitClear(0,16) )){
+ FAPI_DBG("io_run_training : Clear invalid FIRs on the master side ");
+ // If all bad lane info is clear in new data then no need to clear ,this is a 0==0 case of both old and new empty vectors
+ rc = io_clear_firs(master_target);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(slave_target,fir_slave_interface);
+ if(rc) return rc;
+ rc = clear_fir_summary_reg(master_target,fir_master_interface);
+ if(rc) return rc;
+ }
+ }
+ }
+
+
+ FAPI_DBG("io_run_training : Clearing FIR masks now-- REORDER");
+ //Finally Unmask the LFIR to let PRD take action post training
+ rc=clear_fir_mask_reg(slave_target,fir_slave_interface);
+ if(rc) return rc;
+ rc=clear_fir_mask_reg(master_target,fir_master_interface);
+ // END post training part of Workaround - HW205368 - procedure from Rob /Pete
+
+
+ return rc;
+
+ }
+
+ // //HW249235 --For DLL workaround
+ // This function will check DLL status on slave and slave side . If any DLL has failed it will update to the next valid
+ // DLL value . 3,4,5,6 are valid values that we are given to select.
+ // This will continue until we run out of valid DLL reg selects or when the DLL cal passes
+
+ ReturnCode check_dll_status_and_modify(const Target &master_target, io_interface_t master_interface,const Target &slave_target,
+ io_interface_t slave_interface,bool dll_master_array[],
+ bool dll_slave_array[],bool &dll_workaround_done,bool &dll_workaround_fail)
+ {
+ ReturnCode rc;
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase dll_reg(16),set_bits(16),clear_bits(16),temp_bits(16);
+ const uint16_t dll_vals[]={2,3,4,5,6,7};
+ uint16_t bits=0;
+ uint16_t dll_value=0;
+ bool found_dll_master=false;
+ bool found_dll_slave=false;
+ bool found_dll_master_groups=false;
+ bool found_dll_slave_groups=false;
+ //bool dump_ffdc=false;
+
+ bits=ei4_rx_dll_vreg_ref_sel_clear;
+ rc_ecmd=clear_bits.insert(bits,0,16);
+
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+
+ FAPI_INF("DLL WORKAROUND CODE executing");
+ // First we will populate current DLL values into std::vector
+ for (int current_group = 0 ; current_group < 4; current_group++){
// slave side operations
- rc = GCR_read( slave_target, slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group, 0, dll_reg);
- if(rc){return rc;}
- rc_ecmd|=dll_reg.extract( &dll_value, 4, 3 );
- if(rc_ecmd)
- {
+ rc = GCR_read( slave_target, slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group, 0, dll_reg);
+ if(rc){return rc;}
+ rc_ecmd|=dll_reg.extract( &dll_value, 4, 3 );
+ if(rc_ecmd)
+ {
FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
rc.setEcmdError(rc_ecmd);
return(rc);
- }
-
- FAPI_DBG("Extracted DLL value is %d",dll_value);
- dll_value=dll_value>>13;
- FAPI_DBG("DLL value for %d clock group is %d on slave side",current_group,dll_value);
- if(rc){return rc;}
-
- if(dll_value>=dll_vals[0] && dll_value<=dll_vals[5]){
+ }
+
+ FAPI_DBG("Extracted DLL value is %d",dll_value);
+ dll_value=dll_value>>13;
+ FAPI_DBG("DLL value for %d clock group is %d on slave side",current_group,dll_value);
+ if(rc){return rc;}
+
+ if(dll_value>=dll_vals[0] && dll_value<=dll_vals[5]){
dll_slave_array[current_group*6+(dll_value-dll_vals[0])]=true;
- }
- else{
- FAPI_ERR("DLL Vreg Cal sel value out of bounds for workaround !!");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_DLL_VAL_OUT_OF_BOUND_RC);
- return rc;
- }
-
- rc = GCR_read( slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group, 0, dll_reg);
- if(rc){return rc;}
- if(dll_reg.isBitSet(1) || dll_reg.isBitSet(2) || dll_reg.isBitSet(9) || dll_reg.isBitSet(10)){
- // Some DLL error is present , lets push this Clock group ref cal value to the next untried value
- FAPI_DBG("DLL error detected on clock group %d on slave target",current_group);
-
- rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
- if(rc){return rc;}
- for(int dll_valid=0;dll_valid<6;++dll_valid){
+ }
+ else{
+ FAPI_ERR("DLL Vreg Cal sel value out of bounds for workaround !!");
+ const fapi::Target &TARGET = slave_target;
+ ecmdDataBufferBase &DLL_REG=dll_reg;
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_CHECK_DLL_VAL_OUT_OF_BOUND_RC);
+ return rc;
+ }
+
+ rc = GCR_read( slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group, 0, dll_reg);
+ if(rc){return rc;}
+ if(dll_reg.isBitSet(1) || dll_reg.isBitSet(2) || dll_reg.isBitSet(9) || dll_reg.isBitSet(10)){
+ // Some DLL error is present , lets push this Clock group ref cal value to the next untried value
+ FAPI_DBG("DLL error detected on clock group %d on slave target",current_group);
+
+ rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
+ if(rc){return rc;}
+ for(int dll_valid=0;dll_valid<6;++dll_valid){
if(dll_slave_array[current_group*6 + dll_valid]==false){
- // Now set the DLL vref cal sel reg value to the next valid untried value
- dll_value=dll_vals[dll_valid];
- FAPI_DBG("DLL value to be written is %d dll_valid=%d current_group=%d",dll_value,dll_valid,current_group);
- rc=GCR_read(slave_target , slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits);
- if(rc){return rc;}
- rc_ecmd=set_bits.insert(dll_value,4,3,13);
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer insertion in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits, clear_bits);
- if(rc){return rc;}
- found_dll_slave=true;
- dll_slave_array[current_group*6 + dll_valid]=true;
- break;
+ // Now set the DLL vref cal sel reg value to the next valid untried value
+ dll_value=dll_vals[dll_valid];
+ FAPI_DBG("DLL value to be written is %d dll_valid=%d current_group=%d",dll_value,dll_valid,current_group);
+ rc=GCR_read(slave_target , slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits);
+ if(rc){return rc;}
+ rc_ecmd=set_bits.insert(dll_value,4,3,13);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer insertion in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits, clear_bits);
+ if(rc){return rc;}
+ found_dll_slave=true;
+ dll_slave_array[current_group*6 + dll_valid]=true;
+ break;
}
- }
- if(found_dll_slave==false){
+ }
+ if(found_dll_slave==false){
FAPI_ERR("No valid DLL reg value left to search.. DLL cal on slave of this channel has failed ");
// Now do FFDC call outs
//dump_ffdc=true;
dll_workaround_fail=true;
- FAPI_SET_HWP_ERROR(rc,IO_RUN_TRAINING_DLL_WORKAROUND_FAIL);
+ const fapi::Target &TARGET = slave_target;
+ ecmdDataBufferBase &DLL_REG=dll_reg;
+ FAPI_SET_HWP_ERROR(rc,IO_RUN_TRAINING_CHECK_DLL_WORKAROUND_FAIL);
return rc;
- }
- }
- else{
- FAPI_DBG("NO DLL error detected on clock group %d on slave target",current_group);
- }
-
- if(!found_dll_slave){ // If slave has DLL failure , Master status is invalid - John G
- // master SIDE operations
- // Push current DLL value into the std::vector
- dll_reg.flushTo0();
- rc = GCR_read( master_target, master_interface, ei4_rx_dll_analog_tweaks_pg, current_group, 0, dll_reg);
- if(rc){return rc;}
- rc_ecmd|=dll_reg.extract( &dll_value, 4, 3 );
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ }
+ }
+ else{
+ FAPI_DBG("NO DLL error detected on clock group %d on slave target",current_group);
+ }
+
+ if(!found_dll_slave){ // If slave has DLL failure , Master status is invalid - John G
+ // master SIDE operations
+ // Push current DLL value into the std::vector
+ rc_ecmd |= dll_reg.flushTo0();
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ rc = GCR_read( master_target, master_interface, ei4_rx_dll_analog_tweaks_pg, current_group, 0, dll_reg);
+ if(rc){return rc;}
+ rc_ecmd|=dll_reg.extract( &dll_value, 4, 3 );
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+
+ FAPI_DBG("Extracted DLL value is %d",dll_value);
+ dll_value=dll_value>>13;
+ FAPI_DBG("DLL value for %d clock group is %d on master side",current_group,dll_value);
+ if(rc){return rc;}
+ if(dll_value>=dll_vals[0] && dll_value<=dll_vals[5]){
+ dll_master_array[current_group*6+(dll_value-dll_vals[0])]=true;
+ }
+ else{
+ FAPI_ERR("DLL Vreg Cal sel value out of bounds for workaround !!");
+ const fapi::Target &TARGET = slave_target;
+ ecmdDataBufferBase &DLL_REG=dll_reg;
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_CHECK_DLL_VAL_OUT_OF_BOUND_RC);
+ return rc;
+ }
+ rc = GCR_read( master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group, 0, dll_reg);
+ if(rc){return rc;}
+ if(dll_reg.isBitSet(1) || dll_reg.isBitSet(2) || dll_reg.isBitSet(9) || dll_reg.isBitSet(10)){
+ // Some DLL error is present , lets push this Clock group to the next untried value
+ FAPI_DBG("DLL error detected on clock group %d on master target",current_group);
+ rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
+ if(rc){return rc;}
+
+ for(int dll_valid=0;dll_valid<6;++dll_valid){
+ if(dll_master_array[current_group*6 + dll_valid]==false){
+ // Now set the DLL vref cal sel reg value to the next valid untried value
+ dll_value=dll_vals[dll_valid];
+ FAPI_DBG("DLL value to be written is %d",dll_value);
+ rc=GCR_read(master_target , master_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits);
+ if(rc){return rc;}
+ rc_ecmd=set_bits.insert(dll_value,4,3,13);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer insertion in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ rc=GCR_write(master_target, master_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits, clear_bits);
+ if(rc){return rc;}
+ found_dll_master=true;
+ dll_master_array[current_group*6 + dll_valid]=true;
+ break;
+ }
+ }
+ if(found_dll_master==false){
+ FAPI_ERR("No valid DLL reg value left to search.. DLL cal on master of this channel has failed ");
+ //dump_ffdc=true;
+ }
+ }
+ else{
+ FAPI_DBG("NO DLL error detected on clock group %d on master target",current_group);
+ }
+
+ }
+ if(found_dll_master){
+ found_dll_master_groups=true;
+ }
+ if(found_dll_slave){
+ found_dll_slave_groups=true;
+ }
+ }
+
+ if(found_dll_master_groups || found_dll_slave_groups ) {
+ // at least one clock group on a slave or slave had a DLL fail and valid values to try so we will ask wrapper to continue the
+ // workaround invocations
+ FAPI_DBG("One setting failed on master or slave ");
+ dll_workaround_done=false;
+ }
+ else{
+ // No DLL fail or no Vreg sel values left to try out so we are done
+ dll_workaround_done=true;
+ FAPI_DBG("DLL Workaround done in checker function");
+ //if(dump_ffdc){
+ // rc=edi_training::dump_dll_ffdc(master_target,master_interface,slave_target,slave_interface);
+ //}
+ }
+
+
+ return rc;
+ }
+
+ ReturnCode set_tx_drv_pattern(const Target &master_target, io_interface_t master_interface,uint32_t master_group,const Target &slave_target,
+ io_interface_t slave_interface,uint32_t slave_group)
+ {
+ ReturnCode rc;
+ uint32_t rc_ecmd=0;
+ // For DLL shmoo workaround
+ ecmdDataBufferBase set_bits(16),clear_bits(16),clear_train_bits(16);
+ uint16_t bits=0;
+
+ FAPI_DBG("DLL workaround : Setting TX DRV pattern back to 0000 before restarting training on X bus ");
+ // Clear Clk pattern
+ bits=ei4_tx_drv_data_pattern_gcrmsg_clear;
+ rc_ecmd=clear_bits.insert(bits,0,16);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ rc=GCR_write(slave_target, slave_interface,ei4_tx_data_cntl_gcrmsg_pl , 15,31, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(master_target, master_interface,ei4_tx_data_cntl_gcrmsg_pl , 15,31, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+ //Clear Data pattern
+ bits=ei4_tx_drv_clk_pattern_gcrmsg_clear;
+ rc_ecmd=clear_bits.insert(bits,0,16);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ rc=GCR_write(slave_target, slave_interface, ei4_tx_clk_cntl_gcrmsg_pg , 15,0, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(master_target, master_interface, ei4_tx_clk_cntl_gcrmsg_pg , 15,0, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+
+ // According to John G , This reset is required as well
+ bits= ei4_rx_wt_cu_pll_reset_clear ;
+ rc_ecmd = clear_bits.insert(bits,0,16);
+ rc_ecmd |= set_bits.flushTo0();
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
+ rc.setEcmdError(rc_ecmd);
+ return rc;
+ }
+ //Reset wt_cu_pll & Wiretest status & Start bits
+ for (int current_group = 0 ; current_group < 4; current_group++){
+ //Reset training start and status bits - as per Rob
+ rc=GCR_write(slave_target , slave_interface, ei4_rx_training_start_pg,current_group,0, set_bits, clear_train_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(slave_target , slave_interface, ei4_rx_training_status_pg, current_group,0, set_bits,clear_train_bits,1,1);
+ if(rc){return rc;}
+ //Reset Wt PLL as per John G
+ rc=GCR_write(slave_target, slave_interface, ei4_rx_wiretest_pll_cntl_pg , current_group,0, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+
+ //Reset training start and status bits - as per Rob
+ rc=GCR_write(master_target , master_interface, ei4_rx_training_start_pg,current_group,0, set_bits, clear_train_bits,1,1);
+ if(rc){return rc;}
+ rc=GCR_write(master_target , master_interface, ei4_rx_training_status_pg, current_group,0, set_bits,clear_train_bits,1,1);
+ if(rc){return rc;}
+ // Reset Wt PLL as per John G
+ rc=GCR_write(master_target, master_interface, ei4_rx_wiretest_pll_cntl_pg , current_group,0, set_bits, clear_bits,1,1);
+ if(rc){return rc;}
+ }
+
+
+ FAPI_DBG("Done Setting TX Drv pattern to 0000 and wt_cu_pll_reset to 0 for DLL workaround ");
+ return rc;
+ }
+
+ //HW Defect HW220449 , HW HW247831
+ // Set rx_sls_extend_sel=001 on slave side of X bus post training
+ ReturnCode do_sls_fix(const Target &slave_target, io_interface_t slave_interface)
+ {
+ ReturnCode rc;
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase set_bits(16),clear_bits(16);
+ uint16_t bits=1;
+
+ FAPI_DBG("Setting rx_extend_sel to 001 for all Xbus slaves for HW220449");
+ for (int current_group = 0 ; current_group < 4; current_group++){
+ rc = GCR_read( slave_target, slave_interface,ei4_rx_spare_mode_pg, current_group, 0, set_bits);
+ if(rc){return rc;}
+ rc_ecmd = set_bits.insert(bits,5,3,13); // insert rx_sls_extend_sel
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer manipulation in do_sls_fix \n");
rc.setEcmdError(rc_ecmd);
return rc;
- }
-
- FAPI_DBG("Extracted DLL value is %d",dll_value);
- dll_value=dll_value>>13;
- FAPI_DBG("DLL value for %d clock group is %d on master side",current_group,dll_value);
- if(rc){return rc;}
- if(dll_value>=dll_vals[0] && dll_value<=dll_vals[5]){
- dll_master_array[current_group*6+(dll_value-dll_vals[0])]=true;
- }
- else{
- FAPI_ERR("DLL Vreg Cal sel value out of bounds for workaround !!");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_DLL_VAL_OUT_OF_BOUND_RC);
- return rc;
- }
- rc = GCR_read( master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group, 0, dll_reg);
- if(rc){return rc;}
- if(dll_reg.isBitSet(1) || dll_reg.isBitSet(2) || dll_reg.isBitSet(9) || dll_reg.isBitSet(10)){
- // Some DLL error is present , lets push this Clock group to the next untried value
- FAPI_DBG("DLL error detected on clock group %d on master target",current_group);
- rc=GCR_write(slave_target, slave_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(master_target, master_interface, ei4_rx_dll_cal_cntl_pg, current_group,0, temp_bits, temp_bits,1,1);
- if(rc){return rc;}
-
- for(int dll_valid=0;dll_valid<6;++dll_valid){
- if(dll_master_array[current_group*6 + dll_valid]==false){
- // Now set the DLL vref cal sel reg value to the next valid untried value
- dll_value=dll_vals[dll_valid];
- FAPI_DBG("DLL value to be written is %d",dll_value);
- rc=GCR_read(master_target , master_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits);
- if(rc){return rc;}
- rc_ecmd=set_bits.insert(dll_value,4,3,13);
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer insertion in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc=GCR_write(master_target, master_interface, ei4_rx_dll_analog_tweaks_pg, current_group,0, set_bits, clear_bits);
- if(rc){return rc;}
- found_dll_master=true;
- dll_master_array[current_group*6 + dll_valid]=true;
- break;
- }
- }
- if(found_dll_master==false){
- FAPI_ERR("No valid DLL reg value left to search.. DLL cal on master of this channel has failed ");
- //dump_ffdc=true;
- }
- }
- else{
- FAPI_DBG("NO DLL error detected on clock group %d on master target",current_group);
- }
-
- }
- if(found_dll_master){
- found_dll_master_groups=true;
- }
- if(found_dll_slave){
- found_dll_slave_groups=true;
- }
- }
-
- if(found_dll_master_groups || found_dll_slave_groups ) {
- // at least one clock group on a slave or slave had a DLL fail and valid values to try so we will ask wrapper to continue the
- // workaround invocations
- FAPI_DBG("One setting failed on master or slave ");
- dll_workaround_done=false;
- }
- else{
- // No DLL fail or no Vreg sel values left to try out so we are done
- dll_workaround_done=true;
- FAPI_DBG("DLL Workaround done in checker function");
- //if(dump_ffdc){
- // rc=edi_training::dump_dll_ffdc(master_target,master_interface,slave_target,slave_interface);
- //}
- }
-
-
- return rc;
-}
-
-ReturnCode set_tx_drv_pattern(const Target &master_target, io_interface_t master_interface,uint32_t master_group,const Target &slave_target,
- io_interface_t slave_interface,uint32_t slave_group)
-{
- ReturnCode rc;
- uint32_t rc_ecmd=0;
- // For DLL shmoo workaround
- ecmdDataBufferBase set_bits(16),clear_bits(16),clear_train_bits(16);
- uint16_t bits=0;
-
- FAPI_DBG("DLL workaround : Setting TX DRV pattern back to 0000 before restarting training on X bus ");
- // Clear Clk pattern
- bits=ei4_tx_drv_data_pattern_gcrmsg_clear;
- rc_ecmd=clear_bits.insert(bits,0,16);
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc=GCR_write(slave_target, slave_interface,ei4_tx_data_cntl_gcrmsg_pl , 15,31, set_bits, clear_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(master_target, master_interface,ei4_tx_data_cntl_gcrmsg_pl , 15,31, set_bits, clear_bits,1,1);
- if(rc){return rc;}
- //Clear Data pattern
- bits=ei4_tx_drv_clk_pattern_gcrmsg_clear;
- rc_ecmd=clear_bits.insert(bits,0,16);
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc=GCR_write(slave_target, slave_interface, ei4_tx_clk_cntl_gcrmsg_pg , 15,0, set_bits, clear_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(master_target, master_interface, ei4_tx_clk_cntl_gcrmsg_pg , 15,0, set_bits, clear_bits,1,1);
- if(rc){return rc;}
-
- // According to John G , This reset is required as well
- bits= ei4_rx_wt_cu_pll_reset_clear ;
- rc_ecmd=clear_bits.insert(bits,0,16);
- if(rc_ecmd)
- {
- FAPI_ERR("Failed buffer intialization in DLL workaround function \n");
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- set_bits.flushTo0();
- //Reset wt_cu_pll & Wiretest status & Start bits
- for (int current_group = 0 ; current_group < 4; current_group++){
- //Reset training start and status bits - as per Rob
- rc=GCR_write(slave_target , slave_interface, ei4_rx_training_start_pg,current_group,0, set_bits, clear_train_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(slave_target , slave_interface, ei4_rx_training_status_pg, current_group,0, set_bits,clear_train_bits,1,1);
- if(rc){return rc;}
- //Reset Wt PLL as per John G
- rc=GCR_write(slave_target, slave_interface, ei4_rx_wiretest_pll_cntl_pg , current_group,0, set_bits, clear_bits,1,1);
- if(rc){return rc;}
-
- //Reset training start and status bits - as per Rob
- rc=GCR_write(master_target , master_interface, ei4_rx_training_start_pg,current_group,0, set_bits, clear_train_bits,1,1);
- if(rc){return rc;}
- rc=GCR_write(master_target , master_interface, ei4_rx_training_status_pg, current_group,0, set_bits,clear_train_bits,1,1);
- if(rc){return rc;}
- // Reset Wt PLL as per John G
- rc=GCR_write(master_target, master_interface, ei4_rx_wiretest_pll_cntl_pg , current_group,0, set_bits, clear_bits,1,1);
- if(rc){return rc;}
- }
-
-
- FAPI_DBG("Done Setting TX Drv pattern to 0000 and wt_cu_pll_reset to 0 for DLL workaround ");
- return rc;
-}
-
-//HW Defect HW220449 , HW HW247831
-// Set rx_sls_extend_sel=001 on slave side of X bus post training
-ReturnCode do_sls_fix(const Target &slave_target, io_interface_t slave_interface)
-{
- ReturnCode rc;
- ecmdDataBufferBase set_bits(16),clear_bits(16);
- uint16_t bits=1;
-
- FAPI_DBG("Setting rx_extend_sel to 001 for all Xbus slaves for HW220449");
- for (int current_group = 0 ; current_group < 4; current_group++){
- rc = GCR_read( slave_target, slave_interface,ei4_rx_spare_mode_pg, current_group, 0, set_bits);
- set_bits.insert(bits,5,3,13); // insert rx_sls_extend_sel
- rc=GCR_write(slave_target, slave_interface, ei4_rx_spare_mode_pg , current_group,0, set_bits, clear_bits);
- }
- return rc;
-}
-
-// To handle the MAX_SPARE_EXCEEDED FIR case which we have to handle here in our HWP instead of waiting for PRD.
-ReturnCode handle_max_spare(const Target &target,io_interface_t interface,uint8_t current_group){
- ReturnCode o_rc;
- ecmdDataBufferBase error_data(16);
- uint32_t bitPos=0x2680;
-
- if(interface==CP_FABRIC_X0){
- o_rc=GCR_read(target , interface, ei4_rx_fir_training_pg, current_group,0, error_data);
- }
- else{
- o_rc=GCR_read(target , interface, rx_fir_training_pg, current_group,0, error_data);
- }
- if(o_rc)
- return o_rc;
- if(error_data.isBitSet(2,1)){ // can be caused by a static (pre training - bit 2) or dynamic (post training - bit 5) or recal(bit 8)
- FAPI_ERR("MAX_SPARE_EXCEEDED ON THIS BUS clock group %d",current_group);
- error_data.setAnd(bitPos,0,16);
- ecmdDataBufferBase & SPARE_ERROR_REG = error_data; //bit2 /bit 5 /bit 8of the register represents the max spare exceeded bit.To determine what caused the max spares exceeded error
- const fapi::Target & CHIP_TARGET= target;
- FAPI_SET_HWP_ERROR(o_rc,IO_FIR_MAX_SPARES_EXCEEDED_FIR_RC);
- }
- return(o_rc);
-}
-
-// These functions work on a pair of targets. One is the master side of the bus interface, the other the slave side. For eg; in EDI(DMI2)PU is the master and Centaur is the slave
-// In EI4 both sides have pu targets . After the talk with Dean , my understanding is that targets are configured down upto the endpoints of a particular bus. eg; pu 0 A0 --> pu 1 A3 could be a combination on EI4
-// In a EDI(DMI) bus the targets are considered to be one pu and one centaur pair . The overall code is same for EDI and EI4 and the run_training function handles both bus types ( X ,A or MC ) .
-ReturnCode io_run_training(const Target &master_target,const Target &slave_target){
- ReturnCode rc;
- io_interface_t master_interface,slave_interface;
- uint32_t master_group=0;
- uint32_t slave_group=0;
- const uint32_t max_group=4; // Num of X bus groups in one bus
- edi_training init;
-
- // Workaround - HW 220654 -- Need to split WDERF into WDE + RF
- edi_training init1(SELECTED,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING); // Run WDE first
-
- // For Xbus DLL Workaround , we need Wiretest alone , then DE and RF
-
- // For Xbus DLL Workaround , we need Wiretest alone , then DE and RF
- edi_training init_w(SELECTED,NOT_RUNNING, NOT_RUNNING, NOT_RUNNING, NOT_RUNNING); // Run W for Xbus
- edi_training init_wde(SELECTED,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING); // Run DE next for X bus
-
- // For the PLL workaround we need a DE Object since DE + RF should be separate as per original guidelines
- edi_training init_de(NOT_RUNNING,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING);
-
- // Need an object to restore object state after one wiretest run.
- edi_training copy_w=init_w;
- // DE & RF needs to be split due to HW 220654
- edi_training init2( NOT_RUNNING, NOT_RUNNING, NOT_RUNNING,SELECTED,SELECTED); // Run RF next
- bool is_master=false;
- //FIR workaround buffers
- //These buffers will store old bad lane info that was restored prior to training
- ecmdDataBufferBase slave_data_one_old[4];
- ecmdDataBufferBase slave_data_two_old[4];
- ecmdDataBufferBase master_data_one_old[4];
- ecmdDataBufferBase master_data_two_old[4];
-
-
- // This is a DMI/MC bus
- if( (master_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )&&
- (slave_target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP))
- {
- FAPI_DBG("This is a DMI bus using base DMI scom address");
- master_interface=CP_IOMC0_P0; // base scom for MC bus
- slave_interface=CEN_DMI; // Centaur scom base
- master_group=3; // Design requires us to do this as per scom map and layout
- slave_group=0;
- rc=fir_workaround_pre_training(master_target,master_interface,master_group,
- slave_target,slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,
- master_data_one_old,master_data_two_old);
- if(rc) return rc;
- // Workaround - HW 220654 -- Need to split WDERF into WDE + RF due to sync problem
- // For PLL workaround now we run W alone , followed by DE then RF
- rc=init_w.run_training(master_target,master_interface,master_group,
- slave_target,slave_interface,slave_group);
- if(!rc.ok()){
- return rc;
- }
-
- // Now Set PLL to runtime setting and continue with training
- // Call Janani's PLL ring set function from DCCAL module. It in turn uses Joe's funcs
-
- rc=io_training_set_pll_post_wiretest(slave_target);
- //FAPI_DBG("Waiting for 1s after PLL Update on slave");
- //rc=fapiDelay(1000000,1000);
-
- if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
- return rc;
- }
- rc=io_training_set_pll_post_wiretest(master_target);
- if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
- return rc;
- }
- // FAPI_DBG("Waiting for 1s after PLL Update on master");
- // rc=fapiDelay(1000000,1000);
- // Run DE Now - as per Gary
- rc=init_de.run_training(master_target,master_interface,master_group,
- slave_target,slave_interface,slave_group);
- if(!rc.ok()){
- return rc;
- }
- //Now Run RF
- rc=init2.run_training(master_target,master_interface,master_group,
- slave_target,slave_interface,slave_group);
- if(rc) return rc;
- rc=fir_workaround_post_training(master_target,master_interface,
- master_group,slave_target,
- slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,
- master_data_one_old,master_data_two_old);
- if(rc) return rc;
- rc=handle_max_spare(master_target,master_interface,master_group);
- if(rc) return rc;
- rc=handle_max_spare(slave_target,slave_interface,slave_group);
- if(rc) return rc;
-
-
- }
- //This is an X Bus
- else if( (master_target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT )&&
- (slave_target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT ))
- {
- FAPI_DBG("This is a X Bus training invocation");
- master_interface=CP_FABRIC_X0; // base scom for X bus
- slave_interface=CP_FABRIC_X0; // base scom for X bus
- slave_group=0; // Design requires us to do this as per scom map and layout
- master_group=0;
- uint8_t trial_count=0;
- //HW249235 --For DLL workaround
- bool dll_master_array[24],dll_slave_array[24]; // DLL array for each clock group
- bool dll_workaround_done=false;
- bool dll_workaround_fail=false;
-
- //init Bool array
- for(int i=0;i<24;++i){
- dll_master_array[i]=false;
- dll_slave_array[i]=false;
- }
-
- rc=init.isChipMaster(master_target,master_interface,master_group,is_master);
- if(rc.ok()){
- if(!is_master)
- {
- //Swap slave and slave targets !!
- FAPI_DBG("X Bus ..target swap performed");
- rc=fir_workaround_pre_training(slave_target,slave_interface,
- slave_group,slave_target,
- slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,
- master_data_one_old,master_data_two_old);
- if(rc) return rc;
+ }
+ rc=GCR_write(slave_target, slave_interface, ei4_rx_spare_mode_pg , current_group,0, set_bits, clear_bits);
+ if(rc){return rc;}
+ }
+ return rc;
+ }
+
+ // To handle the MAX_SPARE_EXCEEDED FIR case which we have to handle here in our HWP instead of waiting for PRD.
+ ReturnCode handle_max_spare(const Target &target,io_interface_t interface,uint8_t current_group){
+ ReturnCode o_rc;
+ uint32_t rc_ecmd=0;
+ ecmdDataBufferBase error_data(16);
+ uint32_t bitPos=0x2680;
+
+ if(interface==CP_FABRIC_X0){
+ o_rc=GCR_read(target , interface, ei4_rx_fir_training_pg, current_group,0, error_data);
+ }
+ else{
+ o_rc=GCR_read(target , interface, rx_fir_training_pg, current_group,0, error_data);
+ }
+ if(o_rc)
+ return o_rc;
+ if(error_data.isBitSet(2,1)){ // can be caused by a static (pre training - bit 2) or dynamic (post training - bit 5) or recal(bit 8)
+ FAPI_ERR("MAX_SPARE_EXCEEDED ON THIS BUS clock group %d",current_group);
+ rc_ecmd = error_data.setAnd(bitPos,0,16);
+ if(rc_ecmd)
+ {
+ FAPI_ERR("Failed buffer manipulation in handle_max_spare \n");
+ o_rc.setEcmdError(rc_ecmd);
+ return o_rc;
+ }
+ ecmdDataBufferBase & SPARE_ERROR_REG = error_data; //bit2 /bit 5 /bit 8of the register represents the max spare exceeded bit.To determine what caused the max spares exceeded error
+ const fapi::Target & CHIP_TARGET= target;
+ FAPI_SET_HWP_ERROR(o_rc,IO_RUN_TRAINING_FIR_MAX_SPARES_EXCEEDED_RC);
+ }
+ return(o_rc);
+ }
+
+ // These functions work on a pair of targets. One is the master side of the bus interface, the other the slave side. For eg; in EDI(DMI2)PU is the master and Centaur is the slave
+ // In EI4 both sides have pu targets . After the talk with Dean , my understanding is that targets are configured down upto the endpoints of a particular bus. eg; pu 0 A0 --> pu 1 A3 could be a combination on EI4
+ // In a EDI(DMI) bus the targets are considered to be one pu and one centaur pair . The overall code is same for EDI and EI4 and the run_training function handles both bus types ( X ,A or MC ) .
+ ReturnCode io_run_training(const Target &master_target,const Target &slave_target){
+ ReturnCode rc;
+ io_interface_t master_interface,slave_interface;
+ uint32_t master_group=0;
+ uint32_t slave_group=0;
+ const uint32_t max_group=4; // Num of X bus groups in one bus
+ edi_training init;
+
+ // Workaround - HW 220654 -- Need to split WDERF into WDE + RF
+ edi_training init1(SELECTED,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING); // Run WDE first
+
+ // For Xbus DLL Workaround , we need Wiretest alone , then DE and RF
+
+ // For Xbus DLL Workaround , we need Wiretest alone , then DE and RF
+ edi_training init_w(SELECTED,NOT_RUNNING, NOT_RUNNING, NOT_RUNNING, NOT_RUNNING); // Run W for Xbus
+ edi_training init_wde(SELECTED,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING); // Run DE next for X bus
+
+ // For the PLL workaround we need a DE Object since DE + RF should be separate as per original guidelines
+ edi_training init_de(NOT_RUNNING,SELECTED,SELECTED, NOT_RUNNING, NOT_RUNNING);
+
+ // Need an object to restore object state after one wiretest run.
+ edi_training copy_w=init_w;
+ // DE & RF needs to be split due to HW 220654
+ edi_training init2( NOT_RUNNING, NOT_RUNNING, NOT_RUNNING,SELECTED,SELECTED); // Run RF next
+ bool is_master=false;
+ //FIR workaround buffers
+ //These buffers will store old bad lane info that was restored prior to training
+ ecmdDataBufferBase slave_data_one_old[4];
+ ecmdDataBufferBase slave_data_two_old[4];
+ ecmdDataBufferBase master_data_one_old[4];
+ ecmdDataBufferBase master_data_two_old[4];
+
+
+ // This is a DMI/MC bus
+ if( (master_target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET )&&
+ (slave_target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP))
+ {
+ FAPI_DBG("This is a DMI bus using base DMI scom address");
+ master_interface=CP_IOMC0_P0; // base scom for MC bus
+ slave_interface=CEN_DMI; // Centaur scom base
+ master_group=3; // Design requires us to do this as per scom map and layout
+ slave_group=0;
+ rc=fir_workaround_pre_training(master_target,master_interface,master_group,
+ slave_target,slave_interface,slave_group,
+ slave_data_one_old,slave_data_two_old,
+ master_data_one_old,master_data_two_old);
+ if(rc) return rc;
+ // Workaround - HW 220654 -- Need to split WDERF into WDE + RF due to sync problem
+ // For PLL workaround now we run W alone , followed by DE then RF
+ rc=init_w.run_training(master_target,master_interface,master_group,
+ slave_target,slave_interface,slave_group);
+ if(!rc.ok()){
+ return rc;
+ }
+
+ // Now Set PLL to runtime setting and continue with training
+ // Call Janani's PLL ring set function from DCCAL module. It in turn uses Joe's funcs
+
+ rc=io_training_set_pll_post_wiretest(slave_target);
+ //FAPI_DBG("Waiting for 1s after PLL Update on slave");
+ //rc=fapiDelay(1000000,1000);
+
+ if(!rc.ok()){
+ FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
+ return rc;
+ }
+ rc=io_training_set_pll_post_wiretest(master_target);
+ if(!rc.ok()){
+ FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
+ return rc;
+ }
+ // FAPI_DBG("Waiting for 1s after PLL Update on master");
+ // rc=fapiDelay(1000000,1000);
+ // Run DE Now - as per Gary
+ rc=init_de.run_training(master_target,master_interface,master_group,
+ slave_target,slave_interface,slave_group);
+ if(!rc.ok()){
+ return rc;
+ }
+ //Now Run RF
+ rc=init2.run_training(master_target,master_interface,master_group,
+ slave_target,slave_interface,slave_group);
+ if(rc) return rc;
+ rc=fir_workaround_post_training(master_target,master_interface,
+ master_group,slave_target,
+ slave_interface,slave_group,
+ slave_data_one_old,slave_data_two_old,
+ master_data_one_old,master_data_two_old);
+ if(rc) return rc;
+ rc=handle_max_spare(master_target,master_interface,master_group);
+ if(rc) return rc;
+ rc=handle_max_spare(slave_target,slave_interface,slave_group);
+ if(rc) return rc;
+
+
+ }
+ //This is an X Bus
+ else if( (master_target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT )&&
+ (slave_target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT ))
+ {
+ FAPI_DBG("This is a X Bus training invocation");
+ master_interface=CP_FABRIC_X0; // base scom for X bus
+ slave_interface=CP_FABRIC_X0; // base scom for X bus
+ slave_group=0; // Design requires us to do this as per scom map and layout
+ master_group=0;
+ uint8_t trial_count=0;
+ //HW249235 --For DLL workaround
+ bool dll_master_array[24],dll_slave_array[24]; // DLL array for each clock group
+ bool dll_workaround_done=false;
+ bool dll_workaround_fail=false;
+
+ //init Bool array
+ for(int i=0;i<24;++i){
+ dll_master_array[i]=false;
+ dll_slave_array[i]=false;
+ }
+
+ rc=init.isChipMaster(master_target,master_interface,master_group,is_master);
+ if(rc.ok()){
+ if(!is_master)
+ {
+ //Swap slave and slave targets !!
+ FAPI_DBG("X Bus ..target swap performed");
+ rc=fir_workaround_pre_training(slave_target,slave_interface,
+ slave_group,slave_target,
+ slave_interface,slave_group,
+ slave_data_one_old,slave_data_two_old,
+ master_data_one_old,master_data_two_old);
+ if(rc) return rc;
do
{
- trial_count++;
- FAPI_DBG("TRAINING TRIAL count=%d",trial_count);
- rc=init_w.run_training(slave_target,slave_interface,
- slave_group,master_target,
- master_interface,master_group);
- if(rc) {
- //HW249235 --For DLL workaround
- FAPI_DBG("Starting DLL Workaround");
- rc=check_dll_status_and_modify(slave_target,
- slave_interface,
- master_target,
- master_interface,
- dll_slave_array,
- dll_master_array,
- dll_workaround_done,
- dll_workaround_fail);
- if(rc) return rc;
- // Reset tx drive pattern to 0000 before starting Wiretest again -- As per Rob /Pete
- //Prep the targets for next round of WDE training -- Steps by Rob & Pete
- if(!dll_workaround_done)
- {
- rc=set_tx_drv_pattern(slave_target,
- slave_interface,
- slave_group,
- master_target,
- master_interface,
- master_group);
- }
- if(rc) return rc;
- }
- else{
- if(trial_count>1){
- FAPI_DBG("DLL workaround was successfull");
- }
- dll_workaround_done=true;
- }
- init_w=copy_w;
+ trial_count++;
+ FAPI_DBG("TRAINING TRIAL count=%d",trial_count);
+ rc=init_w.run_training(slave_target,slave_interface,
+ slave_group,master_target,
+ master_interface,master_group);
+ if(rc) {
+ //HW249235 --For DLL workaround
+ FAPI_DBG("Starting DLL Workaround");
+ rc=check_dll_status_and_modify(slave_target,
+ slave_interface,
+ master_target,
+ master_interface,
+ dll_slave_array,
+ dll_master_array,
+ dll_workaround_done,
+ dll_workaround_fail);
+ if(rc) return rc;
+ // Reset tx drive pattern to 0000 before starting Wiretest again -- As per Rob /Pete
+ //Prep the targets for next round of WDE training -- Steps by Rob & Pete
+ if(!dll_workaround_done)
+ {
+ rc=set_tx_drv_pattern(slave_target,
+ slave_interface,
+ slave_group,
+ master_target,
+ master_interface,
+ master_group);
+ if(rc) return rc;
+ }
+
+ }
+ else{
+ if(trial_count>1){
+ FAPI_DBG("DLL workaround was successfull");
+ }
+ dll_workaround_done=true;
+ }
+ init_w=copy_w;
}while(!dll_workaround_done);
if(!dll_workaround_fail){
- // We need to reset Wirtest machine so that we can do WDE again
- rc=set_tx_drv_pattern(slave_target,slave_interface,
- slave_group,master_target,
- master_interface,master_group);
- if(rc) return rc;
- rc=init_wde.run_training(slave_target,slave_interface,
- slave_group,master_target,
- master_interface,master_group);
- if(rc) return rc;
- rc=init2.run_training(slave_target,slave_interface,
- slave_group,master_target,
- master_interface,master_group);
- if(rc) return rc;
- rc=fir_workaround_post_training(slave_target,
- slave_interface,
- slave_group,
- slave_target,
- slave_interface,
- slave_group,
- slave_data_one_old,
- slave_data_two_old,
- master_data_one_old,
- master_data_two_old);
- if(rc) return rc;
- //HW Defect HW220449 , HW HW247831
- // Set rx_sls_extend_sel=001 on slave side of X bus post training
- rc=do_sls_fix(master_target,master_interface);
- if(rc) return rc;
+ // We need to reset Wirtest machine so that we can do WDE again
+ rc=set_tx_drv_pattern(slave_target,slave_interface,
+ slave_group,master_target,
+ master_interface,master_group);
+ if(rc) return rc;
+ rc=init_wde.run_training(slave_target,slave_interface,
+ slave_group,master_target,
+ master_interface,master_group);
+ if(rc) return rc;
+ rc=init2.run_training(slave_target,slave_interface,
+ slave_group,master_target,
+ master_interface,master_group);
+ if(rc) return rc;
+ rc=fir_workaround_post_training(slave_target,
+ slave_interface,
+ slave_group,
+ slave_target,
+ slave_interface,
+ slave_group,
+ slave_data_one_old,
+ slave_data_two_old,
+ master_data_one_old,
+ master_data_two_old);
+ if(rc) return rc;
+ //HW Defect HW220449 , HW HW247831
+ // Set rx_sls_extend_sel=001 on slave side of X bus post training
+ rc=do_sls_fix(master_target,master_interface);
+ if(rc) return rc;
}
- }
- else{
+ }
+ else{
rc=fir_workaround_pre_training(master_target,
- master_interface,
- master_group,
- slave_target,
- slave_interface,
- slave_group,
- master_data_one_old,
- master_data_two_old,
- slave_data_one_old,
- slave_data_two_old);
+ master_interface,
+ master_group,
+ slave_target,
+ slave_interface,
+ slave_group,
+ master_data_one_old,
+ master_data_two_old,
+ slave_data_one_old,
+ slave_data_two_old);
if(rc) return rc;
- do{
- trial_count++;
- FAPI_DBG("TRAINING TRIAL count=%d",trial_count);
- rc=init_w.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
- if(rc) {
- //HW249235 --For DLL workaround
- FAPI_DBG("Starting DLL Workaround");
- rc=check_dll_status_and_modify(master_target,master_interface,slave_target,slave_interface,
- dll_master_array,dll_slave_array,dll_workaround_done,dll_workaround_fail);
- if(rc) return rc;
- // Reset tx drive pattern to 0000 before starting Wiretest again -- As per Rob /Pete
- //Prep the targets for next round of WDE training -- Steps by Rob & Pete
- if(!dll_workaround_done){
- rc=set_tx_drv_pattern(master_target,master_interface,master_group,slave_target,slave_interface,
- slave_group);
- }
- if(rc) return rc;
- }
- else{
- if(trial_count>1){
- FAPI_DBG("DLL workaround was successfull");
- }
- dll_workaround_done=true;
- }
- init_w=copy_w;// Reset training object state to default
+ do{
+ trial_count++;
+ FAPI_DBG("TRAINING TRIAL count=%d",trial_count);
+ rc=init_w.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
+ if(rc) {
+ //HW249235 --For DLL workaround
+ FAPI_DBG("Starting DLL Workaround");
+ rc=check_dll_status_and_modify(master_target,master_interface,slave_target,slave_interface,
+ dll_master_array,dll_slave_array,dll_workaround_done,dll_workaround_fail);
+ if(rc) return rc;
+ // Reset tx drive pattern to 0000 before starting Wiretest again -- As per Rob /Pete
+ //Prep the targets for next round of WDE training -- Steps by Rob & Pete
+ if(!dll_workaround_done){
+ rc=set_tx_drv_pattern(master_target,master_interface,master_group,slave_target,slave_interface,
+ slave_group);
+ if(rc) return rc;
+ }
+ }
+ else{
+ if(trial_count>1){
+ FAPI_DBG("DLL workaround was successfull");
+ }
+ dll_workaround_done=true;
+ }
+ init_w=copy_w;// Reset training object state to default
}while(!dll_workaround_done);
if(!dll_workaround_fail){
- // We need to reset Wirtest machine so that we can do WDE again
- rc=set_tx_drv_pattern(master_target,master_interface,master_group,slave_target,slave_interface,
- slave_group);
- if(rc) return rc;
- rc=init_wde.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
- if(rc) {
-
- return rc;}
-
- rc=init2.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
- if(rc) return rc;
- rc=fir_workaround_post_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group,
- master_data_one_old,master_data_two_old,slave_data_one_old,slave_data_two_old);
- if(rc) return rc;
-
- //HW Defect HW220449 , HW HW247831
- // Set rx_sls_extend_sel=001 on slave side of X bus post training
+ // We need to reset Wirtest machine so that we can do WDE again
+ rc=set_tx_drv_pattern(master_target,master_interface,master_group,slave_target,slave_interface,
+ slave_group);
+ if(rc) return rc;
+ rc=init_wde.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
+ if(rc) return rc;
+ rc=init2.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
+ if(rc) return rc;
+ rc=fir_workaround_post_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group,
+ master_data_one_old,master_data_two_old,slave_data_one_old,slave_data_two_old);
+ if(rc) return rc;
+
+ //HW Defect HW220449 , HW HW247831
+ // Set rx_sls_extend_sel=001 on slave side of X bus post training
rc=do_sls_fix(slave_target,slave_interface);
if(rc) return rc;
}
- }
- for(uint32_t current_group=0;current_group<max_group;++current_group){
+ }
+ for(uint32_t current_group=0;current_group<max_group;++current_group){
rc=handle_max_spare(master_target,master_interface,current_group);
if(rc) return rc;
rc=handle_max_spare(slave_target,slave_interface,current_group);
if(rc) return rc;
- }
- }
- }
- //This is an A Bus
- else if( (master_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT )&& (slave_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)){
- FAPI_DBG("This is an A Bus training invocation");
- master_interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
- slave_interface=CP_FABRIC_A0; //base scom for A bus
- master_group=0; // Design requires us to do this as per scom map and layout
- slave_group=0;
- rc=init.isChipMaster(master_target,master_interface,master_group,is_master);
- if(rc.ok()){
- if(!is_master)
- {
+ }
+ }
+ }
+ //This is an A Bus
+ else if( (master_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT )&& (slave_target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT)){
+ FAPI_DBG("This is an A Bus training invocation");
+ master_interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
+ slave_interface=CP_FABRIC_A0; //base scom for A bus
+ master_group=0; // Design requires us to do this as per scom map and layout
+ slave_group=0;
+ rc=init.isChipMaster(master_target,master_interface,master_group,is_master);
+ if(rc.ok()){
+ if(!is_master)
+ {
FAPI_DBG("A Bus ..target swap performed");
-
+
rc=fir_workaround_pre_training(slave_target,slave_interface,
- slave_group,slave_target,
- slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,
- master_data_one_old,master_data_two_old);
-
+ slave_group,slave_target,
+ slave_interface,slave_group,
+ slave_data_one_old,slave_data_two_old,
+ master_data_one_old,master_data_two_old);
+
if(rc) return rc;
rc=init_w.run_training(slave_target,slave_interface,slave_group,master_target,master_interface,master_group);
-
+
if(!rc.ok()){
- return rc;
+ return rc;
}
-
+
// Now Set PLL to runtime setting and continue with training
// Call Janani's PLL ring set function from DCCAL module. It in turn uses Joe's funcs
-
+
rc=io_training_set_pll_post_wiretest(slave_target);
-
+
if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
- return rc;
+ FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
+ return rc;
}
rc=io_training_set_pll_post_wiretest(master_target);
if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
- return rc;
+ FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
+ return rc;
}
rc=init_de.run_training(slave_target,slave_interface,slave_group,master_target,master_interface,master_group);
if(rc) return rc;
-
+
// Now do RF
rc=init2.run_training(slave_target,slave_interface,slave_group,
- master_target,master_interface,master_group);
+ master_target,master_interface,master_group);
if(rc) return rc;
rc=fir_workaround_post_training(slave_target,
- slave_interface,
- slave_group,
- slave_target,
- slave_interface,
- slave_group,
- slave_data_one_old,
- slave_data_two_old,
- master_data_one_old,
- master_data_two_old);
+ slave_interface,
+ slave_group,
+ slave_target,
+ slave_interface,
+ slave_group,
+ slave_data_one_old,
+ slave_data_two_old,
+ master_data_one_old,
+ master_data_two_old);
if(rc) return rc;
- }
- else
- {
-
+ }
+ else
+ {
+
rc=fir_workaround_pre_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,master_data_one_old,master_data_two_old);
+ slave_data_one_old,slave_data_two_old,master_data_one_old,master_data_two_old);
if(rc) return rc;
rc=init_w.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
-
+
if(!rc.ok()){
- return rc;
+ return rc;
}
-
+
// Now Set PLL to runtime setting and continue with training
// Call Janani's PLL ring set function from DCCAL module. It in turn uses Joe's funcs
-
+
rc=io_training_set_pll_post_wiretest(slave_target);
-
+
if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
- return rc;
+ FAPI_DBG("PLL SETTING FAILED ON SLAVE SIDE ");
+ return rc;
}
rc=io_training_set_pll_post_wiretest(master_target);
if(!rc.ok()){
- FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
- return(rc);
+ FAPI_DBG("PLL SETTING FAILED ON MASTER SIDE ");
+ return(rc);
}
rc=init_de.run_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group);
if(rc) return rc;
-
+
// Now do RF
rc=init2.run_training(master_target,master_interface,master_group,
- slave_target,slave_interface,slave_group);
+ slave_target,slave_interface,slave_group);
if(rc) return rc;
rc=fir_workaround_post_training(master_target,master_interface,master_group,slave_target,slave_interface,slave_group,
- slave_data_one_old,slave_data_two_old,master_data_one_old,master_data_two_old);
+ slave_data_one_old,slave_data_two_old,master_data_one_old,master_data_two_old);
if(rc) return rc;
- }
- }
- }
- else{
- FAPI_ERR("Invalid io_run_training HWP invocation . Pair of targets dont belong to DMI/X/A instances");
- FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
- }
- return rc;
-}
+ }
+ }
+ }
+ else{
+ FAPI_ERR("Invalid io_run_training HWP invocation . Pair of targets dont belong to DMI/X/A instances");
+ const fapi::Target &MASTER_TARGET = master_target;
+ const fapi::Target &SLAVE_TARGET = slave_target;
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_TARGET_PAIR_RC);
+ }
+ return rc;
+ }
} // extern
diff --git a/src/usr/hwpf/hwp/bus_training/io_run_training.H b/src/usr/hwpf/hwp/bus_training/io_run_training.H
index a0581aada..95fcdf50a 100644
--- a/src/usr/hwpf/hwp/bus_training/io_run_training.H
+++ b/src/usr/hwpf/hwp/bus_training/io_run_training.H
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* COPYRIGHT International Business Machines Corp. 2012,2014 */
/* */
/* p1 */
/* */
@@ -20,35 +20,36 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: io_run_training.H,v 1.8 2012/12/04 08:29:20 varkeykv Exp $
-#ifndef IO_RUN_TRAINING_H_
-#define IO_RUN_TRAINING_H_
-
-#include <fapi.H>
-
-using namespace fapi;
-
-/**
- * io_run_training func pointer Typedef for hostboot
- *
- */
-typedef fapi::ReturnCode (*io_run_training_FP_t)(const fapi::Target &,const fapi::Target &);
-
-extern "C"
-{
-
-/**
- * io_run_training
- *
- * master_target is the master side of a bus ..p8.mcs in a DMI .. or a p8.abus/p8.xbus in fabric
- * slave_target - slave side of the bus .. Centaur in DMI , p8.xbus or p8.abus for fabric
- * while these are called master or slave... I actually do a check in the code to see
- * whether these are actually master chips by reading a GCR master_mode bit
- * and accordingly will perform a target swap if required
- * @return ReturnCode
- */
-fapi::ReturnCode io_run_training(const fapi::Target &master_target,const fapi::Target & slave_target);
-
-} // extern "C"
-
-#endif // IO_RUN_TRAINING_H
+// $Id: io_run_training.H,v 1.9 2014/03/05 11:56:29 varkeykv Exp $
+#ifndef IO_RUN_TRAINING_H_
+#define IO_RUN_TRAINING_H_
+
+
+#include <fapi.H>
+
+using namespace fapi;
+
+/**
+ * io_run_training func pointer Typedef for hostboot
+ *
+ */
+typedef fapi::ReturnCode (*io_run_training_FP_t)(const fapi::Target &,const fapi::Target &);
+
+extern "C"
+{
+
+/**
+ * io_run_training
+ *
+ * master_target is the master side of a bus ..p8.mcs in a DMI .. or a p8.abus/p8.xbus in fabric
+ * slave_target - slave side of the bus .. Centaur in DMI , p8.xbus or p8.abus for fabric
+ * while these are called master or slave... I actually do a check in the code to see
+ * whether these are actually master chips by reading a GCR master_mode bit
+ * and accordingly will perform a target swap if required
+ * @return ReturnCode
+ */
+fapi::ReturnCode io_run_training(const fapi::Target &master_target,const fapi::Target & slave_target);
+
+} // extern "C"
+
+#endif // IO_RUN_TRAINING_H
diff --git a/src/usr/hwpf/hwp/bus_training/io_run_training_errors.xml b/src/usr/hwpf/hwp/bus_training/io_run_training_errors.xml
new file mode 100644
index 000000000..469fa7359
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_run_training_errors.xml
@@ -0,0 +1,105 @@
+<!-- IBM_PROLOG_BEGIN_TAG -->
+<!-- This is an automatically generated prolog. -->
+<!-- -->
+<!-- $Source: src/usr/hwpf/hwp/bus_training/io_run_training_errors.xml $ -->
+<!-- -->
+<!-- IBM CONFIDENTIAL -->
+<!-- -->
+<!-- COPYRIGHT International Business Machines Corp. 2012,2014 -->
+<!-- -->
+<!-- p1 -->
+<!-- -->
+<!-- Object Code Only (OCO) source materials -->
+<!-- Licensed Internal Code Source Materials -->
+<!-- IBM HostBoot Licensed Internal Code -->
+<!-- -->
+<!-- The source code for this program is not published or otherwise -->
+<!-- divested of its trade secrets, irrespective of what has been -->
+<!-- deposited with the U.S. Copyright Office. -->
+<!-- -->
+<!-- Origin: 30 -->
+<!-- -->
+<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: io_run_training_errors.xml,v 1.8 2014/03/17 18:54:00 dedahle Exp $ -->
+<!-- Error definitions for IO_RUN_TRAINING -->
+<hwpErrors>
+ <hwpError>
+ <rc>IO_RUN_TRAINING_SET_PLL_INVALID_INVOCATION_RC</rc>
+ <description>io_training_set_pll_post_wiretest invoked with incorrect target type</description>
+ <ffdc>TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_RUN_TRAINING_POST_TRAINING_INVALID_INVOCATION_RC</rc>
+ <description>io_training_set_pll_post_wiretest invoked with incorrect target type</description>
+ <ffdc>TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_RUN_TRAINING_CHECK_DLL_VAL_OUT_OF_BOUND_RC</rc>
+ <description>DLL Workaround encountered unexpected start value</description>
+ <ffdc>DLL_REG</ffdc>
+ <callout>
+ <target>TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_RUN_TRAINING_CHECK_DLL_WORKAROUND_FAIL</rc>
+ <description>DLL Workaround failed to arrive at a solution</description>
+ <ffdc>DLL_REG</ffdc>
+ <callout>
+ <target>TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_RUN_TRAINING_FIR_MAX_SPARES_EXCEEDED_RC</rc>
+ <description>maximum spares possible to deploy exceeded</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>SPARE_ERROR_REG</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>CHIP_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>CHIP_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+ <rc>IO_RUN_TRAINING_INVALID_TARGET_PAIR_RC</rc>
+ <description>io_run_training invoked with wrong pair of targets</description>
+ <ffdc>MASTER_TARGET</ffdc>
+ <ffdc>SLAVE_TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+</hwpErrors>
diff --git a/src/usr/hwpf/hwp/bus_training/makefile b/src/usr/hwpf/hwp/bus_training/makefile
index 75af4954a..dcfc2552a 100644
--- a/src/usr/hwpf/hwp/bus_training/makefile
+++ b/src/usr/hwpf/hwp/bus_training/makefile
@@ -31,6 +31,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/fapi
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/plat
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/hwp
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup
+EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/bus_training
## pointer to common HWP files
EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
diff --git a/src/usr/hwpf/makefile b/src/usr/hwpf/makefile
index f393eee62..9acf90e55 100644
--- a/src/usr/hwpf/makefile
+++ b/src/usr/hwpf/makefile
@@ -32,7 +32,6 @@ SUBDIRS = fapi.d hwp.d plat.d test.d
#------------------------------------------------------------------------------
HWP_ERROR_XML_FILES = hwp/fapiHwpErrorInfo.xml \
hwp/dmi_training/proc_cen_framelock/proc_cen_framelock_errors.xml \
- hwp/bus_training/io_errors.xml \
hwp/dimm_errors.xml \
hwp/chip_accessors/chip_errors.xml \
hwp/dram_training/memory_errors.xml \
@@ -138,7 +137,16 @@ HWP_ERROR_XML_FILES = hwp/fapiHwpErrorInfo.xml \
hwp/runtime_errors/p8_pstate_registers.xml \
hwp/mc_config/mss_eff_mb_interleave/memory_mss_eff_mb_interleave.xml \
hwp/nest_chiplets/proc_a_x_pci_dmi_pll_registers.xml \
- hwp/dram_training/mss_lrdimm_funcs/memory_mss_lrdimm_funcs.xml
+ hwp/dram_training/mss_lrdimm_funcs/memory_mss_lrdimm_funcs.xml \
+ hwp/bus_training/gcr_funcs_errors.xml \
+ hwp/bus_training/io_run_training_errors.xml \
+ hwp/bus_training/io_funcs_errors.xml \
+ hwp/bus_training/io_dccal_errors.xml \
+ hwp/bus_training/io_power_down_lanes_errors.xml \
+ hwp/bus_training/io_read_erepair_errors.xml \
+ hwp/bus_training/io_fir_isolation_errors.xml \
+ hwp/bus_training/io_restore_erepair_errors.xml \
+ hwp/bus_training/io_cleanup_errors.xml
## these get generated into obj/genfiles/AttributeIds.H
HWP_ATTR_XML_FILES = hwp/memory_attributes.xml \
OpenPOWER on IntegriCloud