/*******************************************************************************
*                Copyright 2001, Marvell International Ltd.
* This code contains confidential information of Marvell semiconductor, inc.
* no rights are granted herein under any patent, mask work right or copyright
* of Marvell or any third party.
* Marvell reserves the right at its sole discretion to request that this code
* be immediately returned to Marvell. This code is provided "as is".
* Marvell makes no warranties, express, implied or otherwise, regarding its
* accuracy, completeness or performance.
********************************************************************************
* mvHwsDdr3TrainingIpEngine.c
*
* DESCRIPTION: DDR3 training IP Engine
*
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 80 $
******************************************************************************/

#include "mvDdr3TrainingIpEngine.h"
#include "mvDdrTrainingIpDb.h"
#include "mvDdr3TrainingIpBist.h"
#include "mvDdr3LoggingDef.h"

extern GT_U8  debugTrainingIp;

#define PATTERN_1 (0x55555555)
#define PATTERN_2 (0xAAAAAAAA)

#define VALIDATE_TRAINING_LIMIT(e1,e2) (((e2-e1+1)>33) && (e1<67))
GT_U32 phyRegBk[MAX_INTERFACE_NUM][MAX_BUS_NUM][BUS_WIDTH_IN_BITS];

#define PARAM_NOT_CARE   (0)

extern MV_HWS_TOPOLOGY_MAP *topologyMap;
extern GT_U32 effective_cs;

/************************** globals ***************************************/
GT_U32 trainingRes[MAX_INTERFACE_NUM * MAX_BUS_NUM * BUS_WIDTH_IN_BITS* MV_HWS_SearchDirLimit];

GT_U16 maskResultsDqRegMap[] =
{
    RESULT_CONTROL_PUP_0_BIT_0_REG, RESULT_CONTROL_PUP_0_BIT_1_REG, RESULT_CONTROL_PUP_0_BIT_2_REG, RESULT_CONTROL_PUP_0_BIT_3_REG,
    RESULT_CONTROL_PUP_0_BIT_4_REG, RESULT_CONTROL_PUP_0_BIT_5_REG, RESULT_CONTROL_PUP_0_BIT_6_REG, RESULT_CONTROL_PUP_0_BIT_7_REG,
    RESULT_CONTROL_PUP_1_BIT_0_REG, RESULT_CONTROL_PUP_1_BIT_1_REG, RESULT_CONTROL_PUP_1_BIT_2_REG, RESULT_CONTROL_PUP_1_BIT_3_REG,
    RESULT_CONTROL_PUP_1_BIT_4_REG, RESULT_CONTROL_PUP_1_BIT_5_REG, RESULT_CONTROL_PUP_1_BIT_6_REG, RESULT_CONTROL_PUP_1_BIT_7_REG,
    RESULT_CONTROL_PUP_2_BIT_0_REG, RESULT_CONTROL_PUP_2_BIT_1_REG, RESULT_CONTROL_PUP_2_BIT_2_REG, RESULT_CONTROL_PUP_2_BIT_3_REG,
    RESULT_CONTROL_PUP_2_BIT_4_REG, RESULT_CONTROL_PUP_2_BIT_5_REG, RESULT_CONTROL_PUP_2_BIT_6_REG, RESULT_CONTROL_PUP_2_BIT_7_REG,
    RESULT_CONTROL_PUP_3_BIT_0_REG, RESULT_CONTROL_PUP_3_BIT_1_REG, RESULT_CONTROL_PUP_3_BIT_2_REG, RESULT_CONTROL_PUP_3_BIT_3_REG,
    RESULT_CONTROL_PUP_3_BIT_4_REG, RESULT_CONTROL_PUP_3_BIT_5_REG, RESULT_CONTROL_PUP_3_BIT_6_REG, RESULT_CONTROL_PUP_3_BIT_7_REG,
    RESULT_CONTROL_PUP_4_BIT_0_REG, RESULT_CONTROL_PUP_4_BIT_1_REG, RESULT_CONTROL_PUP_4_BIT_2_REG, RESULT_CONTROL_PUP_4_BIT_3_REG,
    RESULT_CONTROL_PUP_4_BIT_4_REG, RESULT_CONTROL_PUP_4_BIT_5_REG, RESULT_CONTROL_PUP_4_BIT_6_REG, RESULT_CONTROL_PUP_4_BIT_7_REG,
};

GT_U16   maskResultsPupRegMap[] =
{
    RESULT_CONTROL_BYTE_PUP_0_REG, RESULT_CONTROL_BYTE_PUP_1_REG, RESULT_CONTROL_BYTE_PUP_2_REG, RESULT_CONTROL_BYTE_PUP_3_REG, RESULT_CONTROL_BYTE_PUP_4_REG
};

GT_U16 maskResultsDqRegMapPup3ECC[] =
{
    RESULT_CONTROL_PUP_0_BIT_0_REG, RESULT_CONTROL_PUP_0_BIT_1_REG, RESULT_CONTROL_PUP_0_BIT_2_REG, RESULT_CONTROL_PUP_0_BIT_3_REG,
    RESULT_CONTROL_PUP_0_BIT_4_REG, RESULT_CONTROL_PUP_0_BIT_5_REG, RESULT_CONTROL_PUP_0_BIT_6_REG, RESULT_CONTROL_PUP_0_BIT_7_REG,
    RESULT_CONTROL_PUP_1_BIT_0_REG, RESULT_CONTROL_PUP_1_BIT_1_REG, RESULT_CONTROL_PUP_1_BIT_2_REG, RESULT_CONTROL_PUP_1_BIT_3_REG,
    RESULT_CONTROL_PUP_1_BIT_4_REG, RESULT_CONTROL_PUP_1_BIT_5_REG, RESULT_CONTROL_PUP_1_BIT_6_REG, RESULT_CONTROL_PUP_1_BIT_7_REG,
    RESULT_CONTROL_PUP_2_BIT_0_REG, RESULT_CONTROL_PUP_2_BIT_1_REG, RESULT_CONTROL_PUP_2_BIT_2_REG, RESULT_CONTROL_PUP_2_BIT_3_REG,
    RESULT_CONTROL_PUP_2_BIT_4_REG, RESULT_CONTROL_PUP_2_BIT_5_REG, RESULT_CONTROL_PUP_2_BIT_6_REG, RESULT_CONTROL_PUP_2_BIT_7_REG,
    RESULT_CONTROL_PUP_4_BIT_0_REG, RESULT_CONTROL_PUP_4_BIT_1_REG, RESULT_CONTROL_PUP_4_BIT_2_REG, RESULT_CONTROL_PUP_4_BIT_3_REG,
    RESULT_CONTROL_PUP_4_BIT_4_REG, RESULT_CONTROL_PUP_4_BIT_5_REG, RESULT_CONTROL_PUP_4_BIT_6_REG, RESULT_CONTROL_PUP_4_BIT_7_REG,
    RESULT_CONTROL_PUP_3_BIT_0_REG, RESULT_CONTROL_PUP_3_BIT_1_REG, RESULT_CONTROL_PUP_3_BIT_2_REG, RESULT_CONTROL_PUP_3_BIT_3_REG,
    RESULT_CONTROL_PUP_3_BIT_4_REG, RESULT_CONTROL_PUP_3_BIT_5_REG, RESULT_CONTROL_PUP_3_BIT_6_REG, RESULT_CONTROL_PUP_3_BIT_7_REG,
};

GT_U16   maskResultsPupRegMapPup3ECC[] =
{
    RESULT_CONTROL_BYTE_PUP_0_REG, RESULT_CONTROL_BYTE_PUP_1_REG, RESULT_CONTROL_BYTE_PUP_2_REG, RESULT_CONTROL_BYTE_PUP_4_REG, RESULT_CONTROL_BYTE_PUP_4_REG
};

#ifdef CONFIG_DDR3
PatternInfo patternTable_16[] =
{
/* num tx phases  tx burst   delay between   rx pattern start_address   patternLen*/
   {0x1,	1,	2,  1, 0x0080,  2 },	/* PATTERN_PBS1*/
   {0x1,	1,	2,  1, 0x00C0,  2 },	/* PATTERN_PBS2*/
   {0x1,	1,	2,  1, 0x0380,  2 },	/* PATTERN_PBS3*/
   {0x1,	1,	2,  1, 0x0040,  2 },	/* PATTERN_TEST*/
   {0x1,	1,	2,  1, 0x0100,  2 },	/* PATTERN_RL*/
   {0x1,	1,	2,  1, 0x0000,  2 },	/* PATTERN_RL2*/
   {0xf,	7,  2,	7, 0x0140, 16  },	/* PATTERN_STATIC_PBS*/
   {0xf,	7,  2,	7, 0x0190, 16  },	/* PATTERN_KILLER_DQ0*/
   {0xf,  	7,  2,	7, 0x01D0, 16  },	/* PATTERN_KILLER_DQ1*/
   {0xf,  	7,  2,	7, 0x0210, 16  },	/* PATTERN_KILLER_DQ2*/
   {0xf,  	7,  2,	7, 0x0250, 16  },	/* PATTERN_KILLER_DQ3*/
   {0xf,  	7,  2,	7, 0x0290, 16  },	/* PATTERN_KILLER_DQ4*/
   {0xf,  	7,  2,	7, 0x02D0, 16  },	/* PATTERN_KILLER_DQ5*/
   {0xf,  	7,  2,	7, 0x0310, 16  },	/* PATTERN_KILLER_DQ6*/
   {0xf,  	7,  2,	7, 0x0350, 16  },	/* PATTERN_KILLER_DQ7*/
   {0xf,  	7,  2,	7, 0x04C0, 16  },	/* PATTERN_VREF*/
   {0xf,  	7,  2,	7, 0x03C0, 16  },	/* PATTERN_FULL_SSO_1T*/
   {0xf,  	7,  2,	7, 0x0400, 16  },	/* PATTERN_FULL_SSO_2T*/
   {0xf,  	7,  2,	7, 0x0440, 16  },	/* PATTERN_FULL_SSO_3T*/
   {0xf,  	7,  2,	7, 0x0480, 16  },	/* PATTERN_FULL_SSO_4T*/
   {0xf,  	7,  2,	7, 0x6280, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ0*/
   {0xf,  	7,  2,	7, 0x6680, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ1*/
   {0xf,  	7,  2,	7, 0x6A80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ2*/
   {0xf,  	7,  2,	7, 0x6E80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ3*/
   {0xf,  	7,  2,	7, 0x7280, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ4*/
   {0xf,  	7,  2,	7, 0x7680, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ5*/
   {0xf,  	7,  2,	7, 0x7A80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ6*/
   {0xf,  	7,  2,	7, 0x7E80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ7*/
   {0xf,  	7,  2,	7, 0x8280, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ0*/
   {0xf,  	7,  2,	7, 0x8680, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ1*/
   {0xf,  	7,  2,	7, 0x8A80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ2*/
   {0xf,  	7,  2,	7, 0x8E80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ3*/
   {0xf,  	7,  2,	7, 0x9280, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ4*/
   {0xf,  	7,  2,	7, 0x9680, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ5*/
   {0xf,  	7,  2,	7, 0x9A80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ6*/
   {0xf,  	7,  2,	7, 0x9E80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ7*/
   {0xf,  	7,  2,	7, 0xA280, 16  } /* PATTERN_ISI_XTALK_FREE*/
/*Note: actual start_address is <<3 of defined addess*/
};

PatternInfo patternTable_32[] =
{
/* num tx phases  tx burst   delay between   rx pattern start_address   patternLen*/
   {0x3,	0x3,  2,  0x3, 0x0080,  4 },	/* PATTERN_PBS1*/
   {0x3,	0x3,  2,  0x3, 0x00C0,  4 },	/* PATTERN_PBS2*/
   {0x3,	0x3,  2,  0x3, 0x0380,  4 },	/* PATTERN_PBS3*/
   {0x3,	0x3,  2,  0x3, 0x0040,  4 },	/* PATTERN_TEST*/
   {0x3,	0x3,  2,  0x3, 0x0100,  4 },	/* PATTERN_RL*/
   {0x3,	0x3,  2,  0x3, 0x0000,  4 },	/* PATTERN_RL2*/
   {0x1f,	0xF,  2,  0xf, 0x0140, 32  },	/* PATTERN_STATIC_PBS*/
   {0x1f,	0xF,  2,  0xf, 0x0190, 32  },	/* PATTERN_KILLER_DQ0*/
   {0x1f,  	0xF,  2,  0xf, 0x01D0, 32  },	/* PATTERN_KILLER_DQ1*/
   {0x1f,  	0xF,  2,  0xf, 0x0210, 32  },	/* PATTERN_KILLER_DQ2*/
   {0x1f,  	0xF,  2,  0xf, 0x0250, 32  },	/* PATTERN_KILLER_DQ3*/
   {0x1f,  	0xF,  2,  0xf, 0x0290, 32  },	/* PATTERN_KILLER_DQ4*/
   {0x1f,  	0xF,  2,  0xf, 0x02D0, 32  },	/* PATTERN_KILLER_DQ5*/
   {0x1f,  	0xF,  2,  0xf, 0x0310, 32  },	/* PATTERN_KILLER_DQ6*/
   {0x1f,  	0xF,  2,  0xf, 0x0350, 32  },	/* PATTERN_KILLER_DQ7*/
   {0x1f,  	0xF,  2,  0xf, 0x04C0, 32  },	/* PATTERN_VREF*/
   {0x1f,  	0xF,  2,  0xf, 0x03C0, 32  },	/* PATTERN_FULL_SSO_1T*/
   {0x1f,  	0xF,  2,  0xf, 0x0400, 32  },	/* PATTERN_FULL_SSO_2T*/
   {0x1f,  	0xF,  2,  0xf, 0x0440, 32  },	/* PATTERN_FULL_SSO_3T*/
   {0x1f,  	0xF,  2,  0xf, 0x0480, 32  },	/* PATTERN_FULL_SSO_4T*/
   {0x1f,  	0xF,  2,  0xf, 0x6280, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ0*/
   {0x1f,  	0xF,  2,  0xf, 0x6680, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ1*/
   {0x1f,  	0xF,  2,  0xf, 0x6A80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ2*/
   {0x1f,  	0xF,  2,  0xf, 0x6E80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ3*/
   {0x1f,  	0xF,  2,  0xf, 0x7280, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ4*/
   {0x1f,  	0xF,  2,  0xf, 0x7680, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ5*/
   {0x1f,  	0xF,  2,  0xf, 0x7A80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ6*/
   {0x1f,  	0xF,  2,  0xf, 0x7E80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ7*/
   {0x1f,  	0xF,  2,  0xf, 0x8280, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ0*/
   {0x1f,  	0xF,  2,  0xf, 0x8680, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ1*/
   {0x1f,  	0xF,  2,  0xf, 0x8A80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ2*/
   {0x1f,  	0xF,  2,  0xf, 0x8E80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ3*/
   {0x1f,  	0xF,  2,  0xf, 0x9280, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ4*/
   {0x1f,  	0xF,  2,  0xf, 0x9680, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ5*/
   {0x1f,  	0xF,  2,  0xf, 0x9A80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ6*/
   {0x1f,  	0xF,  2,  0xf, 0x9E80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ7*/
   {0x1f,  	0xF,  2,  0xf, 0xA280, 32  } /* PATTERN_ISI_XTALK_FREE*/


/*Note: actual start_address is <<3 of defined addess*/
};
#else
PatternInfo patternTable_16[] =
{
/* num tx phases  tx burst   delay between   rx pattern start_address   patternLen*/
   {0x1, 	0x1,	2,  0x1, 0x0000,  2  }, /* PATTERN_PBS1*/
   {0x1, 	0x1,	2,  0x1, 0x0080,  2  }, /* PATTERN_PBS2*/
   {0x1, 	0x1,	2,  0x1, 0x0100,  2  }, /* PATTERN_PBS3*/
   {0x1, 	0x1,	2,  0x1, 0x0180,  2  }, /* PATTERN_TEST*/
   {0x1, 	0x1,	2,  0x1, 0x0200,  2  }, /* PATTERN_RL*/
   {0x1, 	0x1,	2,  0x1, 0x0280,  2  }, /* PATTERN_RL2*/
   {0xf,  	0x7,    2,	0x7, 0x0680, 16  }, /* PATTERN_STATIC_PBS*/
   {0xf,  	0x7,    2,	0x7, 0x0A80, 16  }, /* PATTERN_KILLER_DQ0*/
   {0xf,  	0x7,    2,	0x7, 0x0E80, 16  }, /* PATTERN_KILLER_DQ1*/
   {0xf,  	0x7,    2,	0x7, 0x1280, 16  }, /* PATTERN_KILLER_DQ2*/
   {0xf,  	0x7,    2,	0x7, 0x1680, 16  }, /* PATTERN_KILLER_DQ3*/
   {0xf,  	0x7,    2,	0x7, 0x1A80, 16  }, /* PATTERN_KILLER_DQ4*/
   {0xf,  	0x7,    2,	0x7, 0x1E80, 16  }, /* PATTERN_KILLER_DQ5*/
   {0xf,  	0x7,    2,	0x7, 0x2280, 16  }, /* PATTERN_KILLER_DQ6*/
   {0xf,  	0x7,    2,	0x7, 0x2680, 16  }, /* PATTERN_KILLER_DQ7*/
   {0xf,  	0x7,    2,	0x7, 0x2A80, 16  }, /* PATTERN_KILLER_DQ0_INV*/
   {0xf,  	0x7,    2,	0x7, 0x2E80, 16  }, /* PATTERN_KILLER_DQ1_INV*/
   {0xf,  	0x7,    2,	0x7, 0x3280, 16  }, /* PATTERN_KILLER_DQ2_INV*/
   {0xf,  	0x7,    2,	0x7, 0x3680, 16  }, /* PATTERN_KILLER_DQ3_INV*/
   {0xf,  	0x7,    2,	0x7, 0x3A80, 16  }, /* PATTERN_KILLER_DQ4_INV*/
   {0xf,  	0x7,    2,	0x7, 0x3E80, 16  }, /* PATTERN_KILLER_DQ5_INV*/
   {0xf,  	0x7,    2,	0x7, 0x4280, 16  }, /* PATTERN_KILLER_DQ6_INV*/
   {0xf,  	0x7,    2,	0x7, 0x4680, 16  }, /* PATTERN_KILLER_DQ7_INV*/
   {0xf,  	0x7,    2,	0x7, 0x4A80, 16  }, /* PATTERN_VREF*/
   {0xf,  	0x7,    2,	0x7, 0x4E80, 16  }, /* PATTERN_VREF_INV*/
   {0xf,  	0x7,    2,	0x7, 0x5280, 16  }, /* PATTERN_FULL_SSO_0T*/
   {0xf,  	0x7,    2,	0x7, 0x5680, 16  }, /* PATTERN_FULL_SSO_1T*/
   {0xf,  	0x7,    2,	0x7, 0x5A80, 16  }, /* PATTERN_FULL_SSO_2T*/
   {0xf,  	0x7,    2,	0x7, 0x5E80, 16  }, /* PATTERN_FULL_SSO_3T*/
   {0xf,  	0x7,    2,	0x7, 0x6280, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ0*/
   {0xf,  	0x7,    2,	0x7, 0x6680, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ1*/
   {0xf,  	0x7,    2,	0x7, 0x6A80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ2*/
   {0xf,  	0x7,    2,	0x7, 0x6E80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ3*/
   {0xf,  	0x7,    2,	0x7, 0x7280, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ4*/
   {0xf,  	0x7,    2,	0x7, 0x7680, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ5*/
   {0xf,  	0x7,    2,	0x7, 0x7A80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ6*/
   {0xf,  	0x7,    2,	0x7, 0x7E80, 16  }, /* PATTERN_SSO_FULL_XTALK_DQ7*/
   {0xf,  	0x7,    2,	0x7, 0x8280, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ0*/
   {0xf,  	0x7,    2,	0x7, 0x8680, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ1*/
   {0xf,  	0x7,    2,	0x7, 0x8A80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ2*/
   {0xf,  	0x7,    2,	0x7, 0x8E80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ3*/
   {0xf,  	0x7,    2,	0x7, 0x9280, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ4*/
   {0xf,  	0x7,    2,	0x7, 0x9680, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ5*/
   {0xf,  	0x7,    2,	0x7, 0x9A80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ6*/
   {0xf,  	0x7,    2,	0x7, 0x9E80, 16  }, /* PATTERN_SSO_XTALK_FREE_DQ7*/
   {0xf,  	0x7,    2,	0x7, 0xA280, 16  }, /* PATTERN_ISI_XTALK_FREE*/
   {0xf,  	0x7,    2,	0x7, 0xA680, 16  }, /* PATTERN_RESONANCE_1T*/
   {0xf,  	0x7,    2,	0x7, 0xAA80, 16  }, /* PATTERN_RESONANCE_2T*/
   {0xf,  	0x7,    2,	0x7, 0xAE80, 16  }, /* PATTERN_RESONANCE_3T*/
   {0xf,  	0x7,    2,	0x7, 0xB280, 16  }, /* PATTERN_RESONANCE_4T*/
   {0xf,  	0x7,    2,	0x7, 0xB680, 16  }, /* PATTERN_RESONANCE_5T*/
   {0xf,  	0x7,    2,	0x7, 0xBA80, 16  }, /* PATTERN_RESONANCE_6T*/
   {0xf,  	0x7,    2,	0x7, 0xBE80, 16  }, /* PATTERN_RESONANCE_7T*/
   {0xf,  	0x7,    2,	0x7, 0xC280, 16  }, /* PATTERN_RESONANCE_8T*/
   {0xf,  	0x7,    2,	0x7, 0xC680, 16  }  /* PATTERN_RESONANCE_9T*/
/*Note: actual start_address is <<3 of defined addess*/
};

PatternInfo patternTable_32[] =
{
/* num tx phases  tx burst   delay between   rx pattern start_address   patternLen*/
   {0x3, 	0x3,	2,  0x3, 0x0000,  4  }, /* PATTERN_PBS1*/
   {0x3, 	0x3,	2,  0x3, 0x0080,  4  }, /* PATTERN_PBS2*/
   {0x3, 	0x3,	2,  0x3, 0x0100,  4  }, /* PATTERN_PBS3*/
   {0x3, 	0x3,	2,  0x3, 0x0180,  4  }, /* PATTERN_TEST*/
   {0x3, 	0x3,	2,  0x3, 0x0200,  4  }, /* PATTERN_RL*/
   {0x3, 	0x3,	2,  0x3, 0x0280,  4  }, /* PATTERN_RL2*/
   {0x1f,  	0xf,    2,	0xf, 0x0680, 32  }, /* PATTERN_STATIC_PBS*/
   {0x1f,  	0xf,    2,	0xf, 0x0A80, 32  }, /* PATTERN_KILLER_DQ0*/
   {0x1f,  	0xf,    2,	0xf, 0x0E80, 32  }, /* PATTERN_KILLER_DQ1*/
   {0x1f,  	0xf,    2,	0xf, 0x1280, 32  }, /* PATTERN_KILLER_DQ2*/
   {0x1f,  	0xf,    2,	0xf, 0x1680, 32  }, /* PATTERN_KILLER_DQ3*/
   {0x1f,  	0xf,    2,	0xf, 0x1A80, 32  }, /* PATTERN_KILLER_DQ4*/
   {0x1f,  	0xf,    2,	0xf, 0x1E80, 32  }, /* PATTERN_KILLER_DQ5*/
   {0x1f,  	0xf,    2,	0xf, 0x2280, 32  }, /* PATTERN_KILLER_DQ6*/
   {0x1f,  	0xf,    2,	0xf, 0x2680, 32  }, /* PATTERN_KILLER_DQ7*/
   {0x1f,  	0xf,    2,	0xf, 0x2A80, 32  }, /* PATTERN_KILLER_DQ0_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x2E80, 32  }, /* PATTERN_KILLER_DQ1_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x3280, 32  }, /* PATTERN_KILLER_DQ2_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x3680, 32  }, /* PATTERN_KILLER_DQ3_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x3A80, 32  }, /* PATTERN_KILLER_DQ4_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x3E80, 32  }, /* PATTERN_KILLER_DQ5_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x4280, 32  }, /* PATTERN_KILLER_DQ6_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x4680, 32  }, /* PATTERN_KILLER_DQ7_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x4A80, 32  }, /* PATTERN_VREF*/
   {0x1f,  	0xf,    2,	0xf, 0x4E80, 32  }, /* PATTERN_VREF_INV*/
   {0x1f,  	0xf,    2,	0xf, 0x5280, 32  }, /* PATTERN_FULL_SSO_0T*/
   {0x1f,  	0xf,    2,	0xf, 0x5680, 32  }, /* PATTERN_FULL_SSO_1T*/
   {0x1f,  	0xf,    2,	0xf, 0x5A80, 32  }, /* PATTERN_FULL_SSO_2T*/
   {0x1f,  	0xf,    2,	0xf, 0x5E80, 32  }, /* PATTERN_FULL_SSO_3T*/
   {0x1f,  	0xf,    2,	0xf, 0x6280, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ0*/
   {0x1f,  	0xf,    2,	0xf, 0x6680, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ1*/
   {0x1f,  	0xf,    2,	0xf, 0x6A80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ2*/
   {0x1f,  	0xf,    2,	0xf, 0x6E80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ3*/
   {0x1f,  	0xf,    2,	0xf, 0x7280, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ4*/
   {0x1f,  	0xf,    2,	0xf, 0x7680, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ5*/
   {0x1f,  	0xf,    2,	0xf, 0x7A80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ6*/
   {0x1f,  	0xf,    2,	0xf, 0x7E80, 32  }, /* PATTERN_SSO_FULL_XTALK_DQ7*/
   {0x1f,  	0xf,    2,	0xf, 0x8280, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ0*/
   {0x1f,  	0xf,    2,	0xf, 0x8680, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ1*/
   {0x1f,  	0xf,    2,	0xf, 0x8A80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ2*/
   {0x1f,  	0xf,    2,	0xf, 0x8E80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ3*/
   {0x1f,  	0xf,    2,	0xf, 0x9280, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ4*/
   {0x1f,  	0xf,    2,	0xf, 0x9680, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ5*/
   {0x1f,  	0xf,    2,	0xf, 0x9A80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ6*/
   {0x1f,  	0xf,    2,	0xf, 0x9E80, 32  }, /* PATTERN_SSO_XTALK_FREE_DQ7*/
   {0x1f,  	0xf,    2,	0xf, 0xA280, 32  }, /* PATTERN_ISI_XTALK_FREE*/
   {0x1f,  	0xf,    2,	0xf, 0xA680, 32  }, /* PATTERN_RESONANCE_1T*/
   {0x1f,  	0xf,    2,	0xf, 0xAA80, 32  }, /* PATTERN_RESONANCE_2T*/
   {0x1f,  	0xf,    2,	0xf, 0xAE80, 32  }, /* PATTERN_RESONANCE_3T*/
   {0x1f,  	0xf,    2,	0xf, 0xB280, 32  }, /* PATTERN_RESONANCE_4T*/
   {0x1f,  	0xf,    2,	0xf, 0xB680, 32  }, /* PATTERN_RESONANCE_5T*/
   {0x1f,  	0xf,    2,	0xf, 0xBA80, 32  }, /* PATTERN_RESONANCE_6T*/
   {0x1f,  	0xf,    2,	0xf, 0xBE80, 32  }, /* PATTERN_RESONANCE_7T*/
   {0x1f,  	0xf,    2,	0xf, 0xC280, 32  }, /* PATTERN_RESONANCE_8T*/
   {0x1f,  	0xf,    2,	0xf, 0xC680, 32  }  /* PATTERN_RESONANCE_9T*/
/*Note: actual start_address is <<3 of defined addess*/
};

#endif

/*******************************************************************************/
GT_U32                      trainDevNum;
MV_HWS_DDR_CS               traintrainCsType;
GT_U32                      trainPupNum;
MV_HWS_TRAINING_RESULT      trainResultType;
MV_HWS_ControlElement       trainControlElement;
MV_HWS_SearchDirection      traineSearchDir;
MV_HWS_DIRECTION            trainDirection;
GT_U32                      trainIfSelect;
GT_U32                      trainInitValue;
GT_U32                      trainNumberIterations;
MV_HWS_PATTERN              trainPattern;
MV_HWS_EdgeCompare          trainEdgeCompare;
GT_U32                      trainCsNum;
GT_U32                      trainIfAcess, trainIfId, trainPupAccess;
#ifdef CONFIG_DDR4
GT_U32                      maxPollingForDone = 100000000;  /* this counter was increased for DDR4
                                                               due to A390 DB-GP DDR4 failure */
#else /* DDR3 */
#ifdef CONFIG_BOBK
GT_U32                      maxPollingForDone = 1000;
#else
GT_U32                      maxPollingForDone = 1000000;
#endif /* CONFIG_BOBK */
#endif /* CONFIG_DDR4 */
extern MV_HWS_RESULT trainingResult[MAX_STAGE_LIMIT][MAX_INTERFACE_NUM];
extern AUTO_TUNE_STAGE trainingStage;



/******************************************************************************/

GT_U32* ddr3TipGetBufPtr
(
    GT_U32                 devNum,
    MV_HWS_SearchDirection search,
    MV_HWS_TRAINING_RESULT resultType,
    GT_U32                 interfaceNum
)
{
    GT_U32 *bufPtr = NULL;

	/* avoid warnings */
	devNum = devNum;
	resultType = resultType;

    bufPtr = &trainingRes[MAX_INTERFACE_NUM * MAX_BUS_NUM * BUS_WIDTH_IN_BITS* search +
                               interfaceNum *MAX_BUS_NUM * BUS_WIDTH_IN_BITS];
    return bufPtr;
}

/*****************************************************************************
IP Training search
Note: for one edge search only from fail to pass, else jitter can be be entered into solution.
******************************************************************************/
GT_STATUS    ddr3TipIpTraining
(
    GT_U32                      devNum,
    MV_HWS_ACCESS_TYPE          accessType,
    GT_U32                      interfaceNum, 
    MV_HWS_ACCESS_TYPE          pupAccessType,
    GT_U32                      pupNum, 
    MV_HWS_TRAINING_RESULT      resultType,
    MV_HWS_ControlElement       controlElement,
    MV_HWS_SearchDirection      searchDir,
    MV_HWS_DIRECTION            direction,
    GT_U32                      interfaceMask, 
    GT_U32                      initValue,
    GT_U32                      numIter,
    MV_HWS_PATTERN              pattern,
    MV_HWS_EdgeCompare          edgeComp,
    MV_HWS_DDR_CS               csType,
    GT_U32                      csNum,
    MV_HWS_TrainingIpStatus*    trainStatus
)
{
    
    GT_U32 maskDqNumOfRegs, maskPupNumOfRegs, indexCnt,pollCnt, regData, pupId, triggerRegAddr;
    GT_U32 txBurstSize;
    GT_U32 delayBetweenBurst;
    GT_U32 rdMode;
    GT_U32 readData[MAX_INTERFACE_NUM];
	PatternInfo *patternTable = ddr3TipGetPatternTable();
	GT_U16 *maskResultsPupRegMap = ddr3TipGetMaskResultsPupRegMap();
	GT_U16 *maskResultsDqRegMap 	= ddr3TipGetMaskResultsDqReg();
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    if (pupNum >= octetsPerInterfaceNum)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("pupNum %d not valid\n",pupNum));
    }
    if (interfaceNum >= MAX_INTERFACE_NUM)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("interfaceId %d not valid\n",interfaceNum));
    }
    if (trainStatus == NULL)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("error param 4\n"));
        return GT_BAD_PARAM;
    }

    /* load pattern */
    if (csType == CS_SINGLE)  
    {
        /* All CS\92s to CS0     */
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, CS_ENABLE_REG, 1<<3, 1<<3));
        /* All CS\92s to CS0     */
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_DATA_CONTROL_REG, (0x3 | (effective_cs<<26)) , 0xC000003));
     }
    else
    {
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, CS_ENABLE_REG, 0, 1<<3));
        /*  CS select*/
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_DATA_CONTROL_REG, 0x3 | csNum<<26, 0x3 | 3<<26));
    }
    /* LOAD PATTERN TO ODPG */
    /* load pattern to ODPG */

    ddr3TipLoadPatternToOdpg(devNum, accessType, interfaceNum, pattern, patternTable[pattern].startAddr);
    txBurstSize = (direction == OPER_WRITE) ? patternTable[pattern].txBurstSize : 0;
    delayBetweenBurst = (direction == OPER_WRITE) ? 2 : 0;
    rdMode = (direction == OPER_WRITE) ? 1 : 0;
    CHECK_STATUS(ddr3TipConfigureOdpg(devNum, accessType, interfaceNum, direction, patternTable[pattern].numOfPhasesTx,
                                        txBurstSize, patternTable[pattern].numOfPhasesRx, delayBetweenBurst, 
                                        rdMode,  effective_cs, STRESS_NONE, DURATION_SINGLE));
    regData = (direction == OPER_READ) ?   0  : (0x3<<30) ;
    regData |= (direction == OPER_READ) ?  0x60  : 0xFA ;
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_WRITE_READ_MODE_ENABLE_REG, regData, MASK_ALL_BITS));
    regData = (edgeComp == EDGE_PF || edgeComp == EDGE_FP) ? 0 : 1<<6;
    regData |= (edgeComp == EDGE_PF || edgeComp == EDGE_PFP) ? (1<<7) : 0;
    /* change from Pass to Fail will lock the result*/
#if 0
    if (csType == CS_SINGLE)  
    {
        /* Write2Dunit(0x1034, 0xe , [17:14]) */ /* All PUPs selected */
        regData |= 0xe<<14;
    }
    else
    {
        /* Write2Dunit(0x1034, PUP# , [17:14]) */  /* PUP select */
       regData |= pupNum<<14;
    }
#else
    if (pupAccessType == ACCESS_TYPE_MULTICAST)
    {
        regData |= 0xe<<14;
    }
    else
    {
        regData |= pupNum<<14;
    }
#endif

    if (edgeComp == EDGE_FP)
    {
        regData |= (0<<20); /* don't search for readl edge change, only the state */
    }
    else if (edgeComp == EDGE_FPF)
    {
        regData |= (0<<20);
    }
    else
    {
        regData |= (3<<20);
    }

/*    regData |= (0x7<<8);
    if (edgeComp == EDGE_FP)
        regData |= (0x7<<11);
        */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_TRAINING_CONTROL_REG, regData | (0x7<<8) | (0x7<<11), (0x3 | (0x3<<2) | (0x3<<6) | (1<<5) | (0x7<<8) | (0x7<<11) | (0xf<<14) | (0x3<<18) | (3<<20))));
    regData = (searchDir == MV_HWS_Low2High) ? 0 : (1 << 8);
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_OBJ1_OPCODE_REG, 1 | regData | initValue<<9 |  (1<<25) | (1<<26), 0xFF | (1<<8) | (0xFFFF<<9) |  (1<<25) | (1<<26)));
    /*Write2Dunit(0x10B4, NumberIteration , [15:0])   Max number of iterations */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, ODPG_OBJ1_ITER_CNT_REG, numIter, 0xFFFF));
    if (controlElement == MV_HWS_ControlElement_DQ_SKEW && direction == OPER_READ)
    {
        /*Write2Dunit(0x10C0, 0x5F , [7:0])   MC PBS Reg Address at DDR PHY*/
        regData = 0x5f + effective_cs * CALIBRATED_OBJECTS_REG_ADDR_OFFSET;
    }
    else if (controlElement == MV_HWS_ControlElement_DQ_SKEW && direction == OPER_WRITE)
    {
       regData = 0x1f + effective_cs * CALIBRATED_OBJECTS_REG_ADDR_OFFSET;
    }
    else if (controlElement == MV_HWS_ControlElement_ADLL && direction == OPER_WRITE)
    {
		/*LOOP         0x00000001 + 4*n: where n (0-3) represents M_CS number */
		/*Write2Dunit(0x10C0, 0x1 , [7:0])    ADLL WR Reg Address at DDR PHY*/
		regData = 1 + effective_cs * CS_REGISTER_ADDR_OFFSET;
    }
    else if (controlElement == MV_HWS_ControlElement_ADLL && direction == OPER_READ)
    {
        /* ADLL RD Reg Address at DDR PHY*/
        regData = 3 + effective_cs * CS_REGISTER_ADDR_OFFSET;
    }
    else if (controlElement == MV_HWS_ControlElement_DQS_SKEW && direction == OPER_WRITE)
    {
        /*TBD not defined in 0.5.0 requirement  */
    }
    else if (controlElement == MV_HWS_ControlElement_DQS_SKEW && direction == OPER_READ)
    {
        /*TBD not defined in 0.5.0 requirement */
    }
    regData |= (0x6 << 28);
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, CALIB_OBJ_PRFA_REG, regData | (initValue << 8) , 0xff | (0xFFFF << 8)| (0xF << 24) | (GT_U32)(0xF << 28)));

	maskDqNumOfRegs = octetsPerInterfaceNum * BUS_WIDTH_IN_BITS;
	maskPupNumOfRegs = octetsPerInterfaceNum;

    if (resultType == RESULT_PER_BIT)
    {
        for(indexCnt=0; indexCnt<maskDqNumOfRegs;indexCnt++)
        {
            CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, maskResultsDqRegMap[indexCnt], 0, 1<<24));
        }

		/*Mask disabled buses*/
        for(pupId = 0; pupId < octetsPerInterfaceNum ; pupId++)
        {
			if (IS_BUS_ACTIVE(topologyMap->activeBusMask, pupId) == GT_TRUE) continue;

		    for(indexCnt=pupId*8; indexCnt<(pupId+1)*8;indexCnt++)
		    {
		        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, maskResultsDqRegMap[indexCnt], (1<<24), 1<<24));
		    }
		}

        for(indexCnt=0; indexCnt<maskPupNumOfRegs;indexCnt++)
        {
            CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, maskResultsPupRegMap[indexCnt], (1<<24) , 1<<24));
        }
    }
    else if (resultType == RESULT_PER_BYTE)
    {
        /* write to adll */
        for(indexCnt=0; indexCnt<maskPupNumOfRegs;indexCnt++)
        {
            CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, maskResultsPupRegMap[indexCnt], 0, 1<<24));
        }
        for(indexCnt=0; indexCnt<maskDqNumOfRegs;indexCnt++)
        {
            CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, maskResultsDqRegMap[indexCnt],(1 << 24), (1<<24)));
        }
    }

    /*Start Training Trigger */
	triggerRegAddr = (ddr3TipDevAttrGet(devNum, MV_ATTR_TIP_REV) >= MV_TIP_REV_3)?(ODPG_TRAINING_TRIGGER_REG):(ODPG_TRAINING_STATUS_REG);
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceNum, triggerRegAddr, 1, 1));

    /*wait for all RFU tests to finish (or timeout)*/
	/*WA for 16 bit mode, more investigation needed*/
    hwsOsExactDelayPtr((GT_U8)devNum, devNum, 1); /* 1 mSec */

    /* Training "Done ?"  for CPU contolled TIP*/
    if(ddr3TipDevAttrGet(devNum, MV_ATTR_TIP_REV) >= MV_TIP_REV_3)
    {
		for(indexCnt=0; indexCnt < MAX_INTERFACE_NUM;indexCnt++)
		{
		    if (IS_INTERFACE_ACTIVE(topologyMap->interfaceActiveMask, indexCnt) ==  0)
		    {
		        continue;
		    }
		    if (interfaceMask & (1<<indexCnt))
		    {
		        /*need to check results for this Dunit */
		        for(pollCnt=0;pollCnt < maxPollingForDone;pollCnt++)
		        {
		            CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, indexCnt, ODPG_TRAINING_STATUS_REG, &regData, MASK_ALL_BITS));
		             if ((regData & 0x2) != 0)
		            {
		                /*done */
						trainStatus[indexCnt] = MV_HWS_TrainingIpStatus_SUCCESS;
		                break;
		            }
		        }
#ifdef CONFIG_BOBK
                 /* WA to avoid training stucking */
                hwsOsExactDelayPtr((GT_U8)devNum, devNum, 50); /* 50 mSec */
#endif
		        if (pollCnt == maxPollingForDone)
		        {
		            trainStatus[indexCnt] = MV_HWS_TrainingIpStatus_TIMEOUT;
		        }
		    }
			/*Be sure that ODPG done*/
		    CHECK_STATUS(isOdpgAccessDone(devNum, indexCnt));
		}

		/*Write ODPG done in Dunit*/
		CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_STATUS_DONE_REG, 0, 0x1));
	}

    /*wait for all Dunit tests to finish (or timeout)*/
    /* Training "Done ?" */
    /* Training "Pass ?" */
    for(indexCnt=0; indexCnt < MAX_INTERFACE_NUM;indexCnt++)
    {
        if (IS_INTERFACE_ACTIVE(topologyMap->interfaceActiveMask, indexCnt) ==  0)
        {
            continue;
        }
        if (interfaceMask & (1<<indexCnt))
        {
            /*need to check results for this Dunit */
            for(pollCnt=0;pollCnt < maxPollingForDone;pollCnt++)
            {
                CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, indexCnt, triggerRegAddr, readData, MASK_ALL_BITS));
                regData = readData[indexCnt];
                 if ((regData & 0x2) != 0)
                {
                    /*done*/
                    if ((regData & 0x4) == 0)
                    {
                        trainStatus[indexCnt] = MV_HWS_TrainingIpStatus_SUCCESS;
                    }
                    else
                    {
						trainStatus[indexCnt] = MV_HWS_TrainingIpStatus_FAIL;
                    }
                    break;
                }
            }
#ifdef CONFIG_BOBK
            /* WA to avoid training stucking */
             hwsOsExactDelayPtr((GT_U8)devNum, devNum, 50);
#endif
            if (pollCnt == maxPollingForDone)
            {
                trainStatus[indexCnt] = MV_HWS_TrainingIpStatus_TIMEOUT;
            }
        }
    }

    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG, 0, MASK_ALL_BITS));

    return GT_OK;
}




/*****************************************************************************
Load expected Pattern to ODPG
******************************************************************************/
GT_STATUS    ddr3TipLoadPatternToOdpg
(
    GT_U32              devNum,
    MV_HWS_ACCESS_TYPE  accessType,
    GT_U32              interfaceId,
    MV_HWS_PATTERN      pattern,
    GT_U32              loadAddr
)
{
    GT_U32 patternLengthCnt = 0;
	PatternInfo *patternTable = ddr3TipGetPatternTable();

    for(patternLengthCnt = 0; patternLengthCnt < patternTable[pattern].patternLen ; patternLengthCnt++)
    {
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceId, ODPG_PATTERN_DATA_LOW_REG,
				patternTableGetWord(devNum, pattern, (GT_U8)(patternLengthCnt*2)), MASK_ALL_BITS));
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceId, ODPG_PATTERN_DATA_HI_REG,
				patternTableGetWord(devNum, pattern, (GT_U8)(patternLengthCnt*2 + 1)), MASK_ALL_BITS));
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceId, ODPG_PATTERN_ADDR_REG, patternLengthCnt, MASK_ALL_BITS));
    }

    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, accessType, interfaceId,  ODPG_PATTERN_ADDR_OFFSET_REG,  loadAddr, MASK_ALL_BITS));

    return GT_OK;
}

/*****************************************************************************
Configure ODPG
******************************************************************************/
GT_STATUS    ddr3TipConfigureOdpg
(   
    GT_U32                 devNum,
    MV_HWS_ACCESS_TYPE     accessType,
    GT_U32                 interfaceId,
    MV_HWS_DIRECTION       direction,
    GT_U32                 txPhases,
    GT_U32                 txBurstSize,
    GT_U32                 rxPhases,
    GT_U32                 delayBetweenBurst,
    GT_U32                 rdMode,
    GT_U32                 csNum,
    GT_U32                 addrStressJump,
    GT_U32                 singlePattern
)
{
   GT_U32 dataValue = 0;
   GT_STATUS retVal;

   direction = direction; /* avoid warnings */

   dataValue = ((singlePattern << 2) | (txPhases << 5) | (txBurstSize << 11) | (delayBetweenBurst << 15) | (rxPhases << 21) | (rdMode << 25)  | (csNum << 26) | (addrStressJump << 29));
   retVal = mvHwsDdr3TipIFWrite(devNum,  accessType, interfaceId,  ODPG_DATA_CONTROL_REG,  dataValue, 0xAFFFFFFC);
   if (retVal != GT_OK)
   {
      return retVal;
   }
   return GT_OK;
}


void    ddr3TipDDR3IpTrainingStart
(
)
{
    MV_HWS_TrainingIpStatus    sTrainIpStatus[MAX_INTERFACE_NUM];
    ddr3TipIpTraining(
    trainDevNum,
    trainIfAcess,
    trainIfId,
    trainPupAccess,
    trainPupNum, 
    trainResultType,
    trainControlElement,
    traineSearchDir,
    trainDirection,
    trainIfSelect, 
    trainInitValue,
    trainNumberIterations,
    trainPattern,
    trainEdgeCompare,
    traintrainCsType,
    trainCsNum,
    sTrainIpStatus);
}

GT_STATUS ddr3TipProcessResult(GT_U32 *arResult, MV_HWS_Edge eEdge, MV_HWS_EdgeSearch eEdgeSearch, GT_U32 *edgeResult)
{
    GT_U32 i, ResVal;
	GT_32 tapVal, maxVal = -10000, minVal = 10000;
    GT_BOOL lockSuccess = GT_TRUE;

    for(i=0; i < BUS_WIDTH_IN_BITS; i++)
    {
        ResVal = GET_LOCK_RESULT(arResult[i]);
        if (ResVal == 0)
        {
            lockSuccess = GT_FALSE;
            break;
        }
        {
            DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("lock failed for bit %d\n",i));
        }
    }
    if (lockSuccess == GT_TRUE)
    {
        for(i=0; i < BUS_WIDTH_IN_BITS; i++)
        {
            tapVal = GET_TAP_RESULT(arResult[i], eEdge);
            if (tapVal > maxVal)
                maxVal = tapVal;
            if (tapVal < minVal)
                minVal = tapVal;
            if (eEdgeSearch == TRAINING_EDGE_MAX)
                *edgeResult = (GT_U32)maxVal;
            else
                *edgeResult = (GT_U32)minVal;
            DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("i %d arResult[i] 0x%x tapVal %d maxVal %d minVal %d EdgeResult %d\n", i, arResult[i], tapVal, maxVal, minVal, *edgeResult));
        }
    }
    else
    {
        return GT_FAIL;
    }
    return GT_OK;
}

/*****************************************************************************
Read training search result
******************************************************************************/
GT_STATUS    ddr3TipReadTrainingResult
(
    GT_U32                          devNum,
    GT_U32                          interfaceId, 
    MV_HWS_ACCESS_TYPE              pupAccessType,
    GT_U32                          pupNum,
    GT_U32                          bitNum,
    MV_HWS_SearchDirection          search,
    MV_HWS_DIRECTION                direction,
    MV_HWS_TRAINING_RESULT          resultType,
    MV_HWS_TrainingLoadOperation    operation,
    GT_U32                          csNumType,
    GT_U32                          **loadRes,
    GT_BOOL                         isReadFromDB,
    GT_U8                         	consTap,
    GT_BOOL                         isCheckResultValidity
)
{
    GT_U32 regOffset,  pupCnt, startPup, endPup, startReg, endReg;    
    GT_U32  *interfaceTrainRes = NULL;
    GT_U16  *regAddr = NULL;
    GT_U32 readData[MAX_INTERFACE_NUM];
	GT_U16 *maskResultsPupRegMap = ddr3TipGetMaskResultsPupRegMap();
	GT_U16 *maskResultsDqRegMap 	= ddr3TipGetMaskResultsDqReg();
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    /* Agreed assumption: all CS mask contain same number of bits, i.e. in multi CS, the number of CS per memory is the same for all pups */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST,  interfaceId, CS_ENABLE_REG, (csNumType == 0) ? 1<<3 : 0, (1 << 3)));
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST,  interfaceId,  ODPG_DATA_CONTROL_REG, (csNumType << 26), (3 << 26)));
    DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("ReadFromDB %d csType %d oper %d resultType %d direction %d search %d pupNum %d interfaceId %d pupAccessType %d\n",isReadFromDB, csNumType , operation , resultType , direction , search , pupNum , interfaceId,pupAccessType));
    if ((loadRes == NULL) && (isReadFromDB == GT_TRUE))
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("ddr3TipReadTrainingResult loadRes = NULL"));
        return GT_FAIL;
    }
    if (pupNum >= octetsPerInterfaceNum)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("pupNum %d not valid\n",pupNum));
    }
    if (interfaceId >= MAX_INTERFACE_NUM)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("interfaceId %d not valid\n",interfaceId));
    }
    if (resultType == RESULT_PER_BIT)
    {
        regAddr = maskResultsDqRegMap;
    }
    else 
    {
        regAddr = maskResultsPupRegMap;
    }
    if (pupAccessType == ACCESS_TYPE_UNICAST)
    {
        startPup = pupNum;
        endPup = pupNum;
    }
    else /*pupAccessType == ACCESS_TYPE_MULTICAST)*/
    {
        startPup = 0;
        endPup = octetsPerInterfaceNum-1;
    } 
    for(pupCnt = startPup; pupCnt <= endPup ; pupCnt++)
    {
       	VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pupCnt)
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("interfaceId %d startPup %d endPup %d pupCnt %d\n",interfaceId, startPup, endPup, pupCnt));
        if (resultType == RESULT_PER_BIT)
        {
            if (bitNum == ALL_BITS_PER_PUP)
            {
                startReg = pupCnt*BUS_WIDTH_IN_BITS;
                endReg = (pupCnt+1)*BUS_WIDTH_IN_BITS - 1;
            }
            else
            {
                startReg = pupCnt*BUS_WIDTH_IN_BITS + bitNum;
                endReg = pupCnt*BUS_WIDTH_IN_BITS + bitNum;
            }

        }
        else
        {
            startReg = pupCnt;
            endReg = pupCnt;
        } 
        interfaceTrainRes = ddr3TipGetBufPtr(devNum, search,resultType,interfaceId);
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("startReg %d endReg %d interface 0x%x\n",startReg, endReg, interfaceTrainRes));
        if (interfaceTrainRes == NULL)
        {
            DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("interfaceTrainRes is NULL\n"));
            return GT_FAIL;
        }
        for(regOffset=startReg; regOffset <= endReg; regOffset++)
        {
            if (operation == TrainingLoadOperation_UNLOAD)
            {
                if (isReadFromDB == GT_FALSE)
                {
                   CHECK_STATUS(mvHwsDdr3TipIFRead(devNum,  ACCESS_TYPE_UNICAST, interfaceId,
                                                regAddr[regOffset], readData  , MASK_ALL_BITS));
					if(isCheckResultValidity == GT_TRUE){
						if( (readData[interfaceId] & 0x02000000) == 0 ){
							interfaceTrainRes[regOffset] = 0x02000000 + 64 + consTap;
						}
						else{
							interfaceTrainRes[regOffset] = readData[interfaceId] + consTap;
						}
					}
					else{
						interfaceTrainRes[regOffset] = readData[interfaceId] + consTap;
					}
                    DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("regOffset %d value 0x%x addr 0x%x\n",regOffset, interfaceTrainRes[regOffset], &interfaceTrainRes[regOffset]));
                }
                else
                {
                    *loadRes = &interfaceTrainRes[startReg];
                    DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("*loadRes %d\n",*loadRes));
                }
            }
            else
            {
                DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("not supported\n"));
            }
        }
    }
    return GT_OK;
}


/*****************************************************************************
load all pattern to memory using ODPG
******************************************************************************/
GT_STATUS    ddr3TipLoadAllPatternToMem
(
    GT_U32          devNum
)
{
    GT_U32  pattern = 0, interfaceId;


    /*DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_INFO, ("=== LOAD ALL PATTERNS ==="));*/

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)    
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        trainingResult[trainingStage][interfaceId] = TEST_SUCCESS;
    }
    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)    
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        /* enable single cs */
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, CS_ENABLE_REG, (1 << 3), (1 << 3)));
    }
    for(pattern = 0; pattern < PATTERN_LIMIT; pattern++)
    {
        ddr3TipLoadPatternToMem(devNum,pattern);
    }

    return GT_OK;
}

/*****************************************************************************
wait till ODPG access is ready
******************************************************************************/
GT_STATUS isOdpgAccessDone
(
    GT_U32 devNum,
    GT_U32 interfaceId
)
{
    GT_U32 pollCnt = 0, dataValue, expectedVal;
    GT_U32 readData[MAX_INTERFACE_NUM];

    for (pollCnt = 0; pollCnt < MAX_POLLING_ITERATIONS ; pollCnt++)
    {
        CHECK_STATUS(mvHwsDdr3TipIFRead(devNum,ACCESS_TYPE_UNICAST, interfaceId, ODPG_BIST_DONE, readData, MASK_ALL_BITS));
 		dataValue = readData[interfaceId];

		expectedVal =  (ddr3TipDevAttrGet(devNum, MV_ATTR_TIP_REV) < MV_TIP_REV_3)?(ODPG_BIST_DONE_BIT_VALUE_REV2):(ODPG_BIST_DONE_BIT_VALUE_REV3);
        if (((dataValue >> ODPG_BIST_DONE_BIT_OFFS )& 0x1) == expectedVal)
        {
            dataValue = dataValue & 0xfffffffe;
            CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, ODPG_BIST_DONE, dataValue, MASK_ALL_BITS));
            break;
        }
    }
    if (pollCnt >= MAX_POLLING_ITERATIONS)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR,("Bist Activate: poll failure 2\n"));
        return GT_FAIL;
    }
    return GT_OK;
}

/*****************************************************************************
Load specific pattern to memory using ODPG
******************************************************************************/
GT_STATUS    ddr3TipLoadPatternToMem
(
    GT_U32          devNum,
    MV_HWS_PATTERN  pattern
)
{
    GT_U32  regData, interfaceId;
	PatternInfo *patternTable = ddr3TipGetPatternTable();

    /*DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_INFO, ("=== LOAD PATTERN ==="));*/

    /* load pattern to memory */
    /* Write Tx mode, CS0, phases, Tx burst size, delay between burst, rx pattern phases */
    regData = 0x1 | (patternTable[pattern].numOfPhasesTx << 5) | (patternTable[pattern].txBurstSize << 11) |
              (patternTable[pattern].delayBetweenBursts << 15) | (patternTable[pattern].numOfPhasesRx << 21) |  (0x1 << 25 ) | (effective_cs << 26);
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG, regData, MASK_ALL_BITS));
    /* ODPG Write enable from BIST */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG,  (0x1| (effective_cs<<26)), 0xC000003));
    /* disable error injection */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_WRITE_DATA_ERROR_REG,  0, 0x1));
    /* load pattern to ODPG */
    ddr3TipLoadPatternToOdpg(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, pattern, patternTable[pattern].startAddr);

	if(ddr3TipDevAttrGet(devNum, MV_ATTR_TIP_REV) >= MV_TIP_REV_3)
	{
		for(interfaceId = 0; interfaceId < MAX_INTERFACE_NUM ; interfaceId++)
		{
			if (IS_INTERFACE_ACTIVE(topologyMap->interfaceActiveMask, interfaceId) ==  0)
		         continue;
			CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, SDRAM_ODT_CONTROL_HIGH_REG, 0x3 , 0xf));
		}

		CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_ENABLE_REG, 0x1 << ODPG_ENABLE_OFFS,  (0x1 << ODPG_ENABLE_OFFS)));
	}
	else {
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG, (GT_U32)(0x1 << 31),  (GT_U32)(0x1 << 31)));
	}

    hwsOsExactDelayPtr((GT_U8)devNum, devNum, 1); /* 1 mSec */

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        CHECK_STATUS(isOdpgAccessDone(devNum, interfaceId));
    }
    /* Disable ODPG and stop write to memory*/
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG, (0x1 << 30), (GT_U32)(0x3 << 30)));

    /* return to default */
    CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_DATA_CONTROL_REG, 0, MASK_ALL_BITS));

	if(ddr3TipDevAttrGet(devNum, MV_ATTR_TIP_REV) >= MV_TIP_REV_3){
		/*disable odt0 for CS0 training - need to adjust for multy CS*/
		CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST,PARAM_NOT_CARE , 0x1498, 0x0 , 0xf));
	}

    /* temporary added */
    hwsOsExactDelayPtr((GT_U8)devNum, devNum, 1);
    return GT_OK;
}

/*****************************************************************************
Training search routine
******************************************************************************/
GT_STATUS    ddr3TipIpTrainingWrapperInt
(
    GT_U32                      devNum,
    MV_HWS_ACCESS_TYPE          accessType,
    GT_U32                      interfaceId, 
    MV_HWS_ACCESS_TYPE          pupAccessType,
    GT_U32                      pupNum, 
    GT_U32                      bitNum, 
    MV_HWS_TRAINING_RESULT      resultType,
    MV_HWS_ControlElement       controlElement,
    MV_HWS_SearchDirection      searchDir,
    MV_HWS_DIRECTION            direction,
    GT_U32                      interfaceMask, 
    GT_U32                      initValueL2h,
    GT_U32                      initValueH2l,
    GT_U32                      numIter,
    MV_HWS_PATTERN              pattern,
    MV_HWS_EdgeCompare          edgeComp,
    MV_HWS_DDR_CS               trainCsType,
    GT_U32                      csNum,
    MV_HWS_TrainingIpStatus*    trainStatus
)
{
    GT_U32  interfaceNum = 0, startIf, endIf, initValueUsed;
    MV_HWS_SearchDirection searchDirId , startSearch, endSearch;
    MV_HWS_EdgeCompare     edgeCompUsed;
	GT_U8 consTap = (direction == OPER_WRITE)?(64):(0);
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    if (trainStatus == NULL)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("trainStatus is NULL\n"));
        return GT_FAIL;
    }
    if ((trainCsType > CS_NON_SINGLE) ||
        (edgeComp >= EDGE_PFP) ||
        (pattern >= PATTERN_LIMIT) ||
        (direction > OPER_WRITE_AND_READ) ||
        (searchDir > MV_HWS_High2Low) ||
        (controlElement > MV_HWS_ControlElement_DQS_SKEW) ||
        (resultType > RESULT_PER_BYTE) ||
        (pupNum >= octetsPerInterfaceNum) ||
        (pupAccessType > ACCESS_TYPE_MULTICAST) ||
        (interfaceId > 11)||
        (accessType > ACCESS_TYPE_MULTICAST))
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("wrong parameter trainCsType %d edgeComp %d pattern %d direction %d searchDir %d controlElement %d resultType %d pupNum %d pupAccessType %d interfaceId %d accessType %d\n",trainCsType , edgeComp , pattern , direction , searchDir , controlElement , resultType , pupNum , pupAccessType , interfaceId , accessType ));
        return GT_FAIL;
    }

    if (edgeComp == EDGE_FPF)
    {
        startSearch = MV_HWS_Low2High;
        endSearch = MV_HWS_High2Low;
        edgeCompUsed = EDGE_FP;
    }
    else
    {
        startSearch = searchDir;
        endSearch = searchDir;
        edgeCompUsed = edgeComp;
    }

    for(searchDirId = startSearch ; searchDirId <= endSearch ; searchDirId++)
    {
        initValueUsed = (searchDirId == MV_HWS_Low2High) ? initValueL2h : initValueH2l;
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_TRACE, ("devNum %d, accessType %d, interfaceId %d, pupAccessType %d,pupNum %d, resultType %d, controlElement %d searchDirId %d, direction %d, interfaceMask %d,initValueUsed %d, numIter %d, pattern %d, edgeCompUsed %d, trainCsType %d, csNum %d\n", 
                            devNum, accessType, interfaceId, pupAccessType ,pupNum, resultType, controlElement,
                            searchDirId, direction, interfaceMask,
                            initValueUsed, numIter, pattern, edgeCompUsed, trainCsType, csNum));

        ddr3TipIpTraining(devNum, accessType, interfaceId, pupAccessType ,pupNum, resultType, controlElement,
                          searchDirId, direction, interfaceMask,
                          initValueUsed, numIter, pattern, edgeCompUsed, trainCsType, csNum,  trainStatus);
        if (accessType == ACCESS_TYPE_MULTICAST)
        {
           startIf = 0;
           endIf = MAX_INTERFACE_NUM-1;
        }
        else
        {
            startIf = interfaceId;
            endIf = interfaceId;
        }
        for(interfaceNum = startIf; interfaceNum <= endIf ; interfaceNum++)
        {
	    VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceNum)
            csNum = 0;
            CHECK_STATUS(ddr3TipReadTrainingResult(devNum,  interfaceNum, pupAccessType, pupNum, bitNum,
                                                   searchDirId, direction, resultType,
                                                   TrainingLoadOperation_UNLOAD, trainCsType, 
                                                   NULL , GT_FALSE, consTap, GT_FALSE));
        }
    }
    
    return GT_OK;
}


/*****************************************************************************
Training search & read result routine
******************************************************************************/
GT_STATUS    ddr3TipIpTrainingWrapper
(
    GT_U32                      devNum,
    MV_HWS_ACCESS_TYPE          accessType,
    GT_U32                      interfaceId, 
    MV_HWS_ACCESS_TYPE          pupAccessType,
    GT_U32                      pupNum, 
    MV_HWS_TRAINING_RESULT      resultType,
    MV_HWS_ControlElement       controlElement,
    MV_HWS_SearchDirection      searchDir,
    MV_HWS_DIRECTION            direction,
    GT_U32                      interfaceMask, 
    GT_U32                      initValueL2h,
    GT_U32                      initValueH2l,
    GT_U32                      numIter,
    MV_HWS_PATTERN              pattern,
    MV_HWS_EdgeCompare          edgeComp,
    MV_HWS_DDR_CS               trainCsType,
    GT_U32                      csNum,
    MV_HWS_TrainingIpStatus*    trainStatus
)
{
    GT_U8 e1,e2;
    GT_U32 interfaceCnt, bitId, startIf, endIf, bitEnd=0;
    GT_U32 *result[MV_HWS_SearchDirLimit] = {0};
	GT_U8 consTap = (direction == OPER_WRITE)?(64):(0);
	GT_U8 bitBitMask[MAX_BUS_NUM] = {0}, bitBitMaskActive = 0;
	GT_U8 pupId;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    if (pupNum >= octetsPerInterfaceNum)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("pupNum %d not valid\n",pupNum));
    }
    if (interfaceId >= MAX_INTERFACE_NUM)
    {
        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_ERROR, ("interfaceId %d not valid\n",interfaceId));
    }

    CHECK_STATUS(ddr3TipIpTrainingWrapperInt(devNum,accessType,interfaceId, pupAccessType, pupNum, 
							ALL_BITS_PER_PUP, resultType, controlElement, searchDir, direction,
							interfaceMask, initValueL2h, initValueH2l, numIter, pattern, edgeComp, trainCsType, 
							csNum, trainStatus));
    if (accessType == ACCESS_TYPE_MULTICAST)
    {
        startIf = 0;
        endIf = MAX_INTERFACE_NUM-1;
    }
    else
    {
        startIf = interfaceId;
        endIf = interfaceId;
    }
    for(interfaceCnt = startIf; interfaceCnt <= endIf; interfaceCnt++)    
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceCnt)
        for(pupId = 0; pupId <= (octetsPerInterfaceNum-1) ; pupId++)
        {
			VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pupId)
            if (resultType == RESULT_PER_BIT)
            {
                bitEnd = BUS_WIDTH_IN_BITS-1;
            }
            else
            {
                bitEnd = 0;
            }

			bitBitMask[pupId] = 0;
            for(bitId = 0; bitId <= bitEnd  ; bitId++)
            {
				MV_HWS_SearchDirection searchDirId;
                for(searchDirId = MV_HWS_Low2High ; searchDirId <= MV_HWS_High2Low ; searchDirId++)
                {
                    CHECK_STATUS(ddr3TipReadTrainingResult(devNum, interfaceCnt, ACCESS_TYPE_UNICAST,
                                pupId, bitId, searchDirId,  direction,
                                resultType, TrainingLoadOperation_UNLOAD,
                                CS_SINGLE, &result[searchDirId] , GT_TRUE, 0, GT_FALSE));
                }
                e1 = GET_TAP_RESULT(result[MV_HWS_Low2High][0], EDGE_1);
                e2 = GET_TAP_RESULT(result[MV_HWS_High2Low][0], EDGE_1);
                DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_INFO, ("wrapper interfaceId %d pupId %d bit %d l2h 0x%x (e1 0x%x) h2l 0x%x (e2 0x%x)  \n", interfaceCnt, pupId,  bitId, result[MV_HWS_Low2High][0],e1, result[MV_HWS_High2Low][0], e2));
                /* TBD validate is valid only for tx */
                if( VALIDATE_TRAINING_LIMIT(e1,e2) == GT_TRUE &&
					GET_LOCK_RESULT(result[MV_HWS_Low2High][0]) &&
					GET_LOCK_RESULT(result[MV_HWS_Low2High][0]))
                {
					/*Mark problem bits*/
					bitBitMask[pupId] |= 1<<bitId;
					bitBitMaskActive = 1;
                }
            }/*For all bits*/
        }/*For all PUPs*/

		/*Fix problem bits*/
		if(bitBitMaskActive != 0)
		{
			GT_U32  *L2HinterfaceTrainRes = NULL;
			GT_U32  *H2LinterfaceTrainRes = NULL;
			L2HinterfaceTrainRes = ddr3TipGetBufPtr(devNum, MV_HWS_Low2High,resultType,interfaceCnt);
			H2LinterfaceTrainRes = ddr3TipGetBufPtr(devNum, MV_HWS_High2Low,resultType,interfaceCnt);

        	ddr3TipIpTraining(devNum, ACCESS_TYPE_UNICAST, interfaceCnt, ACCESS_TYPE_MULTICAST , PARAM_NOT_CARE,
						  resultType, controlElement,
                          MV_HWS_Low2High, direction, interfaceMask,
                          numIter/2, numIter/2, pattern, EDGE_FP, trainCsType, csNum,  trainStatus);

		    for(pupId = 0; pupId <= (octetsPerInterfaceNum-1) ; pupId++)
		    {
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pupId)

				if(bitBitMask[pupId] == 0)
					continue;

		        for(bitId = 0; bitId <= bitEnd  ; bitId++)
		        {
					if( (bitBitMask[pupId] & (1<<bitId)) == 0)
						continue;
					CHECK_STATUS(ddr3TipReadTrainingResult(devNum, interfaceCnt, ACCESS_TYPE_UNICAST,
		                    pupId, bitId, MV_HWS_Low2High,  direction,
		                    resultType, TrainingLoadOperation_UNLOAD,
		                    CS_SINGLE, &L2HinterfaceTrainRes , GT_FALSE, 0, GT_TRUE));
				}
			}

			ddr3TipIpTraining(devNum, ACCESS_TYPE_UNICAST, interfaceCnt, ACCESS_TYPE_MULTICAST , PARAM_NOT_CARE,
						  resultType, controlElement,
                          MV_HWS_High2Low, direction, interfaceMask,
                          numIter/2, numIter/2, pattern, EDGE_FP, trainCsType, csNum,  trainStatus);

		    for(pupId = 0; pupId <= (octetsPerInterfaceNum-1) ; pupId++)
		    {
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pupId)

				if(bitBitMask[pupId] == 0)
					continue;

		        for(bitId = 0; bitId <= bitEnd  ; bitId++)
		        {
					if( (bitBitMask[pupId] & (1<<bitId)) == 0)
						continue;
		        	CHECK_STATUS(ddr3TipReadTrainingResult(devNum, interfaceCnt, ACCESS_TYPE_UNICAST,
		                    pupId, bitId, MV_HWS_High2Low,  direction,
		                    resultType, TrainingLoadOperation_UNLOAD,
		                    CS_SINGLE, &H2LinterfaceTrainRes , GT_FALSE, consTap, GT_TRUE));
				}
			}
		}/*if bitBitMaskActive*/
    }/*For all Interfacess*/

    return GT_OK;
}

/*****************************************************************************
Load phy values
******************************************************************************/
GT_STATUS    ddr3TipLoadPhyValues(GT_BOOL bLoad)
{
    GT_U32  busCnt = 0,  interfaceId,  devNum = 0;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        for(busCnt = 0; busCnt < octetsPerInterfaceNum; busCnt++)
        {
        	VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busCnt)
            if (bLoad == GT_TRUE)
            {
                CHECK_STATUS(mvHwsDdr3TipBUSRead( devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, WRITE_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), &phyRegBk[interfaceId][busCnt][0]));
                CHECK_STATUS(mvHwsDdr3TipBUSRead( devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, RL_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), &phyRegBk[interfaceId][busCnt][1]));
                CHECK_STATUS(mvHwsDdr3TipBUSRead( devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, READ_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), &phyRegBk[interfaceId][busCnt][2]));
            }
            else
            {
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId,  ACCESS_TYPE_UNICAST,  busCnt, DDR_PHY_DATA, WRITE_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), phyRegBk[interfaceId][busCnt][0]));
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId,  ACCESS_TYPE_UNICAST,  busCnt, DDR_PHY_DATA, RL_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), phyRegBk[interfaceId][busCnt][1]));
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId,  ACCESS_TYPE_UNICAST,  busCnt, DDR_PHY_DATA, READ_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET), phyRegBk[interfaceId][busCnt][2]));
            }
         }
    }
    return GT_OK;
}

GT_STATUS ddr3TipTrainingIpTest
(
    GT_U32                      devNum,
    MV_HWS_TRAINING_RESULT      resultType,
    MV_HWS_SearchDirection      searchDir,
    MV_HWS_DIRECTION            direction,  
    MV_HWS_EdgeCompare          edge,
    GT_U32                      initVal1,
    GT_U32                      initVal2,
    GT_U32                      numOfItertaions,
    GT_U32                      startPattern,
    GT_U32                      endPattern
)
{
    GT_U32 pattern, interfaceId, pupId;
    MV_HWS_TrainingIpStatus trainStatus[MAX_INTERFACE_NUM];
    GT_U32 *pRes = NULL;
    GT_U32 searchState = 0; 
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    ddr3TipLoadPhyValues(GT_TRUE);

    for(pattern = startPattern; pattern <= endPattern; pattern++)
    {
        for(searchState = 0 ; searchState < MV_HWS_SearchDirLimit ; searchState++)
        {
            ddr3TipIpTrainingWrapper(devNum, ACCESS_TYPE_MULTICAST, 0, ACCESS_TYPE_MULTICAST, 
                                        0, resultType, MV_HWS_ControlElement_ADLL,
                                        searchDir, direction, 0xFFF, initVal1, initVal2, numOfItertaions, 
                                        pattern, edge, CS_SINGLE, PARAM_NOT_CARE, trainStatus);
            for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
            {
                VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
                for(pupId = 0; pupId < octetsPerInterfaceNum ; pupId++)
                {
					VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pupId)
                    CHECK_STATUS(ddr3TipReadTrainingResult(devNum, interfaceId, ACCESS_TYPE_UNICAST, 
                                    pupId, ALL_BITS_PER_PUP, searchState,  direction, 
                                    resultType, TrainingLoadOperation_UNLOAD,
                                    CS_SINGLE, &pRes , GT_TRUE, 0, GT_FALSE));
                    if (resultType == RESULT_PER_BYTE)
                    {
                        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_INFO, ("searchState %d interfaceId %d pupId %d 0x%x\n",searchState, interfaceId, pupId, pRes[0]));
                    }
                    else
                    {
                        DEBUG_TRAINING_IP_ENGINE(DEBUG_LEVEL_INFO, ("searchState %d interfaceId %d pupId %d 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",searchState, interfaceId, pupId, pRes[0],pRes[1],pRes[2],pRes[3],pRes[4],pRes[5],pRes[6],pRes[7]));
                    }
                }
            }/*interface*/
        }/*search*/
    }/*pattern*/
   ddr3TipLoadPhyValues(GT_FALSE);
   return GT_OK;
}

/********************Get patterns structures API*******************************/

PatternInfo*  ddr3TipGetPatternTable()
{
	if( DDR3_IS_16BIT_DRAM_MODE(topologyMap->activeBusMask) == GT_FALSE)
    	return patternTable_32;
	else
    	return patternTable_16;
}

GT_U16 *ddr3TipGetMaskResultsDqReg()
{
	if(DDR3_IS_ECC_PUP3_MODE(topologyMap->activeBusMask))
    	return maskResultsDqRegMapPup3ECC;
	else
    	return maskResultsDqRegMap;
}

GT_U16 *ddr3TipGetMaskResultsPupRegMap()
{
 	if(DDR3_IS_ECC_PUP3_MODE(topologyMap->activeBusMask))
    	return maskResultsPupRegMapPup3ECC;
	else
    	return maskResultsPupRegMap;
}



