/*******************************************************************************
*                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.
********************************************************************************
* mvHwsDdr3msys_ac3.c
*
* DESCRIPTION: DDR3 AC3 configuration
*
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 50 $
******************************************************************************/

#define DEFINE_GLOBALS
#include "mv_os.h"
#include "ddr3_msys_ac3.h"
#include "ddr3_msys_ac3_tip_training_static.h"
#include "ddr3_hws_sil_training.h"
#include "mvXor.h"

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

/************************** definitions ******************************/

#define AC3_NUM_BYTES                  (3)
#define AC3_NUMBER_OF_INTERFACES        5

#define AC3_PLL_REG(a,b,c)  ((a << 12) + (b << 8) + (c << 2))
#define R_MOD_W(writeData,readData,mask) ((writeData & mask)|(readData & (~mask)))

/************************** globals ******************************/

extern MV_BOOL ddr3IfEccEnabled(void);
extern GT_U32 maskTuneFunc;
extern GT_U32 delayEnable, ckDelay, caDelay;
extern GT_U32 firstActiveIf;
extern MV_HWS_DDR_FREQ initFreq;
extern GT_U8  debugTrainingAccess;
extern GT_U8  debugTrainingAc3;
extern MV_HWS_DDR_FREQ mediumFreq;
extern GT_U8 calibrationUpdateControl; /*2 external only, 1 is internal only*/
extern GT_U32 dfsLowFreq;
extern GT_U32 freqVal[];

GT_U32  pipeMulticastMask;

static GT_U8 Ac3BwPerFreq[DDR_FREQ_LIMIT] =
{
    0x3, /*DDR_FREQ_100*/
    0x4, /*DDR_FREQ_400*/
    0x4, /*DDR_FREQ_533*/
    0x5, /*DDR_FREQ_667*/
    0x5, /*DDR_FREQ_800*/
    0x5, /*DDR_FREQ_933*/
    0x5, /*DDR_FREQ_1066*/
    0x3, /*DDR_FREQ_311*/
    0x3, /*DDR_FREQ_333*/
    0x4,  /*DDR_FREQ_467*/
    0x5,  /*DDR_FREQ_850,*/
    0x5,  /*DDR_FREQ_600,*/
    0x3,  /*DDR_FREQ_300,*/
	0x5,  /*DDR_FREQ_900*/
	0x3  /*DDR_FREQ_360*/
};

static GT_U8 Ac3RatePerFreq[DDR_FREQ_LIMIT] =
{
/*TBD*/
    0x1, /*DDR_FREQ_100*/
    0x2, /*DDR_FREQ_400*/
    0x2, /*DDR_FREQ_533*/
    0x2, /*DDR_FREQ_667*/
    0x2, /*DDR_FREQ_800*/
    0x3, /*DDR_FREQ_933*/
    0x3, /*DDR_FREQ_1066*/
    0x1, /*DDR_FREQ_311*/
    0x1, /*DDR_FREQ_333*/
    0x2,  /*DDR_FREQ_467*/
    0x2,  /*DDR_FREQ_850,*/
    0x2,  /*DDR_FREQ_600,*/
    0x1,  /*DDR_FREQ_300,*/
	0x3,  /*DDR_FREQ_900*/
	0x1  /*DDR_FREQ_360*/
};

static GT_U16 Ac3VcoFreqPerSar[] =
{
	400,
	533,
	2000,
	800,
	2000,
	800,
	800,
	800
};

GT_U32 DQbitMap2Phypin[] =
{
    0,  1,  2,  3,  10,  7,  8,  9, //0
    0,  1,  2,  3,  10,  7,  8,  9,	//1
    0,  1,  2,  3,  10,  7,  8,  9,	//placeholder
    0,  1,  2,  3,  10,  7,  8,  9,	//placeholder
    0,  1,  2,  3,  10,  7,  8,  9,	//ECC
};

/************************** pre-declaration ******************************/

extern MV_STATUS ddr3SiliconGetDdrTargetFreq(MV_U32 *uiDdrFreq);

GT_STATUS ddr3TipAc3GetFreqConfig
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 freq,
	MV_HWS_TIP_FREQ_CONFIG_INFO		*freqConfigInfo
);

static GT_STATUS ddr3TipAc3SetDivider
(
	GT_U8							devNum,
	GT_U32                  		interfaceId,
    MV_HWS_DDR_FREQ                 freq
);

GT_STATUS ddr3Ac3UpdateTopologyMap
(
    GT_U32 devNum,
	MV_HWS_TOPOLOGY_MAP* topologyMap
);

GT_STATUS ddr3TipAc3GetInitFreq
(
    GT_STATUS       devNum,
    GT_U32          interfaceId,
    MV_HWS_DDR_FREQ *freq
);

GT_STATUS ddr3TipAc3GetMediumFreq
(
    GT_STATUS       devNum,
    MV_HWS_DDR_FREQ *freq
);

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

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

GT_STATUS ddr3TipAC3GetDeviceInfo
(
	GT_U8      devNum,
	MV_DDR3_DEVICE_INFO * infoPtr
);

GT_U8    ddr3TipClockMode( GT_U32 frequency );

/************************** Server Access ******************************/

GT_STATUS ddr3TipAc3ServerRegWrite
(
	GT_U32 devNum,
	GT_U32 regAddr,
	GT_U32 dataValue
)
{
#ifdef ASIC_SIMULATION
	return GT_OK;
#else
	return hwsServerRegSetFuncPtr(devNum, regAddr, dataValue);
#endif
}

GT_STATUS ddr3TipAc3ServerRegRead
(
	GT_U32 devNum,
	GT_U32 regAddr,
	GT_U32 *dataValue,
	GT_U32 regMask
)
{
#ifdef ASIC_SIMULATION
	*dataValue = 0;
	return GT_OK;
#else
	hwsServerRegGetFuncPtr(devNum, regAddr, dataValue);

	*dataValue  = *dataValue & regMask;
#endif
	return GT_OK;
}

/******************************************************************************
* Name:     ddr3TipAc3GetFreqConfig.
* Desc:
* Args:
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
GT_STATUS ddr3TipAc3GetFreqConfig
(
	GT_U8							devNum,
    MV_HWS_DDR_FREQ                 freq,
	MV_HWS_TIP_FREQ_CONFIG_INFO		*freqConfigInfo
)
{
    if (Ac3BwPerFreq[freq] == 0xff)
    {
        return GT_NOT_SUPPORTED;
    }

    if (freqConfigInfo == NULL)
    {
        return GT_BAD_PARAM;
    }

    freqConfigInfo->bwPerFreq = Ac3BwPerFreq[freq];
    freqConfigInfo->ratePerFreq = Ac3RatePerFreq[freq];
    freqConfigInfo->isSupported = GT_TRUE;

    return GT_OK;
}

/******************************************************************************
* Name:     ddr3TipAc3IFWrite.
* Desc:
* Args:
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipAc3IFWrite
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId,
    GT_U32                regAddr,
    GT_U32                dataValue,
    GT_U32                mask
)
{
	GT_U32 uiDataRead;
#ifdef WIN32
    //mvPrintf(DEBUG_LEVEL_TRACE,"ddr3DunitAccessWrite   0x%x: 0x%x (mask 0x%x)\n", regAddr, dataValue);
    return GT_OK;
#endif
    if (mask != MASK_ALL_BITS)
    {
        if (debugAc3 >= 2)
        {
            //mvPrintf("ddr3TipAc3IFWrite active interface = %d\n",interfaceId);
        }
        /*CHECK_STATUS(ddr3DunitAccessRead(devNum, ACCESS_TYPE_UNICAST,interfaceId, regAddr,  &uiDataRead, MASK_ALL_BITS));
        dataValue = (uiDataRead & (~mask)) | (dataValue & mask);*/
		CHECK_STATUS(ddr3TipAc3IFRead(devNum, ACCESS_TYPE_UNICAST,interfaceId, regAddr,  &uiDataRead, MASK_ALL_BITS));
        dataValue = (uiDataRead & (~mask)) | (dataValue & mask);
    }

    if (debugAc3 >= 1)
    {
       // mvPrintf("Dunit Write: interface %d  access %d Address 0x%x Data 0x%x\n", interfaceId, interfaceAccess, regAddr, dataValue);
    }

    MV_REG_WRITE(regAddr, dataValue);
	//mvPrintf("write: 0x%x = 0x%x\n",regAddr,dataValue);

    return GT_OK;
}

/******************************************************************************
* Name:     ddr3TipAc3IFRead.
* Desc:
* Args:
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipAc3IFRead
(
    GT_U8                 devNum,
    MV_HWS_ACCESS_TYPE    interfaceAccess,
    GT_U32                interfaceId,
    GT_U32                regAddr,
    GT_U32                *data,
    GT_U32                mask
)
{
#ifdef WIN32
    //mvPrintf("ddr3DunitAccessRead   0x%x: 0x%x (mask 0x%x)\n", regAddr, *data);
    return GT_OK;
#endif
	if (interfaceId !=0)
	{
		DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_ERROR, ("AC3 wrong interface ID %d\n", interfaceId));
		return GT_FAIL;
	}
	data[interfaceId] = MV_REG_READ(regAddr) & mask;
    //mvPrintf("Read: 0x%x = 0x%x\n",regAddr,*data);
	if (debugAc3 >= 2)
	{
		//mvPrintf("DunitRead   0x%x: 0x%x (mask 0x%x)\n",  regAddr,  *data, mask);
	}

    return GT_OK;
}

/******************************************************************************
* Name:     ddr3TipAc3SelectDdrController.
* 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    ddr3TipAc3SelectDdrController
(
    GT_U8    devNum,
    GT_BOOL  enable
)
{
    GT_U32 uiReg;
	//mvPrintf("ddr3TipAc3SelectDdrController\n");
	uiReg = MV_REG_READ(CS_ENABLE_REG);

    if (enable)
    {
    uiReg |= (1 << 6);
    }
    else
    {
	uiReg &= ~(1 << 6);
    }
	MV_REG_WRITE(CS_ENABLE_REG, uiReg);
	//mvPrintf("write: 0x%x = 0x%x\n",CS_ENABLE_REG,uiReg);
    return GT_OK;
}

/******************************************************************************
* Name:     ddr3TipInitAc3Silicon.
* Desc:     init Training SW DB.
* Args:
* Notes:
* Returns:  GT_OK if success, other error code if fail.
*/
static GT_STATUS ddr3TipInitAc3Silicon
(
    GT_U32  devNum,
    GT_U32  boardId
)
{
	GT_U32 interfaceId = 0;
	MV_HWS_TIP_STATIC_CONFIG_INFO staticConfig;
    MV_HWS_TIP_CONFIG_FUNC_DB configFunc;
	MV_HWS_DDR_FREQ uiDdrFreq;
	MV_STATUS status;
	MV_HWS_TOPOLOGY_MAP* topologyMap = ddr3TipGetTopologyMap(devNum);
	GT_U8 numOfBusPerInterface = 5;

    GT_U32 boardOffset = boardId * AC3_NUMBER_OF_INTERFACES *numOfBusPerInterface;

    /* new read leveling version */
    staticConfig.siliconDelay = Ac3SiliconDelayOffset[boardId];
    staticConfig.packageTraceArr = Ac3PackageRoundTripDelayArray;
    staticConfig.boardTraceArr = &Ac3BoardRoundTripDelayArray[boardOffset];

    configFunc.tipDunitReadFunc = ddr3TipAc3IFRead;
    configFunc.tipDunitWriteFunc = ddr3TipAc3IFWrite;
    configFunc.tipDunitMuxSelectFunc = ddr3TipAc3SelectDdrController;
    configFunc.tipGetFreqConfigInfoFunc = ddr3TipAc3GetFreqConfig;
	configFunc.tipSetFreqDividerFunc = ddr3TipAc3SetDivider;
	configFunc.tipGetDeviceInfoFunc = ddr3TipAC3GetDeviceInfo;
	configFunc.tipGetTemperature = NULL;
	configFunc.tipGetClockRatio = ddr3TipClockMode;

    mvHwsDdr3TipInitConfigFunc(devNum, &configFunc);

	ddr3TipRegisterDqTable(devNum, DQbitMap2Phypin);

	/*Set device attributes*/
	ddr3TipDevAttrInit(devNum);
	ddr3TipDevAttrSet(devNum, MV_ATTR_TIP_REV, MV_TIP_REV_3);
	ddr3TipDevAttrSet(devNum, MV_ATTR_PHY_EDGE, MV_DDR_PHY_EDGE_NEGATIVE);
	ddr3TipDevAttrSet(devNum, MV_ATTR_OCTET_PER_INTERFACE, numOfBusPerInterface);
	ddr3TipDevAttrSet(devNum, MV_ATTR_INTERLEAVE_WA, GT_FALSE);

#ifdef STATIC_ALGO_SUPPORT
    ddr3TipInitStaticConfigDb(devNum, &staticConfig);
#endif
	status = ddr3TipAc3GetInitFreq(devNum, interfaceId, &uiDdrFreq);
	if (MV_OK != status) {
		DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_ERROR, ("DDR3 silicon get target frequency - FAILED 0x%x\n", status));
		return status;
	}

    maskTuneFunc =     (SET_LOW_FREQ_MASK_BIT |
						LOAD_PATTERN_MASK_BIT |
						SET_MEDIUM_FREQ_MASK_BIT |
						WRITE_LEVELING_MASK_BIT |
						WRITE_LEVELING_SUPP_MASK_BIT |
						READ_LEVELING_MASK_BIT |
						PBS_RX_MASK_BIT |
						PBS_TX_MASK_BIT |
						SET_TARGET_FREQ_MASK_BIT |
						WRITE_LEVELING_TF_MASK_BIT |
						WRITE_LEVELING_SUPP_TF_MASK_BIT |
                      	READ_LEVELING_TF_MASK_BIT |
						CENTRALIZATION_RX_MASK_BIT |
						CENTRALIZATION_TX_MASK_BIT
 						);

	/*Supplementary not supported for ECC modes*/
	if( MV_TRUE == ddr3IfEccEnabled()){
		maskTuneFunc &=	~WRITE_LEVELING_SUPP_TF_MASK_BIT;
		maskTuneFunc &=	~WRITE_LEVELING_SUPP_MASK_BIT;
	}

	if( ckDelay == MV_PARAMS_UNDEFINED )
		ckDelay = 200;
	delayEnable = 1;
	caDelay = 0;
	calibrationUpdateControl = 1;
	freqVal[DDR_FREQ_LOW_FREQ] = dfsLowFreq = 130;

	initFreq = topologyMap->interfaceParams[interfaceId].memoryFreq;

    ddr3TipAc3GetMediumFreq(devNum, &mediumFreq);
    return GT_OK;
}

GT_STATUS ddr3Ac3UpdateTopologyMap(GT_U32 devNum, MV_HWS_TOPOLOGY_MAP* topologyMap)
{
    GT_U32 interfaceId = 0; /* only 1 interface in AC3 */
    MV_HWS_DDR_FREQ freq;

	/* read S@R frequency configuration */
	ddr3TipAc3GetInitFreq(devNum, interfaceId, &freq);

	topologyMap->interfaceParams[interfaceId].memoryFreq = freq;

	/* re-calc topology parameters according to topology updates (if needed) */
	CHECK_STATUS(mvHwsDdr3TipLoadTopologyMap(devNum, topologyMap));

    return GT_OK;
}

GT_STATUS ddr3TipInitAc3
(
    GT_U32  devNum,
    GT_U32  boardId
)
{
	MV_HWS_TOPOLOGY_MAP* topologyMap = ddr3TipGetTopologyMap(devNum);

	if(NULL == topologyMap)
		return GT_FAIL;

	ddr3Ac3UpdateTopologyMap(devNum, topologyMap);

    ddr3TipInitAc3Silicon(devNum, boardId);
    return GT_OK;
}

GT_STATUS ddr3TipAc3GetInitFreq
(
    GT_STATUS       devNum,
	GT_U32			interfaceId,
    MV_HWS_DDR_FREQ *freq
)
{
	GT_U32 data;

    /* calc SAR */
    CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum, REG_DEVICE_SAR1_ADDR,  &data, MASK_ALL_BITS ));
    data = (data >> PLL1_CNFIG_OFFSET) & PLL1_CNFIG_MASK;

    switch(data)
    {
        case 0:
		case 5:
			DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_TRACE, ("MSYS_AC3 DDR_FREQ_400\n"));
            *freq = DDR_FREQ_400;
            break;
        case 1:
			DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_TRACE, ("MSYS_AC3 DDR_FREQ_533\n"));
            *freq = DDR_FREQ_533;
            break;
        case 2:
			DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_TRACE, ("MSYS_AC3 DDR_FREQ_667\n"));
            *freq = DDR_FREQ_667;
            break;
        case 3:
			DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_TRACE, ("MSYS_AC3 DDR_FREQ_800\n"));
            *freq = DDR_FREQ_800;
            break;
        default:
            DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_INFO, ("Freq_AC3 SAR Unknown\n"));
            *freq = DDR_FREQ_LIMIT;
            return GT_BAD_PARAM;
    }
    return GT_OK;
}

GT_STATUS ddr3TipAc3GetMediumFreq
(
    GT_STATUS       devNum,
    MV_HWS_DDR_FREQ *freq
)
{
	/*TODO allow to user configure sync/async mode and minimum allowed mid freq*/
	/*PBS was disabled, so midFreq 533 disabled also
		to not work with TF 533 in ASYNC mode - this implies on performance*/
    *freq = DDR_FREQ_400;
    return GT_OK;
}

GT_U32 ddr3TipGetInitFreq()
{
	GT_U8			devNum = 0;
    GT_U32          interfaceId = 0;
	MV_HWS_DDR_FREQ freq;

	ddr3TipAc3GetInitFreq(devNum, interfaceId, &freq);

	return freq;
}

static GT_STATUS ddr3TipAc3SetDivider
(
	GT_U8							devNum,
	GT_U32                  		interfaceId,
    MV_HWS_DDR_FREQ                 frequency
)
{
	GT_U32 divider = 0;
	GT_U32 divRatio = 0;
    GT_U32 sarVal;
	GT_U32 data = 0;
	GT_U32 select = 0;
	GT_U8 value;
	MV_HWS_TOPOLOGY_MAP* topologyMap = ddr3TipGetTopologyMap(devNum);

	/* Dunit training clock + 1:1/2:1 mode */
	divRatio = (ddr3TipClockMode(frequency) << 30);
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8294,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8294,  R_MOD_W(divRatio, data, (0x3 << 30))));

	/* Configure Dunit to 1:1 in case of DLL off mode else 2:1*/
	value = (ddr3TipClockMode(frequency) == 1)? 0 : 1;
	CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, interfaceId, 0x1524, (value << 15), (1 << 15)));

	select = (frequency == topologyMap->interfaceParams[firstActiveIf].memoryFreq)?(0 << 29) : (1 << 29);//TF is the function mode so the selector have to be 0.
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8294,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8294,  R_MOD_W(select, data, (0x1 << 29))));
	/* get VCO freq index */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum, REG_DEVICE_SAR1_ADDR,  &data, MASK_ALL_BITS ));
	sarVal = (data >> PLL1_CNFIG_OFFSET) & PLL1_CNFIG_MASK;

    divider = Ac3VcoFreqPerSar[sarVal]/freqVal[frequency];
    DEBUG_TRAINING_ACCESS(DEBUG_LEVEL_INFO, ("SAR value %d divider %d\n", sarVal, divider));

	/* cpupll_clkdiv_reset_mask */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8260,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8260,  R_MOD_W(0x2, data, 0x2)));

	/* cpupll_clkdiv_reload_smooth */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF825C,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF825C,  R_MOD_W((0x2 << 22), data, (0xFF << 22))));

	/* cpupll_clkdiv_relax_en */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF825C,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF825C,  R_MOD_W((0x2 << 14), data, (0xFF << 14))));

	/* write the divider */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8264,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8264,  R_MOD_W((divider << 12), data, (0x3F << 12))));

	/* set cpupll_clkdiv_reload_ratio */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8270,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8270,  R_MOD_W((1 << 10), data, (1 << 10))));

	/* undet cpupll_clkdiv_reload_ratio */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8270,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8270,  R_MOD_W(0x0, data, (1 << 10))));

	/* clear cpupll_clkdiv_reload_force */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8268,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8268,  R_MOD_W(0x0, data, (0xFF << 21))));

	/* clear cpupll_clkdiv_relax_en */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF825C,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF825C,  R_MOD_W(0x0, data, (0xFF << 14))));
	/* clear cpupll_clkdiv_reload_smooth */
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF825C,  R_MOD_W(0x0, data, (0xFF << 22))));

	/* clear cpupll_clkdiv_reset_mask */
	CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8260,  &data, MASK_ALL_BITS ));
	CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8260,  R_MOD_W(0x0, data, 0x2 )));

	return GT_OK;
}

/******************************************************************************
* return 1 of core/DUNIT clock ration is 1 for given freq, 0 if clock ratios is 2:1
*/
GT_U8    ddr3TipClockMode( GT_U32 frequency )
{
	if(frequency == DDR_FREQ_LOW_FREQ){
		return 1;
	}
	else{
		return 2;
	}
}

/******************************************************************************
* external read from memory
*/
GT_STATUS    ddr3TipExtRead
(
    GT_U32      devNum,
    GT_U32      interfaceId,
    GT_U32      regAddr,
    GT_U32      numOfBursts,
    GT_U32      *data
)
{
    GT_U32 burstNum;

    for(burstNum=0 ; burstNum < numOfBursts*8; burstNum++)
    {
		data[burstNum] = * (volatile unsigned int *) (regAddr + 4* burstNum);
    }

    return GT_OK;
}

/******************************************************************************
* external write to memory
*/
GT_STATUS    ddr3TipExtWrite
(
    GT_U32      devNum,
    GT_U32      interfaceId,
    GT_U32      regAddr,
    GT_U32      numOfBursts,
    GT_U32      *data
)
{
    GT_U32 burstNum;

    for(burstNum=0 ; burstNum < numOfBursts*8; burstNum++)
    {
		*(volatile unsigned int *) (regAddr+4*burstNum) = data[burstNum];
    }

    return GT_OK;
}

GT_STATUS ddr3TipAC3GetDeviceInfo ( GT_U8      devNum,
									MV_DDR3_DEVICE_INFO * infoPtr)
{
	infoPtr->deviceId = 0xF400;
	infoPtr->ckDelay = ckDelay;

	return GT_OK;
}


