/*******************************************************************************
*                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 rlVersion;
extern GT_U32 delayEnable, ckDelay, ckDelay_16, 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*/

GT_U32  pipeMulticastMask;

static GT_U16 freqVal[DDR_FREQ_LIMIT] =
{
    130, /*DDR_FREQ_LOW_FREQ*/
    400, /*DDR_FREQ_400,*/
    533, /*DDR_FREQ_533,*/
    666, /*DDR_FREQ_667,*/
    800, /*DDR_FREQ_800,*/
    933, /*DDR_FREQ_933,*/
   1066, /*DDR_FREQ_1066,*/
    311, /*DDR_FREQ_311,*/
    333, /*DDR_FREQ_333,*/
    467,  /*DDR_FREQ_467,*/
    850,  /*DDR_FREQ_850,*/
    600,  /*DDR_FREQ_600,*/
    300,  /*DDR_FREQ_300,*/
	900,  /*DDR_FREQ_900*/
	360  /*DDR_FREQ_360*/
};

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
);
/************************** 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_U32 boardOffset = boardId * AC3_NUMBER_OF_INTERFACES *topologyMap->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;

    mvHwsDdr3TipInitConfigFunc(devNum, &configFunc);

	ddr3TipRegisterDqTable(devNum, DQbitMap2Phypin);

#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;
	}

    rlVersion = 1;

    maskTuneFunc =     (SET_MEDIUM_FREQ_MASK_BIT |
						WRITE_LEVELING_MASK_BIT |
						WRITE_LEVELING_SUPP_MASK_BIT |
						LOAD_PATTERN_2_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 == -1 )
		ckDelay_16 = 200;
	if( ckDelay == -1 )
		ckDelay = 200;
	delayEnable = 1;
	caDelay = 0;
	calibrationUpdateControl = 1;

	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;
	MV_HWS_TOPOLOGY_MAP* topologyMap = ddr3TipGetTopologyMap(devNum);

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

		CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0x1524,  &data, MASK_ALL_BITS ));
		CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0x1524,  R_MOD_W((0 << 15), data, (0 << 15) )));
	}
	else {
		divRatio = (2 << 30);
		CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0xF8294,  &data, MASK_ALL_BITS ));
		CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0xF8294,  R_MOD_W(divRatio, data, (0x3 << 30))));

		CHECK_STATUS(ddr3TipAc3ServerRegRead(devNum,  0x1524,  &data, MASK_ALL_BITS ));
		CHECK_STATUS(ddr3TipAc3ServerRegWrite(devNum, 0x1524,  R_MOD_W((1 << 15), data, (0 << 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;
}

/******************************************************************************
* 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;
}


