/*******************************************************************************
*                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.
********************************************************************************
* mvHwsDdr3NP5.c
*
* DESCRIPTION: DDR3 NP5 configuration
*
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 94 $
******************************************************************************/

#define DEFINE_GLOBALS

#include "mvSiliconIf.h"
#include "mvHwsDdr3NP5.h"
#include "mvDdr3TrainingIp.h"
#include "mvDdr3TrainingIpPrvIf.h"
#include "mvDdr3TrainingIpFlow.h"
#include "mvDdr3TrainingIpPbs.h"
#include "mvDdr3TrainingIpDef.h"
#include "mvDdr3TrainingIpStatic.h"
#include "mvDdrTrainingIpDb.h"
#include "mvDdr3TrainingIpDef.h"

#define  GT_DEBUG_TRAINING_NP5

extern GT_U8  debugTrainingAccess;

#ifdef  GT_DEBUG_TRAINING_NP5
#include "gtOsIo.h"
#ifdef FreeRTOS
#include "printf.h"
#define osPrintf    printf
#endif
#define DEBUG_TRAINING_IP(level,s) if (level >= debugTrainingAccess) {osPrintf s;} 
#else
#define DEBUG_TRAINING_IP(level,s)				
#endif

#define NUM_BYTES                (3)
#define NP5_NUMBER_OF_INTERFACES (12)
#define CLIENT_FIELD(interfaceId)		(interfaceId << 15)
/*#define XSB_MAPPING(interfaceId, interfaceAccess, regaddr) ((regaddr)+ CLIENT_FIELD(interfaceId)+XSB_BASE_ADDR)*/
#define GET_CLIENT_FIELD(interfaceAccess,interfaceId) ((interfaceAccess == ACCESS_TYPE_MULTICAST) ? CLIENT_FIELD(BROADCAST_ID):CLIENT_FIELD(interfaceId))
#define XSB_MAPPING(interfaceId, interfaceAccess, regaddr)   (regaddr+ XSB_BASE_ADDR + GET_CLIENT_FIELD(interfaceAccess,interfaceId))

GT_U32 freqDelay = 300;
GT_U32 useDivider = 0;
GT_U32 isPllOld = 0;
GT_U32 debugNewPhy1 = 0;
GT_U32 odtConfig;

#define PLL_NUM_OF_IF (6)
/************************** pre-declaration ******************************/
/* Read 1st active interface */
extern GT_U32 maskTuneFunc;
extern GT_U32 rlVersion;
extern MV_HWS_DDR_FREQ mediumFreq;
extern MV_HWS_DDR_FREQ lowFreq;
extern GT_U32 isPllBeforeInit;
extern GT_U32 dfsLowFreq;
extern MV_HWS_DDR_FREQ initFreq;
extern GT_U32 odtAdditional;
extern GT_U8  debugTraining;
extern GT_U32 delayEnable, ckDelay, caDelay, ckDelay_16;
extern GT_U8 calibrationUpdateControl; /*2 external only, 1 is internal only*/

extern GT_STATUS ddr3TipRegWrite
(
    GT_U32 devNum, 
    GT_U32 regAddr, 
    GT_U32 dataValue
);

extern GT_STATUS ddr3TipRegRead
(
    GT_U32 devNum, 
    GT_U32 regAddr, 
    GT_U32 *dataValue, 
    GT_U32 regMask
);



GT_STATUS    ddr3TipPipeEnable
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId,
    GT_BOOL               enable
);

GT_STATUS    ddr3TipNp5IFRead
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId, 
    GT_U32                regAddr, 
    GT_U32                *data,
    GT_U32                mask 
);

GT_STATUS    ddr3TipNp5IFWrite
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId, 
    GT_U32                regAddr, 
    GT_U32                dataValue,
    GT_U32                mask 
);

#if 0
static GT_STATUS ddr3TipNp5SetDivider
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 frequency
);
#endif

static GT_STATUS ddr3TipNp5SetFreq
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 freq
);



static GT_STATUS ddr3TipGetFreqTablePtr
(
    MV_HWS_DDR_FREQ freq, 
    GT_U32**        pFreqTable
);

static GT_STATUS ddr3TipNp5IsAccessDone
(
    GT_U32 devNum,
    GT_U32 interfaceId
);

static GT_STATUS ddr3TipNp5SetPll
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 frequency
);

/************************** Globals ******************************/
GT_U32 debugNp5 = 0;
GT_U32  pipeMulticastMask;
/**************************** Static configuration data *********************/


/************* board delendent ***************/
typedef struct
{
    GT_U32 regAddr;
    GT_U32 bitClkDivReloadRatio;
    GT_U32 maskClkDivReloadRatio;
    GT_U32 bitSdrClkDivRatioFull;
    GT_U32 maskSdrClkDivRatioFull;
    GT_U32 bitDdrClkDivRatioFull;
    GT_U32 maskDdrClkDivRatioFull;
}dividerStruct;

dividerStruct dividerArr[] =
{
    { 0x000F8258, 18, 0x40000,    0, 0x3f,  6,  0xfc0   },
    { 0x000F8270, 21, 0x600000,   4, 0x3f0, 10, 0xfc00  },
    { 0x000F825c, 21, 0x600000,   4, 0x3f0, 10, 0xfc00  },
    { 0x000F8264, 30, 0x40000000, 0, 0x3f,  6,  0xfc0   },
    { 0x000F8274, 21, 0x600000,   4, 0x3f0, 10, 0xfc00  },
    { 0x000F826C, 21, 0x600000,   4, 0x3f0, 10, 0xfc00  }
};

static MV_DFX_ACCESS interfaceMap[NP5_NUMBER_OF_INTERFACES] = 
{
	/* Pipe	Client*/
	{   7,	 0 },
	{   7,	 1 },
	{   7,	 2 },
	{   7,	 3 },
	{   7,	 4 },
	{   7,	 5 },
	{   7,	 6 },
	{   7,	 7 },
	{   7,	 8 },
	{   7,	 9 },
	{   7,	 10 },
	{   7,	 11 }
};


static RegData np5SpecificInitControllerConfig[] =
{
    {0x16D8,    0,          0x8},
    {0x15EC,    0,          0x2},
    {0x15EC,    0x8,        0xC},
    {0x15EC,    0x20,       0x30},
    {0x16D8,    2,          0x3},
    {0x14cc,    0x1,        0x1},
    {0x14cc,    0x4,        0x4},
    {0x14cc,    0x8,        0x18},
    {0x14cc,    0x12000,    0x7DFFE000},
    {0x1400,    0x7B00CC30, 0xffffffff},
    {0x1404,    0x36301800, 0xffffffff},
    {0x1408,    0x5415F3AA, 0xffffffff},
    {0x140C,    0x38401DFF, 0xffffffff},
    {0x1410,    0x1C000001, 0xffffffff},
    {0x1414,    0x700,      0xffffffff},
    {0x1424,    0x60F3FF,   0xffffffff},
    {0x1428,    0x11A940,   0xffffffff},
    {0x142C,    0x28C5134,  0xffffffff},
    {0x147C,    0xD771,     0xffffffff},
    {0x1494,    0x10000,    0xffffffff},
    {0x149C,    0x301,      0xffffffff},
    {0x14A8,    0x0,        0xffffffff},
    {0x1504,    0x3FFFFFE1, 0xffffffff},
    {0x150C,    0x7FFFFFE5, 0xffffffff},
    {0x1514,    0,          0xffffffff},
    {0x151C,    0,          0xffffffff},
    {0x1538,    0xB,        0xffffffff},
    {0x153C,    0xB,        0xffffffff},
    {0x15D0,    0x70,       0xffffffff},
    {0x15D4,    0,          0xffffffff},
    {0x15D8,    0x218,      0xffffffff},
    {0x15DC,    0x0,        0xffffffff},
    {0x15E0,    0x27,       0xffffffff},
    {0x15E4,    0x203C18,   0xffffffff},
	{0,   0, 0}
};


static GT_U32 np5BwPerFreq[DDR_FREQ_LIMIT] =
{
    0x2, /*DDR_FREQ_LOW_FREQ*/
    0x3, /*DDR_FREQ_400*/
    0x3, /*DDR_FREQ_533*/
    0x3, /*DDR_FREQ_667*/
    0x3, /*DDR_FREQ_800*/
    0x3, /*DDR_FREQ_933*/
    0x3, /*DDR_FREQ_1066*/
    0xFF, /*DDR_FREQ_311*/
    0xFF, /*DDR_FREQ_333*/
    0xFF, /*DDR_FREQ_467*/
    0x3,  /*DDR_FREQ_850*/
    0x5,  /*DDR_FREQ_600*/
    0xFF,  /*DDR_FREQ_300*/
	0x3 /*DDR_FREQ_900*/
};

static GT_U32 np5RatePerFreq[DDR_FREQ_LIMIT] =
{
   0x1, /*DDR_FREQ_LOW_FREQ,*/
   0x2, /*DDR_FREQ_400,*/
   0x2, /*DDR_FREQ_533,*/
   0x3, /*DDR_FREQ_667,*/
   0x3, /*DDR_FREQ_800,*/
   0x3, /*DDR_FREQ_933,*/
   0x3, /*DDR_FREQ_1066,*/
   0x2, /*DDR_FREQ_311*/
   0x2, /*DDR_FREQ_333*/
   0x2, /*DDR_FREQ_467*/
   0x3  /*DDR_FREQ_850*/
   0x3,  /*DDR_FREQ_600*/
   0x2,  /*DDR_FREQ_300*/
   0x3 /*DDR_FREQ_900*/
};



GT_U32 freqParams[DDR_FREQ_LIMIT][MV_HWS_FreqField_LIMIT] = 
/*   PLL_NDIV  PLL_MDIV PLL_KDIV  PLL_VCO_BAND  PLL_LPF_R1_CTRL */                  
{ 
    {  39,     0,       4,       2,        4 }, /* 100MHz/200Mb  */
    {  31,     0,       2,       1,        4 }, /* 400MHz/800Mb  */
    { 127,     2,       2,       2,        1 }, /* 533MHz/1066Mb */
    { 159,     2,       2,       3,        1 }, /* 667MHz/1333Mb */
    { 191,     2,       2,       5,        1 }, /* 800MHz/1600Mb */
    { 223,     2,       2,       6,        1 }, /* 933MHz/1866Mb */
    { 255,     2,       2,       7,        1 }, /* 1066MHz/2133Mb */
    { 1,       1,       1,       1,        1 }, /* 311Mhz */
    { 1,       1,       1,       1,        1 }, /* 333Mhz */
    { 1,       1,       1,       1,        1 }, /* 467Mhz */
    { 101,     2,       1,       1,        4 }, /* 850Mhz */
};  






GT_U32 phy1ValTable[DDR_FREQ_LIMIT] =
{
  0,   /* DDR_FREQ_LOW_FREQ */
  0xf, /* DDR_FREQ_400 */
  0xf, /* DDR_FREQ_533 */
  0xf, /* DDR_FREQ_667 */
  0xc, /* DDR_FREQ_800 */
  0x8, /* DDR_FREQ_933 */
  0x8, /* DDR_FREQ_1066 */
  0xf, /* DDR_FREQ_311 */
  0xf, /* DDR_FREQ_333 */
  0xf, /* DDR_FREQ_467 */
  0xc  /* DDR_FREQ_850 */
  0xC,  /*DDR_FREQ_600*/
  0xF,  /*DDR_FREQ_300*/
  0x8 	/*DDR_FREQ_900*/
};

static RegData pllConfig[] =
{

   {0xF8258   ,   0         , 0x4000},      /*clock ratio */
   {0xF8254   ,   0         , 0xc0000000},  /* clock enable */
   {0xF8270   ,   0         , 0x40000},     /*clock ratio */
   {0xF8270   ,   0         , 0xc},         /* clock enable */
   {0xF825c   ,   0         , 0x600000},    /*clock ratio */
   {0xF825c   ,   0         , 0xc},         /* clock enable */
   {0xF8264   ,   0         , 0x40000000},  /*clock ratio */
   {0xF8260   ,   0         , 0x60},        /* clock enable */
   {0xF8274   ,   0         , 0x600000},    /*clock ratio */
   {0xF8274   ,   0         , 0xc},         /* clock enable */
   {0xF826c   ,   0         , 0x40000000},  /*clock ratio */
   {0xF8268   ,   0         , 0x60}         /* clock enable */
};

/* pll values */
static RegData pllValueTable[] =
{
   {0xF82F0   ,0x2821f002  , 0xffffffff          },
   {0xF8300   ,0x2821f002  , 0xffffffff          },
   {0xF8308   ,0x2821f002  , 0xffffffff          },
   {0xF8310   ,0x2821f002  , 0xffffffff          },
   {0xF8318   ,0x2821f002  , 0xffffffff          },
   {0xF8320   ,0x2821f002  , 0xffffffff          }

};

/* pll configuration disable*/ 
static RegData pllDisableTable[] =
{

   {0xF82F4   ,0  , 0x100          },
   {0xF8304   ,0  , 0x100          },
   {0xF830c   ,0  , 0x100          },
   {0xF8314   ,0  , 0x100          },
   {0xF831c   ,0  , 0x100          },
   {0xF8324   ,0  , 0x100          }
};

/* pll configuration enable*/ 
static RegData pllEbaleTable[] =
{

   {0xF82F4   ,0x100  , 0x100          },
   {0xF8304   ,0x100  , 0x100          },
   {0xF830c   ,0x100  , 0x100          },
   {0xF8314   ,0x100  , 0x100          },
   {0xF831c   ,0x100  , 0x100          },
   {0xF8324   ,0x100  , 0x100          }
};


const GT_U32 DQbitMap2Phypin[] = 
{
/* bit 0 bit 1 ...*/
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3,
    2, 7, 3, 0, 1, 9, 6, 8,
    6, 7, 0, 9, 3, 8, 2, 1,
    0, 6, 8, 3, 9, 2, 7, 1,
    9, 1, 7, 0, 8, 2, 6, 3
};

/******************************************************************************
* Get pointer to global pointer array using the fiven frequency
*/
static
GT_STATUS ddr3TipGetFreqTablePtr(MV_HWS_DDR_FREQ freq, GT_U32** pFreqTable)
{
   DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, ("ddr3TipGetFreqTablePtr freq  0x%x \n", freq));

   *pFreqTable = freqParams[freq];
   return GT_OK;
}


GT_STATUS ddr3TipNp5GetFreqConfig
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 freq,
	MV_HWS_TIP_FREQ_CONFIG_INFO		*freqConfigInfo
)
{
    if (np5BwPerFreq[freq] == 0xff)
    {
		freqConfigInfo->isSupported = GT_FALSE;
        return GT_NOT_SUPPORTED;
    }

    if (freqConfigInfo == NULL)
    {
        return GT_BAD_PARAM;
    }
    freqConfigInfo->bwPerFreq = np5BwPerFreq[freq];
    freqConfigInfo->ratePerFreq = np5RatePerFreq[freq];
    freqConfigInfo->isSupported = GT_TRUE;

    return GT_OK;
}

/******************************************************************************
*/
GT_STATUS    ddr3TipNp5PipeEnable
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId,
    GT_BOOL               enable
)
{
    GT_U32 dataValue, pipeEnableMask = 0;

    if (enable == GT_FALSE)
    {
        pipeEnableMask = 0;
    }
    else
    {
       if (interfaceAccess == ACCESS_TYPE_MULTICAST)
        {
            pipeEnableMask = pipeMulticastMask;            
        }
        else
        {
            pipeEnableMask = (1 << interfaceMap[interfaceId].pipe);            
        }
    }
    CHECK_STATUS(ddr3TipRegRead(devNum, PIPE_ENABLE_ADDR, &dataValue, MASK_ALL_BITS))
    dataValue = (dataValue & (~0xFF)) | pipeEnableMask;
    CHECK_STATUS(ddr3TipRegWrite(devNum, PIPE_ENABLE_ADDR, dataValue));

    return GT_OK;
}

GT_STATUS    ddr3TipNp5IFWrite
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId, 
    GT_U32                regAddr, 
    GT_U32                dataValue,
    GT_U32                mask 
)
{

    GT_U32 dataCmd = 0, uiDataRead = 0, uiReadInterfaceId=0, startIf, endIf;
    MV_HWS_TOPOLOGY_MAP *topologyMap = ddr3TipGetTopologyMap(devNum);
    GT_U32 rdData = 1;
    GT_U32 dataRead[MAX_INTERFACE_NUM];

#ifdef WIN32
    return 0;
#endif
    if (mask != MASK_ALL_BITS)
    {
        /* if all bits should be written there is no need for read-modify-write */
        if (interfaceAccess == ACCESS_TYPE_MULTICAST)
        { 
            CHECK_STATUS(ddr3TipGetFirstActiveIf(devNum, topologyMap->interfaceActiveMask, &uiReadInterfaceId));
        }
        else
        {
            uiReadInterfaceId = interfaceId;
        }
        if (debugNp5 >= 2)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,( "ddr3TipNp5IFWrite active interface = %d\n",uiReadInterfaceId));
        }
        CHECK_STATUS(ddr3TipNp5IFRead(devNum, ACCESS_TYPE_UNICAST,uiReadInterfaceId, regAddr,  dataRead,MASK_ALL_BITS));
        uiDataRead = dataRead[uiReadInterfaceId];
        /*ddr3TipNp5PipeEnable(devNum, interfaceAccess, interfaceId, GT_TRUE);*/
        dataValue = (uiDataRead & (~mask)) | (dataValue & mask);
    }
    /*ddr3TipNp5PipeEnable(devNum, interfaceAccess, interfaceId, GT_TRUE);*/
    /*CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CTRL_1_REG) , TRAINING_ID));*/

    /*working with XSB multicast client , Write Interface ADDR as data to XSB address C */
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_ADDRESS_REG), (regAddr)));
    /*Write Interface DATA as data to XSB address 0x10.*/
    if (debugNp5 >= 1)
    {
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("Dunit Write: interface %d  access %d Address 0x%x Data 0x%x\n", interfaceId, interfaceAccess, regAddr, dataValue));
    }
   
	CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_DATA_REG),  dataValue));

	
    dataCmd = (TARGET_INT << 19) + (BYTE_EN << 11) + (NUM_BYTES << 4) +  (CMD_WRITE << 2) + (INTERNAL_ACCESS_PORT << 1);
    /*Write Interface COMMAND as data to XSB address 8
      Execute an internal write to xBar port1 */
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), dataCmd));
    dataCmd |= EXECUTING;
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), dataCmd));
    /*CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), &rdData, MASK_ALL_BITS));*/

    if (interfaceAccess == ACCESS_TYPE_MULTICAST)
    {
        startIf = 0;
        endIf = MAX_INTERFACE_NUM - 1;
    }  
    else
    {
        startIf = interfaceId;
        endIf = interfaceId;
    }

    for(interfaceId = startIf; interfaceId <= endIf; interfaceId++)    
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        CHECK_STATUS(ddr3TipNp5IsAccessDone(devNum, interfaceId));
    }
    /*ddr3TipNp5PipeEnable(devNum, interfaceAccess, interfaceId, GT_FALSE);*/
    return GT_OK;
}

GT_STATUS ddr3TipNp5IsAccessDone
(
    GT_U32 devNum,
    GT_U32 interfaceId
)
{
    GT_U32 rdData = 1;
    int cnt = 0;


    CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_CMD_REG), &rdData, MASK_ALL_BITS));
    rdData &= 1;

    while(rdData != 0)
    {
        if (cnt++ >= MAX_POLLING_ITERATIONS)
            break;
        CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_CMD_REG), &rdData, MASK_ALL_BITS));
        rdData &= 1;
    }
    if (cnt < MAX_POLLING_ITERATIONS)
    {
        return GT_OK;
    }
    else
    {
        return GT_FAIL;
    }
}

/******************************************************************************/
GT_STATUS    ddr3TipNp5IFRead
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId, 
    GT_U32                regAddr, 
    GT_U32                *data,
    GT_U32                mask 
)
{
    GT_U32 dataValue = 0, startIf, endIf;
    MV_HWS_TOPOLOGY_MAP *topologyMap = ddr3TipGetTopologyMap(devNum);
#ifdef WIN32
    return 0;
#endif
    /*ddr3TipNp5PipeEnable(devNum, interfaceAccess, interfaceId, GT_TRUE);*/
    /*CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CTRL_1_REG) ,TRAINING_ID));*/
    /*working with XSB client InterfaceNum  Write Interface ADDR as data to XSB address C*/
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_ADDRESS_REG), regAddr));
    dataValue = (TARGET_INT << 19) + (BYTE_EN << 11) + (NUM_BYTES << 4) + (CMD_READ << 2) +(INTERNAL_ACCESS_PORT  << 1);
    /*Write Interface COMMAND as data to XSB address 8 */
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), dataValue));
    dataValue |= EXECUTING;
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), dataValue));

    if (interfaceAccess == ACCESS_TYPE_UNICAST)
    {
        startIf = interfaceId;
        endIf = interfaceId;
    }
    else
    {
        startIf = 0;
        endIf = MAX_INTERFACE_NUM-1;
    }
    
    for(interfaceId = startIf; interfaceId <= endIf; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        CHECK_STATUS(ddr3TipNp5IsAccessDone(devNum, interfaceId));
#if OLD_UNICAST
        if (interfaceAccess == ACCESS_TYPE_UNICAST)
        {
            CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_DATA_REG), data, mask));
            if (debugNp5 >= 2)
            {
			    DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("DunitRead   0x%x: 0x%x (mask 0x%x)\n",  regAddr,  *data, mask));
            }
        }
        else
#endif
        {
            CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_DATA_REG), &data[interfaceId], mask));
            if (debugNp5 >= 2)
            {
			    DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("DunitRead   0x%x: 0x%x (mask 0x%x)\n",  regAddr,  data[interfaceId], mask));
            }
        }
    }
    /*ddr3TipNp5PipeEnable(devNum, interfaceAccess, interfaceId, GT_FALSE);*/
    return GT_OK;
}



static GT_STATUS ddr3TipNp5SetFreq
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 frequency
)
{
    CHECK_STATUS(ddr3TipNp5SetPll(devNum, frequency));
    return GT_OK;
}

#if 0
static GT_STATUS ddr3TipNp5SetDivider
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 frequency
)
{
    GT_U32 dataValue = 0, sarFunc, dataRead, ddrCnt;

    if (frequency != DDR_FREQ_LOW_FREQ)
    {
		DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:   frequency invalid %d\n",  frequency));
        return GT_BAD_PARAM;
    }

    ddr3TipRegRead(devNum, 0xf8204, &dataRead, MASK_ALL_BITS);
    DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:  sar reg 0x%x\n",dataRead));
    dataRead = (dataRead >> 15) & 0x7;
    switch (dataRead)
    {
    case 0:
        sarFunc = 0x204;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:  sarFreq 1066M\n"));
        break;
    case 1:
        sarFunc = 0x183;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:  sarFreq 933M\n"));
        break;
    case 2:
        sarFunc = 0x183;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:  sarFreq 800M\n"));
        break;
    default:
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider:  SAR freq invalid %d\n",  dataRead));
        return GT_BAD_PARAM;
    }
  
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {
        CHECK_STATUS(ddr3TipRegRead(devNum, dividerArr[ddrCnt].regAddr, &dataRead, MASK_ALL_BITS));
        dataRead &= ~(dividerArr[ddrCnt].maskClkDivReloadRatio | dividerArr[ddrCnt].maskSdrClkDivRatioFull | dividerArr[ddrCnt].maskDdrClkDivRatioFull);
        dataValue = (1 << dividerArr[ddrCnt].bitClkDivReloadRatio);
        dataValue |= dataRead;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider: write(0x%x,0x%x)\n",  dividerArr[ddrCnt].regAddr, dataValue));
        CHECK_STATUS(ddr3TipRegWrite(devNum, dividerArr[ddrCnt].regAddr, dataValue));
        dataValue |= ((sarFunc & 0x3f) << dividerArr[ddrCnt].bitSdrClkDivRatioFull) ;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider: write(0x%x,0x%x)\n",  dividerArr[ddrCnt].regAddr, dataValue));
        CHECK_STATUS (ddr3TipRegWrite(devNum, dividerArr[ddrCnt].regAddr, dataValue));
        dataValue |= (((sarFunc & (0x3f << 6)) >> 6) << dividerArr[ddrCnt].bitDdrClkDivRatioFull) ;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider: write(0x%x,0x%x)\n",  dividerArr[ddrCnt].regAddr, dataValue));
        CHECK_STATUS(ddr3TipRegWrite(devNum, dividerArr[ddrCnt].regAddr, dataValue));

    }
  
    if (hwsOsExactDelayPtr == NULL)
    {
        DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("hwsOsExactDelayPtr is NULL !!!"));
    }
    else
    {
        CHECK_STATUS(hwsOsExactDelayPtr(devNum, devNum, 300));
    }
    

    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {
        CHECK_STATUS(ddr3TipRegRead(devNum, dividerArr[ddrCnt].regAddr, &dataRead, MASK_ALL_BITS));
        dataRead &= ~(dividerArr[ddrCnt].maskClkDivReloadRatio );
        dataValue = (0 << dividerArr[ddrCnt].bitClkDivReloadRatio);
        dataValue |= dataRead;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("set divider: write(0x%x,0x%x)\n",  dividerArr[ddrCnt].regAddr, dataValue));

        CHECK_STATUS (ddr3TipRegWrite(devNum, dividerArr[ddrCnt].regAddr, dataValue));
       CHECK_STATUS(hwsOsExactDelayPtr(devNum, devNum, 10));

    } 

    return GT_OK;
}
#endif

static GT_STATUS ddr3TipNp5SetPll
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 frequency
)
{
    GT_U32  dataVal = 0, dataValue = 0;
    GT_U32  *pPllFreqTable = NULL;
    GT_U32  ddrCnt = 0;
    RegData *pRegData = NULL;

  
    pRegData = pllConfig;

    CHECK_STATUS(ddr3TipGetFreqTablePtr(frequency, &pPllFreqTable)); 
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {   
        /* write 0 to reload ratio & clock enable */

        ddr3TipRegRead(devNum, pRegData[ddrCnt*2].regAddr, &dataVal, MASK_ALL_BITS);
        dataValue = (dataVal & (~pRegData[ddrCnt*2].regMask)) ;
        CHECK_STATUS (ddr3TipRegWrite(devNum, pRegData[ddrCnt*2].regAddr, dataValue));
        ddr3TipRegRead(devNum, pRegData[ddrCnt*2 + 1].regAddr, &dataVal, MASK_ALL_BITS);
        dataValue = (dataVal & (~pRegData[ddrCnt*2 + 1].regMask)) ;
        CHECK_STATUS (ddr3TipRegWrite(devNum, pRegData[ddrCnt*2 + 1].regAddr, dataValue));
    }
    dataValue = (0x1 << 29) |  (pPllFreqTable[FreqField_PLL_LPF_R1_CTRL] << 25) |(pPllFreqTable[FreqField_PLL_VCO_BAND] << 21) | (pPllFreqTable[FreqField_PLL_NDIV] << 12) | (pPllFreqTable[FreqField_PLL_MDIV] << 3) |  (pPllFreqTable[FreqField_PLL_KDIV]);
    /*DEBUG_TRAINING_IP(("ddr3TipGetFreqTablePtr LPF  0x%x VCO  0x%x NDIV  0x%x MDIV  0x%x KDIV  0x%x\n", 
					    pPllFreqTable[FreqField_PLL_LPF_R1_CTRL], pPllFreqTable[FreqField_PLL_VCO_BAND], pPllFreqTable[FreqField_PLL_NDIV], 
					    pPllFreqTable[FreqField_PLL_MDIV], pPllFreqTable[FreqField_PLL_KDIV]));   */

    /* pll configuration disable */
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {         
        CHECK_STATUS (ddr3TipRegWrite(devNum,pllDisableTable[ddrCnt].regAddr, pllDisableTable[ddrCnt].regData));
    }
    /* update pll configuration */
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {         
        CHECK_STATUS (ddr3TipRegWrite(devNum,pllValueTable[ddrCnt].regAddr, dataValue));
    }
    /* pll configuration enable */
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {         
        CHECK_STATUS (ddr3TipRegWrite(devNum,pllEbaleTable[ddrCnt].regAddr, pllEbaleTable[ddrCnt].regData));
    }
#ifndef WIN32
    if (hwsOsExactDelayPtr == NULL)
    {
        DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, ("hwsOsExactDelayPtr is NULL !!!"));
    }
    else
    {
        CHECK_STATUS(hwsOsExactDelayPtr(devNum, devNum, freqDelay));
    }
#endif
	/*
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {         
        CHECK_STATUS (ddr3TipRegWrite(devNum,pllEbaleTable[ddrCnt].regAddr, 0));
    }
    */
    for(ddrCnt=0; ddrCnt < (NP5_NUMBER_OF_INTERFACES/2) ; ddrCnt++)
    {  
        /* write 1 (enable) to reload ratio & clock enable */

        ddr3TipRegRead(devNum, pRegData[ddrCnt*2 + 1].regAddr, &dataVal, MASK_ALL_BITS);
        dataValue = (dataVal & (~pRegData[ddrCnt*2 + 1].regMask)) | (pRegData[ddrCnt*2 + 1].regMask);
        CHECK_STATUS (ddr3TipRegWrite(devNum, pRegData[ddrCnt*2 + 1].regAddr, dataValue));

        ddr3TipRegRead(devNum, pRegData[ddrCnt*2].regAddr, &dataVal, MASK_ALL_BITS);
        dataValue = (dataVal & (~pRegData[ddrCnt*2].regMask)) | (pRegData[ddrCnt*2].regMask);
        CHECK_STATUS (ddr3TipRegWrite(devNum, pRegData[ddrCnt*2].regAddr, dataValue)); 
    }

    return GT_OK;

}

/******************************************************************************
* Name:     ddr3TipNp5SelectDdrController.
* Desc:     Enable/Disable access to Marvell's server.
* Args:     devNum  - device number
*           enable  - whether to enable or disable the server
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipNp5SelectDdrController
(
    GT_U8    devNum,
    GT_BOOL  enable 
)
{
    GT_U32 interfaceId;
    MV_HWS_TOPOLOGY_MAP *topologyMap = ddr3TipGetTopologyMap(devNum);

    DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, ("ddr3TipNp5SelectDdrController"));
    if (enable)
    {
        for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
            pipeMulticastMask |= (1 << interfaceMap[interfaceId].pipe);
            /* multicast Macro is subscribed to Multicast 0x1D */
           /* CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_CTRL_0_REG), &dataValue, MASK_ALL_BITS));
            dataValue |= 0x40;
            CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, ACCESS_TYPE_UNICAST, XSB_CTRL_0_REG), dataValue));
            */
        }
        /* Enable Pipe 7. */
        CHECK_STATUS(ddr3TipRegWrite(devNum, PIPE_ENABLE_ADDR, (1<<7) ));
        /* Enable DDR Tuning */
        CHECK_STATUS(ddr3TipRegWrite(devNum, ENABLE_DDR_TUNING_ADDR, ENABLE_DDR_TUNING_DATA));
        CHECK_STATUS(ddr3TipNp5IFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, READ_BUFFER_SELECT_REG,  0x8000, MASK_ALL_BITS));
    }
    else
    {
        /* Disable DDR Tuning Select */
        CHECK_STATUS(ddr3TipRegWrite( devNum,  ENABLE_DDR_TUNING_ADDR, DISABLE_DDR_TUNING_DATA));
        CHECK_STATUS(ddr3TipNp5IFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, READ_BUFFER_SELECT_REG, 0,MASK_ALL_BITS));
   }
   return GT_OK;
}


/******************************************************************************
*/
GT_STATUS ddr3TipInitNp5Silicon
(
    GT_U32  devNum,
    GT_U32  boardId
) 
{
    MV_HWS_TIP_STATIC_CONFIG_INFO staticConfig;
    MV_HWS_TIP_CONFIG_FUNC_DB configFunc;
    MV_HWS_XSB_INFO         xsbInfo;

    GT_U32 boardOffset = boardId * NP5_NUMBER_OF_INTERFACES *np5TopologyMap[boardId].numOfBusPerInterface;

	DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("register functions \n"));

    staticConfig.siliconDelay = np5SiliconDelayOffset[boardId];
    staticConfig.packageTraceArr = np5PackageRoundTripDelayArray;
    staticConfig.boardTraceArr = &np5BoardRoundTripDelayArray[boardOffset];


    configFunc.tipDunitReadFunc = ddr3TipNp5IFRead;
    configFunc.tipDunitWriteFunc = ddr3TipNp5IFWrite;
    configFunc.tipDunitMuxSelectFunc = ddr3TipNp5SelectDdrController;
    configFunc.tipGetFreqConfigInfoFunc = ddr3TipNp5GetFreqConfig;
    configFunc.tipSetFreqDividerFunc = ddr3TipNp5SetFreq;

    mvHwsDdr3TipInitConfigFunc(devNum, &configFunc);

#ifdef STATIC_ALGO_SUPPORT
    ddr3TipInitStaticConfigDb(devNum, &staticConfig);
#endif
    ddr3TipInitSpecificRegConfig(devNum, np5SpecificInitControllerConfig);
	ddr3TipRegisterDqTable(devNum, DQbitMap2Phypin);

    xsbInfo.dfxTable = interfaceMap;
    ddr3TipRegisterXsbInfo(devNum, &xsbInfo);

    /* old machine read leveling version */
    maskTuneFunc = ( STATIC_LEVELING_MASK_BIT |
                     /*WRITE_LEVELING_MASK_BIT |*/
                     LOAD_PATTERN_2_MASK_BIT |
                     READ_LEVELING_MASK_BIT |
                     SET_TARGET_FREQ_MASK_BIT |
                     WRITE_LEVELING_TF_MASK_BIT | 
                     READ_LEVELING_TF_MASK_BIT |
                     WRITE_LEVELING_SUPP_TF_MASK_BIT |
                     PBS_TX_MASK_BIT |
                     PBS_RX_MASK_BIT | 
                     CENTRALIZATION_RX_MASK_BIT |
                     CENTRALIZATION_TX_MASK_BIT); 

    lowFreq = DDR_FREQ_LOW_FREQ;
    mediumFreq = DDR_FREQ_667;
    isPllBeforeInit = 1;
    rlVersion = 0;
    initFreq = DDR_FREQ_667;
	debugTraining = DEBUG_LEVEL_INFO;
	odtAdditional = 0;
	odtConfig = 0;
	delayEnable = 0;
	if( ckDelay == -1 )
		ckDelay = 150;
	if( ckDelay_16 == -1 )
		ckDelay_16 = 0;
	caDelay = 0;
	calibrationUpdateControl = 1;

    return GT_OK;
}


GT_STATUS ddr3TipInitNp5
(
    GT_U32  devNum,
    GT_U32  boardId
) 
{
    DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("ddr3TipInitNp5 \n"));
    CHECK_STATUS(mvHwsDdr3TipLoadTopologyMap(devNum, &np5TopologyMap[boardId]));
    ddr3TipInitNp5Silicon(devNum, boardId);
    return GT_OK;
}






/******************************************************************************
* Name:     ddr3TipPipeEnable.
* Desc:     
* Args:     
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipPipeEnable
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId,
    GT_BOOL               enable
)
{
    GT_U32 dataValue, pipeEnableMask = 0;

    if (enable == GT_FALSE)
    {
        pipeEnableMask = 0;
    }
    else
    {
       if (interfaceAccess == ACCESS_TYPE_MULTICAST)
        {
            pipeEnableMask = pipeMulticastMask;            
        }
        else
        {
            pipeEnableMask = (1 << interfaceMap[interfaceId].pipe);            
        }
    }
    CHECK_STATUS(ddr3TipRegRead(devNum, PIPE_ENABLE_ADDR, &dataValue, MASK_ALL_BITS))
    dataValue = (dataValue & (~0xFF)) | pipeEnableMask;
    CHECK_STATUS(ddr3TipRegWrite(devNum, PIPE_ENABLE_ADDR, dataValue));

    return GT_OK;
}


/******************************************************************************
*/
static GT_STATUS    ddr3TipDataReset
(
    GT_U32                  devNum,
    MV_HWS_ACCESS_TYPE      interfaceAccess,
    GT_U32                  interfaceId
)
{
    GT_STATUS retVal;
    GT_U32  uiWordCnt;

    for(uiWordCnt = 0; uiWordCnt < 8 ; uiWordCnt++)
    {
        /*Write Interface DATA as data to XSB address 0x10.*/
        retVal = ddr3TipRegWrite(devNum,     XSB_MAPPING(interfaceId, interfaceAccess, XSB_DATA_REG+(uiWordCnt * 4)), 0xABCDEF12);
        if (retVal != GT_OK)
        {
            return retVal;
        }
    }
    return GT_OK;
}

/*****************************************************************************
XSB External read
******************************************************************************/
GT_STATUS    ddr3TipExtRead
( 
    GT_U32      devNum,
    GT_U32      interfaceId,
    GT_U32      regAddr,
    GT_U32      numOfBursts,
    GT_U32      *addr
)

{
    GT_U32 burstNum, wordNum , dataValue;
	GT_U32 cntPoll;
    MV_HWS_ACCESS_TYPE    interfaceAccess = ACCESS_TYPE_UNICAST;

    /*DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("=== EXTERNAL READ ==="));*/

  /*  if (xsbInfo[devNum].isPipeEnableRequired ==  GT_TRUE)
    {
        ddr3TipPipeEnable(devNum, ACCESS_TYPE_UNICAST, interfaceId, GT_TRUE);
    }*/
    /* ofer ????
    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, XSB_CTRL_0_REG) ,EXT_TRAINING_ID));*/

    for(burstNum=0 ; burstNum < numOfBursts; burstNum++)
    {
        ddr3TipDataReset(devNum, ACCESS_TYPE_UNICAST, interfaceId);
        /*working with XSB client InterfaceNum  Write Interface ADDR as data to XSB address C*/
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_ADDRESS_REG + (burstNum * 32)), regAddr));
/*        if (xsbInfo[devNum].isCbeRequired ==  GT_TRUE)
        {
            dataValue = CS_CBE_VALUE(0) << 19;
        }
        else*/
        {
            dataValue = (TARGET_EXT << 19);
        }
        dataValue |= (BYTE_EN << 11) + (NUM_BYTES_IN_BURST << 4) + (ACCESS_EXT << 3);
        /*Write Interface COMMAND as data to XSB address 8 */
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING( interfaceId, interfaceAccess, XSB_CMD_REG),   dataValue));
        dataValue |= EXECUTING;
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING( interfaceId, interfaceAccess, XSB_CMD_REG),   dataValue));

		for(cntPoll=0; cntPoll < MAX_POLLING_ITERATIONS; cntPoll++)
		{
			CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING( interfaceId, interfaceAccess, XSB_CMD_REG), &dataValue, 0x1));
			
			if (dataValue == 0)
				break;
		}

		if (cntPoll >= MAX_POLLING_ITERATIONS)
		{
			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("No Done indication for DDR Read\n", dataValue));
			return GT_NOT_READY;
		}

        for(wordNum = 0; wordNum < EXT_ACCESS_BURST_LENGTH /*s_uiNumOfBytesInBurst/4*/; wordNum++)
        {
            CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_DATA_REG + (wordNum * 4)), &addr[wordNum], MASK_ALL_BITS));
            DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, ("ddr3TipExtRead data 0x%x \n",addr[wordNum]));
        }
    }
    /*
    if (xsbInfo[devNum].isPipeEnableRequired ==  GT_TRUE)    {
        ddr3TipPipeEnable(devNum, ACCESS_TYPE_UNICAST, interfaceId, GT_FALSE);
    }*/
    return GT_OK;
}



/*****************************************************************************
XSB External write
******************************************************************************/
GT_STATUS    ddr3TipExtWrite
(
    GT_U32      devNum,
    GT_U32      interfaceId,
    GT_U32      regAddr,
    GT_U32      numOfBursts,
    GT_U32      *addr
)
{
    GT_U32        wordNum = 0,  dataCmd = 0, burstNum=0, cntPoll = 0, dataValue  = 0;
    MV_HWS_ACCESS_TYPE    interfaceAccess = ACCESS_TYPE_UNICAST;    
    /*DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("===EXTERNAL WRITE==="));*/

   /* if (xsbInfo[devNum].isPipeEnableRequired ==  GT_TRUE)
    {
        ddr3TipPipeEnable(devNum, ACCESS_TYPE_UNICAST, interfaceId, GT_TRUE);
    }*/

    CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CTRL_0_REG) ,EXT_TRAINING_ID  ));
    for(burstNum=0 ; burstNum < numOfBursts; burstNum++)
    {
        /*working with XSB multicast client , Write Interface ADDR as data to XSB address C */
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_ADDRESS_REG), regAddr + (burstNum * EXT_ACCESS_BURST_LENGTH * 4)));
        for(wordNum = 0; wordNum < 8 ; wordNum++)
        {
            /*Write Interface DATA as data to XSB address 0x10.*/
            CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_DATA_REG + (wordNum * 4)), addr[wordNum]));
        }
        /*if (xsbInfo[devNum].isCbeRequired ==  GT_TRUE)
        {
            dataCmd =  CS_CBE_VALUE(0) << 19;
        }
        else
        */
        {
            dataCmd = (TARGET_EXT << 19);
        }
        dataCmd |= (BYTE_EN << 11) + (NUM_BYTES_IN_BURST << 4) + (ACCESS_EXT << 3) + EXT_MODE;
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId,  interfaceAccess, XSB_CMD_REG), dataCmd));
        /* execute xsb write */
        dataCmd |= 0x1;
        DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, ("ddr3TipExtWrite dataCmd 0x%x \n", dataCmd));
        CHECK_STATUS(ddr3TipRegWrite(devNum, XSB_MAPPING(interfaceId, interfaceAccess, XSB_CMD_REG), dataCmd));

		for(cntPoll=0; cntPoll < MAX_POLLING_ITERATIONS; cntPoll++)
		{
			CHECK_STATUS(ddr3TipRegRead(devNum, XSB_MAPPING( interfaceId, interfaceAccess, XSB_CMD_REG), &dataValue, 0x1));
			
			if (dataValue == 0)
				break;
		}

		if (cntPoll >= MAX_POLLING_ITERATIONS)
		{
			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("No Done indication for DDR Write External\n", dataValue));
			return GT_NOT_READY;
		}

    }
  /*  if (xsbInfo[devNum].isPipeEnableRequired ==  GT_FALSE)
    {
        ddr3TipPipeEnable(devNum, ACCESS_TYPE_UNICAST, interfaceId, GT_FALSE);
    }*/
    return GT_OK;
}

