/*******************************************************************************
*                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.
********************************************************************************
* mvHwsTrainingIpDdr3Training.c
*
* DESCRIPTION: DDR3 training IP configuration
*
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 204 $
******************************************************************************/

#include "mvDdr3TrainingIp.h"
#include "mvDdr3TrainingIpFlow.h"
#include "mvDdr3TrainingIpEngine.h"
#include "mvDdr3TrainingIpPbs.h"
#include "mvDdr3TrainingIpCentralization.h"
#include "mvDdr3TrainingIpStatic.h"
#include "mvDdr3TrainingHwAlgo.h"
#include "mvDdr3TrainingLeveling.h"
#include "mvDdr3TrainingIpPrvIf.h"
#include "mvDdr3LoggingDef.h"
#include "mvDdrTrainingIpDb.h"


#ifdef DDR_VIEWER_TOOL
GT_STATUS printAdll(GT_U32 devNum, GT_U32 adll[MAX_INTERFACE_NUM*MAX_BUS_NUM]);
GT_STATUS printPh(GT_U32 devNum, GT_U32 adll[MAX_INTERFACE_NUM*MAX_BUS_NUM]);

GT_U8 sweepPatternIndexStart = PATTERN_KILLER_DQ0, sweepPatternIndexEnd = PATTERN_LIMIT;
static char* ConvertFreq(MV_HWS_DDR_FREQ freq);
#if defined(EXCLUDE_SWITCH_DEBUG)
extern MV_HWS_PATTERN sweepPattern;
GT_U32 ctrlSweepres[ADLL_LENGTH][MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U32 ctrlADLL[MAX_CS_NUM*MAX_INTERFACE_NUM*MAX_BUS_NUM];
GT_U32 ctrlADLL1[MAX_CS_NUM*MAX_INTERFACE_NUM*MAX_BUS_NUM];
GT_U32 ctrlLevelPhase[MAX_CS_NUM*MAX_INTERFACE_NUM*MAX_BUS_NUM];
#endif
#endif

extern GT_U32 ckDelay;
extern GT_U32 dminPhyRegTable[MAX_BUS_NUM*MAX_CS_NUM][2];

extern GT_STATUS ddr3TipRestoreDunitRegs
(
    GT_U32               devNum
);
GT_U8 	isRegDump = 0;
GT_U32  debugPbs = DEBUG_LEVEL_ERROR;
/*****************************************************************************
API to change flags outside of the lib
******************************************************************************/
#ifndef SILENT_LIB
/*Debug flags for other Training modules*/
GT_U8  debugTrainingStatic = DEBUG_LEVEL_ERROR;
GT_U8  debugTraining = DEBUG_LEVEL_ERROR;
GT_U8  debugLeveling = DEBUG_LEVEL_ERROR;
GT_U8  debugCentralization = DEBUG_LEVEL_ERROR;
GT_U8  debugTrainingIp = DEBUG_LEVEL_ERROR;
GT_U8  debugTrainingBist = DEBUG_LEVEL_ERROR;
GT_U8  debugTrainingHwAlg = DEBUG_LEVEL_ERROR;
GT_U8  debugTrainingAccess = DEBUG_LEVEL_ERROR;
GT_U8  debugTrainingA38x = DEBUG_LEVEL_ERROR;
#ifdef CONFIG_DDR4
GT_U8  debugTapTuning = DEBUG_LEVEL_ERROR;
GT_U8  debugCalibration = DEBUG_LEVEL_ERROR;
GT_U8  debugDdr4Centralization = DEBUG_LEVEL_ERROR;
#endif

void printTopology(MV_HWS_TOPOLOGY_MAP *pTopologyDB);

GT_VOID ddr3HwsSetLogLevel(
	MV_DDR_LIB_DEBUG_BLOCK 	block,
	GT_U8					level
)
{
	switch(block){
	case MV_DEBUG_BLOCK_STATIC:
		debugTrainingStatic = level;
		break;
    case MV_DEBUG_BLOCK_TRAINING_MAIN:
		debugTraining = level;
		break;
    case MV_DEBUG_BLOCK_LEVELING:
		debugLeveling = level;
		break;
    case MV_DEBUG_BLOCK_CENTRALIZATION:
		debugCentralization = level;
		break;
    case MV_DEBUG_BLOCK_PBS:
		debugPbs = level;
		break;
    case MV_DEBUG_BLOCK_ALG:
		debugTrainingHwAlg = level;
		break;
    case MV_DEBUG_BLOCK_DEVICE:
		debugTrainingA38x = level;
		break;
    case MV_DEBUG_BLOCK_ACCESS:
		debugTrainingAccess = level;
		break;
    case MV_DEBUG_STAGES_REG_DUMP:
		if( level == DEBUG_LEVEL_TRACE)
			isRegDump = 1;
		else
			isRegDump = 0;
		break;
#ifdef CONFIG_DDR4
	case MV_DEBUG_TAP_TUNING:
		debugTapTuning = level;
		break;
    case MV_DEBUG_BLOCK_CALIBRATION:
        debugCalibration = level;
        break;
    case MV_DEBUG_BLOCK_DDR4_CENTRALIZATION:
        debugDdr4Centralization = level;
        break;
#endif
    case MV_DEBUG_BLOCK_ALL:
	default:
		debugTrainingStatic = level;
		debugTraining = level;
		debugLeveling = level;
		debugCentralization = level;
		debugPbs = level;
		debugTrainingHwAlg = level;
		debugTrainingAccess = level;
		debugTrainingA38x = level;
#ifdef CONFIG_DDR4
		debugTapTuning = level;
        debugCalibration = level;
        debugDdr4Centralization = level;
#endif
	}
}
#else
GT_VOID ddr3HwsSetLogLevel(
	MV_DDR_LIB_DEBUG_BLOCK 	block,
	GT_U8					level
)
{
	return;
}
#endif

extern MV_HWS_TOPOLOGY_MAP *topologyMap;
extern MV_HWS_RESULT trainingResult[MAX_STAGE_LIMIT][MAX_INTERFACE_NUM];
extern GT_U32 firstActiveIf;
extern GT_U32 maskTuneFunc;
extern GT_U32 freqVal[];
MV_HWS_TIP_CONFIG_FUNC_DB configFuncInfo[HWS_MAX_DEVICE_NUM];
GT_U8 isDefaultCentralization = 0 , isTuneResult = 0, isValidateWindowPerIf = 0, isValidateWindowPerPup = 0, sweepCnt = 1, isBistResetBit = 1, isRunLevelingSweepTests = 0;
static MV_HWS_XSB_INFO xsbInfo[HWS_MAX_DEVICE_NUM];


/*****************************************************************************
Dump Dunit & Phy registers
******************************************************************************/
GT_STATUS ddr3TipRegDump
(
    GT_U32 devNum
)
{
    GT_U32 interfaceId, regAddr, dataValue, busId;
	GT_U32 readData[MAX_INTERFACE_NUM];
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);
    mvPrintf("-- dunit registers --\n");
    for(regAddr = 0x1400; regAddr < 0x19F0; regAddr+=4)
    {
        mvPrintf("0x%x ",regAddr);
        for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
    	    CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, regAddr,  readData,  MASK_ALL_BITS));
            mvPrintf("0x%x ",  readData[interfaceId]);
       }
       mvPrintf("\n");
    }
    mvPrintf("-- Phy registers --\n");

    for(regAddr = 0; regAddr <= 0xFF; regAddr++)
    {
        mvPrintf("0x%x ",regAddr);
        for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
            for(busId = 0; busId < octetsPerInterfaceNum; busId++)
            {
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
				CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId, ACCESS_TYPE_UNICAST, busId,  DDR_PHY_DATA,  regAddr, &dataValue));
                mvPrintf("0x%x ",  dataValue);
            }
            for(busId = 0; busId < octetsPerInterfaceNum; busId++)
            {
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
                CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId, ACCESS_TYPE_UNICAST, busId,  DDR_PHY_CONTROL,  regAddr, &dataValue));
                mvPrintf("0x%x ",  dataValue);
            }
       }
       mvPrintf("\n");
    }

	return GT_OK;
}

/*****************************************************************************
Register access func registration
******************************************************************************/
GT_STATUS mvHwsDdr3TipInitConfigFunc
(
	GT_U32						devNum, 
	MV_HWS_TIP_CONFIG_FUNC_DB	*configFunc
)
{
    if (configFunc == NULL)
    {
        return GT_BAD_PARAM;
    }
    osMemCpy(&configFuncInfo[devNum], configFunc, sizeof(MV_HWS_TIP_CONFIG_FUNC_DB));
   
    return GT_OK;
}

/*****************************************************************************
Read training result table
******************************************************************************/
GT_STATUS    mvHwsDdr3TipReadTrainingResult
(
    GT_U32          devNum,
    MV_HWS_RESULT   result[MAX_STAGE_LIMIT][MAX_INTERFACE_NUM]
)
{
   devNum = devNum;

   if (result == NULL)
   {
       return GT_BAD_PARAM;
   }
   osMemCpy(result, trainingResult, sizeof(result));
   return GT_OK;
}


/*****************************************************************************
Get training result info pointer
******************************************************************************/
MV_HWS_RESULT* ddr3TipGetResultPtr
(
    GT_U32 stage
)
{
    return trainingResult[stage];
}

/*****************************************************************************
Device info read
******************************************************************************/
GT_STATUS    ddr3TipGetDeviceInfo
(
    GT_U32                devNum,
    MV_DDR3_DEVICE_INFO * infoPtr
)
{
    if (configFuncInfo[devNum].tipGetDeviceInfoFunc != NULL)
    {
        return configFuncInfo[devNum].tipGetDeviceInfoFunc((GT_U8)devNum, infoPtr);
    }
    return GT_FAIL;
}


#ifdef DDR_VIEWER_TOOL
/*****************************************************************************
Convert freq to character string
******************************************************************************/
static char* ConvertFreq(MV_HWS_DDR_FREQ freq)
{
  switch (freq)
    {
        case DDR_FREQ_LOW_FREQ:
            return "DDR_FREQ_LOW_FREQ";
#ifdef CONFIG_DDR3
        case DDR_FREQ_400:
            return "400";

        case DDR_FREQ_533:
            return "533";
#endif
        case DDR_FREQ_667:
            return "667";

        case DDR_FREQ_800:
            return "800";

        case DDR_FREQ_933:
            return "933";

        case DDR_FREQ_1066:
            return "1066";
#ifdef CONFIG_DDR3
        case DDR_FREQ_311:
            return "311";

        case DDR_FREQ_333:
            return "333";

        case DDR_FREQ_467:
            return "467";

        case DDR_FREQ_850:
            return "850";

        case DDR_FREQ_900:
            return "900";

        case DDR_FREQ_360:
            return "DDR_FREQ_360";

        case DDR_FREQ_1000:
            return "DDR_FREQ_1000";
#endif
        default:
            return "Unknown Frequency";

  }
}
/*****************************************************************************
Convert device ID to character string
******************************************************************************/
static char* ConvertDevId(GT_U32 devId)
{
  switch (devId)
    {
        case 0x6800:
            return "A38xx";
        case 0x6900:
            return "A39XX";
		case 0xF400:
            return "AC3";
	   case 0xFC00:
            return "BC2";

        default:
            return "Unknown Device";

  }
}
/*****************************************************************************
Convert device ID to character string
******************************************************************************/
static char* ConvertMemSize (GT_U32 devId)
{
  switch (devId)
    {
        case 0:
            return "512 MB";
        case 1:
            return "1 GB";
		case 2:
            return "2 GB";
	   case  3:
            return "4 GB";
	   case  4:
            return "8 GB";

        default:
            return "wrong mem size";

  }
}

GT_STATUS printDeviceInfo( GT_U8     devNum)
{
	MV_DDR3_DEVICE_INFO infoPtr;
	MV_HWS_TOPOLOGY_MAP* topologyMap = ddr3TipGetTopologyMap(devNum);

	CHECK_STATUS(ddr3TipGetDeviceInfo (devNum,&infoPtr));
	mvPrintf("=== DDR setup START===\n");
	mvPrintf("\tDevice ID: %s\n" ,ConvertDevId(infoPtr.deviceId));
	mvPrintf("\tDDR3  CK delay: %d\n",infoPtr.ckDelay);
	printTopology(topologyMap);
	mvPrintf("=== DDR setup END===\n");
	return GT_OK;
}
void mvHwsDdr3TipSweepTest(GT_BOOL enable)
{
	if (enable){
		isValidateWindowPerIf = 1;
		isValidateWindowPerPup = 1;
		debugTraining = DEBUG_LEVEL_TRACE;
	}
	else{
		isValidateWindowPerIf = 0;
		isValidateWindowPerPup = 0;
	}
}
#endif

char* ddr3TipConvertTuneResult(MV_HWS_RESULT TuneResult)
{
	switch(TuneResult)
	{
	case TEST_FAILED:
		return "FAILED";
	case TEST_SUCCESS:
		return "PASS";
	case NO_TEST_DONE:
		return "NOT COMPLETED";
	default:
		return "Un-KNOWN";
	}
}

/*****************************************************************************
Print log info
******************************************************************************/
GT_STATUS ddr3TipPrintLog(GT_U32 devNum, GT_U32 memAddr)
{
    GT_U32 interfaceId = 0;

    memAddr = memAddr; /* avoid warnings */

#ifndef DDR_VIEWER_TOOL
    devNum = devNum; /* avoid warnings */
#else
    if (( isValidateWindowPerIf != 0) || ( isValidateWindowPerPup != 0))

    {
    	GT_U32 isPupLog = 0;
		MV_HWS_DDR_FREQ freq;

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

        isPupLog = (isValidateWindowPerPup != 0) ? 1:0;
		mvPrintf("===VALIDATE WINDOW LOG START===\n");
		mvPrintf("DDR Frequency: %s   ======\n",ConvertFreq(freq));
        /* print sweep windows */
        ddr3TipRunSweepTest(devNum, sweepCnt, 1 , isPupLog);
        ddr3TipRunSweepTest(devNum, sweepCnt, 0 , isPupLog);

#if defined(EXCLUDE_SWITCH_DEBUG)
		if( isRunLevelingSweepTests == 1 ){
			ddr3TipRunLevelingSweepTest(devNum, sweepCnt, 0 , isPupLog);
			ddr3TipRunLevelingSweepTest(devNum, sweepCnt, 1 , isPupLog);
		}
#endif
		ddr3TipPrintAllPbsResult(devNum);
		ddr3TipPrintWLSuppResult(devNum);
		mvPrintf("===VALIDATE WINDOW LOG END ===\n");
		CHECK_STATUS(ddr3TipRestoreDunitRegs(devNum));
		ddr3TipRegDump(devNum);
    }
#endif

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)

		DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("IF %d Status:\n", interfaceId));

        if  (maskTuneFunc & INIT_CONTROLLER_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tInit Controller: %s\n", ddr3TipConvertTuneResult(trainingResult[INIT_CONTROLLER][interfaceId])));
        }
        if  (maskTuneFunc & SET_LOW_FREQ_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tLow freq Config: %s\n", ddr3TipConvertTuneResult(trainingResult[SET_LOW_FREQ][interfaceId])));
        }
        if  (maskTuneFunc & LOAD_PATTERN_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tLoad Pattern: %s\n", ddr3TipConvertTuneResult(trainingResult[LOAD_PATTERN][interfaceId])));
        }
        if  (maskTuneFunc & SET_MEDIUM_FREQ_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tMedium freq Config: %s\n", ddr3TipConvertTuneResult(trainingResult[SET_MEDIUM_FREQ][interfaceId])));
        }
        if  (maskTuneFunc & WRITE_LEVELING_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tWL: %s\n", ddr3TipConvertTuneResult(trainingResult[WRITE_LEVELING][interfaceId])));
        }
        if  (maskTuneFunc & LOAD_PATTERN_2_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tLoad Pattern: %s\n", ddr3TipConvertTuneResult(trainingResult[LOAD_PATTERN_2][interfaceId])));
        }
        if  (maskTuneFunc & READ_LEVELING_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tRL: %s\n", ddr3TipConvertTuneResult(trainingResult[READ_LEVELING][interfaceId])));
        }
        if  (maskTuneFunc & WRITE_LEVELING_SUPP_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tWL Supp: %s\n", ddr3TipConvertTuneResult(trainingResult[WRITE_LEVELING_SUPP][interfaceId])));
        }
        if  (maskTuneFunc & PBS_RX_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tPBS RX: %s\n", ddr3TipConvertTuneResult(trainingResult[PBS_RX][interfaceId])));
        }
        if  (maskTuneFunc & PBS_TX_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tPBS TX: %s\n", ddr3TipConvertTuneResult(trainingResult[PBS_TX][interfaceId])));
        }
		if  (maskTuneFunc & SET_TARGET_FREQ_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tTarget freq Config: %s\n", ddr3TipConvertTuneResult(trainingResult[SET_TARGET_FREQ][interfaceId])));
        }
        if  (maskTuneFunc & WRITE_LEVELING_TF_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tWL TF: %s\n", ddr3TipConvertTuneResult(trainingResult[WRITE_LEVELING_TF][interfaceId])));
        }
#ifdef CONFIG_DDR3
        if  (maskTuneFunc & READ_LEVELING_TF_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tRL TF: %s\n", ddr3TipConvertTuneResult(trainingResult[READ_LEVELING_TF][interfaceId])));
        }
#endif
        if  (maskTuneFunc & WRITE_LEVELING_SUPP_TF_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tWL TF Supp: %s\n", ddr3TipConvertTuneResult(trainingResult[WRITE_LEVELING_SUPP_TF][interfaceId])));
        }
        if  (maskTuneFunc & CENTRALIZATION_RX_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tCentr RX: %s\n", ddr3TipConvertTuneResult(trainingResult[CENTRALIZATION_RX][interfaceId])));
        }
        if  (maskTuneFunc & VREF_CALIBRATION_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tVREF_CALIBRATION: %s\n", ddr3TipConvertTuneResult(trainingResult[VREF_CALIBRATION][interfaceId])));
        }
        if  (maskTuneFunc & CENTRALIZATION_TX_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tCentr TX: %s\n", ddr3TipConvertTuneResult(trainingResult[CENTRALIZATION_TX][interfaceId])));
        }
#ifdef CONFIG_DDR4
        if  (maskTuneFunc & SW_READ_LEVELING_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tSW RL TF: %s\n", ddr3TipConvertTuneResult(trainingResult[SW_READ_LEVELING][interfaceId])));
        }
        if  (maskTuneFunc & RECEIVER_CALIBRATION_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tRX CAL: %s\n", ddr3TipConvertTuneResult(trainingResult[RECEIVER_CALIBRATION][interfaceId])));
        }
        if  (maskTuneFunc & WL_PHASE_CORRECTION_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tWL PHASE CORRECT: %s\n", ddr3TipConvertTuneResult(trainingResult[WL_PHASE_CORRECTION][interfaceId])));
        }
        if  (maskTuneFunc & DQ_VREF_CALIBRATION_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tDQ VREF CAL: %s\n", ddr3TipConvertTuneResult(trainingResult[DQ_VREF_CALIBRATION][interfaceId])));
        }
        if  (maskTuneFunc & DQ_MAPPING_MASK_BIT)
        {
            DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\tDQ MAP: %s\n", ddr3TipConvertTuneResult(trainingResult[DQ_MAPPING][interfaceId])));
        }
#endif
   }
    return GT_OK;
}
#ifndef MV_HWS_EXCLUDE_DEBUG_PRINTS
/*****************************************************************************
Print stability log info
******************************************************************************/
GT_STATUS	ddr3TipPrintStabilityLog(GT_U32 devNum)
{
	GT_U8 interfaceId=0,csindex = 0,busId=0,padIndex=0;
	/*GT_U8 frequency = topologyMap->interfaceParams[firstActiveIf].memoryFreq;
	GT_U8 adllTap =  MEGA/(freqVal[frequency]*64);
	GT_U32 Ph = adllTap*32;
	GT_U32 CC = Ph*2;*/
	GT_U32 regData;
#ifdef CONFIG_DDR4
	GT_U32 regData1;
#endif
	GT_U32 readData[MAX_INTERFACE_NUM];
	GT_U32 max_cs = mvHwsDdr3TipMaxCSGet(devNum);

	/*Title print*/
	for(interfaceId = 0; interfaceId < MAX_INTERFACE_NUM; interfaceId++)
	{
		VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		mvPrintf("Title: I/F# , Tj,CalibrationN0,CalibrationP0,CalibrationN1,CalibrationP1,CalibrationN2,CalibrationP2,");
		for(csindex = 0; csindex < max_cs; csindex++)
		{
			mvPrintf("CS%d , ",csindex);
				mvPrintf("\n");
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
				#ifdef CONFIG_DDR3/*DDR3*/
					mvPrintf("VWTx,VWRx,WL_tot,WL_ADLL,WL_PH,RL_Tot,RL_ADLL,RL_PH,RL_Smp,CenTx,CenRx,Vref,DQVref,");
				#else/*DDR4*/
					mvPrintf("DminTx,AreaTx,DminRx,AreaRx,WL_tot,WL_ADLL,WL_PH,RL_Tot,RL_ADLL,RL_PH,RL_Smp,CenTx,CenRx,Vref,DQVref,");
				#endif
				#ifdef CONFIG_DDR3
				#else
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvPrintf("DC-Pad%d,",padIndex);
				}
				#endif
				mvPrintf("\t\t");
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvPrintf("PBSTx-Pad%d,",padIndex);
				}
				mvPrintf("\t\t");
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvPrintf("PBSRx-Pad%d,",padIndex);
				}
		}
	}
	mvPrintf("\n");

	/*Data print*/
	for(interfaceId = 0; interfaceId < MAX_INTERFACE_NUM; interfaceId++)
	{
		VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)

		mvPrintf("Data: %d,%d,",interfaceId, (configFuncInfo[devNum].tipGetTemperature != NULL)?(configFuncInfo[devNum].tipGetTemperature((GT_U8)devNum)):(0));

		CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x14C8, readData, MASK_ALL_BITS));
		mvPrintf("%d,%d,",((readData[interfaceId]&0x3F0)>>4),((readData[interfaceId]&0xFC00)>>10));
		CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x17C8, readData, MASK_ALL_BITS));
		mvPrintf("%d,%d,",((readData[interfaceId]&0x3F0)>>4),((readData[interfaceId]&0xFC00)>>10));
		CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x1DC8, readData, MASK_ALL_BITS));
		mvPrintf("%d,%d,",((readData[interfaceId]&0x3F0000)>>16),((readData[interfaceId]&0xFC00000)>>22));

		for(csindex = 0; csindex < max_cs; csindex++)
		{
			mvPrintf("CS%d , ",csindex);
			for(busId = 0; busId < MAX_BUS_NUM; busId++)
			{
				mvPrintf("\n");
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
				#ifdef CONFIG_DDR3/*DDR3*/
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, RESULT_DB_PHY_REG_ADDR+csindex, &regData);
				mvPrintf("%d,%d,",(regData&0x1F),((regData&0x3E0)>>5));
				#else/*DDR4*/
				/*DminTx, areaTX*/
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, RESULT_DB_PHY_REG_ADDR+csindex, &regData);
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, dminPhyRegTable[csindex*5+busId][0], DDR_PHY_CONTROL, dminPhyRegTable[csindex*5+busId][1], &regData1);
				mvPrintf("%d,%d,",2*(regData1&0xFF),regData);
				/*DminRx, areaRX*/
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, RESULT_DB_PHY_REG_ADDR+csindex + 4, &regData);
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, dminPhyRegTable[csindex*5+busId][0], DDR_PHY_CONTROL, dminPhyRegTable[csindex*5+busId][1], &regData1);
				mvPrintf("%d,%d,",2*(regData1>>8),regData);
				#endif
				/*WL*/
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, WL_PHY_REG+csindex*4, &regData);
				mvPrintf("%d,%d,%d,",(regData&0x1F)+((regData&0x1C0)>>6)*32,(regData&0x1F),(regData&0x1C0)>>6);
				/*RL*/
				CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, READ_DATA_SAMPLE_DELAY, readData, MASK_ALL_BITS));
				readData[interfaceId] = (readData[interfaceId]&(0x1F<<(8*csindex))) >> (8*csindex);
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, RL_PHY_REG+csindex*4, &regData);
				mvPrintf("%d,%d,%d,%d,",(regData&0x1F)+((regData&0x1C0)>>6)*32 + readData[interfaceId]*64,(regData&0x1F),((regData&0x1C0)>>6),readData[interfaceId]);
				/*Centralization*/
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, WRITE_CENTRALIZATION_PHY_REG+csindex*4, &regData);
				mvPrintf("%d,",(regData&0x3F));
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, READ_CENTRALIZATION_PHY_REG+csindex*4, &regData);
				mvPrintf("%d,",(regData&0x1F));
				/*Vref */
				mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, PAD_CONFIG_PHY_REG, &regData);
				mvPrintf("%d,",(regData&0x7));
				/*DQVref*/
				/* Need to add the Read Function from device*/
				mvPrintf("%d,",0);
				#ifndef CONFIG_DDR3
				mvPrintf("\t\t");
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, 0xD0+12*csindex+padIndex, &regData);
					mvPrintf("%d,",(regData&0x3F));
				}
				#endif
				mvPrintf("\t\t");
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, 0x10+16*csindex+padIndex, &regData);
					mvPrintf("%d,",(regData&0x3F));
				}
				mvPrintf("\t\t");
				for(padIndex = 0; padIndex < 11; padIndex++)
				{
					mvHwsDdr3TipBUSRead(devNum, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, 0x50+16*csindex+padIndex, &regData);
					mvPrintf("%d,",(regData&0x3F));
				}
			}
		}
	}
	mvPrintf("\n");

	return GT_OK;
}

#endif
/*****************************************************************************
Register XSB information
******************************************************************************/
GT_STATUS ddr3TipRegisterXsbInfo
(
    GT_U32					devNum,
    MV_HWS_XSB_INFO         *xsbInfoTable
)
{
    osMemCpy(&xsbInfo[devNum], xsbInfoTable, sizeof(MV_HWS_XSB_INFO));
    return GT_OK;
}

/*****************************************************************************
Read ADLL Value
******************************************************************************/
GT_BOOL readAdllValue(GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr, GT_U32 mask)
{
    GT_U32  dataValue;
    GT_U32 interfaceId = 0, busId = 0;
    GT_U32 devNum = 0;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    /* multi CS support - regAddr is calucalated in calling function with CS offset */
    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	    for(busId = 0 ; busId < octetsPerInterfaceNum ; busId++)
	    {
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
                CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId, ACCESS_TYPE_UNICAST, busId,  DDR_PHY_DATA,  regAddr, &dataValue));
                PupValues[interfaceId*octetsPerInterfaceNum + busId] = dataValue & mask;
        }
	}

	return 0;
}

/*****************************************************************************
Write ADLL Value
******************************************************************************/
GT_BOOL writeAdllValue(GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr)
{
    GT_U32 interfaceId = 0, busId = 0;
    GT_U32 devNum = 0, data;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    /* multi CS support - regAddr is calucalated in calling function with CS offset */

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	    for(busId = 0 ; busId < octetsPerInterfaceNum ; busId++)
	    {
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
		data = PupValues[interfaceId*octetsPerInterfaceNum+busId];
		CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, regAddr, data));
	    }

    }
    return 0;
}


/*****************************************************************************
Read Phase Value
******************************************************************************/
GT_BOOL readPhaseValue(GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr, GT_U32 mask)
{
    GT_U32  dataValue;
    GT_U32 interfaceId = 0, busId = 0;
    GT_U32 devNum = 0;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    /* multi CS support - regAddr is calucalated in calling function with CS offset */
    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	    for(busId = 0 ; busId < octetsPerInterfaceNum ; busId++)
	    {
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
                CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId, ACCESS_TYPE_UNICAST, busId,  DDR_PHY_DATA,  regAddr, &dataValue));
                PupValues[interfaceId*octetsPerInterfaceNum + busId] = dataValue & mask;
        }
	}

	return 0;
}

/*****************************************************************************
Write Leveling Value
******************************************************************************/
GT_BOOL writeLevelingValue(GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], GT_U32 PupPhValues[MAX_INTERFACE_NUM*MAX_BUS_NUM],int regAddr)
{
    GT_U32 interfaceId = 0, busId = 0;
    GT_U32 devNum = 0, data;
	GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    /* multi CS support - regAddr is calucalated in calling function with CS offset */

    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	    for(busId = 0 ; busId < octetsPerInterfaceNum ; busId++)
	    {
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, busId)
		data = PupValues[interfaceId*octetsPerInterfaceNum+busId] + (PupPhValues[interfaceId*octetsPerInterfaceNum+busId]);
		CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, ACCESS_TYPE_UNICAST, busId, DDR_PHY_DATA, regAddr, data));
	    }

    }
    return 0;
}

#ifndef EXCLUDE_SWITCH_DEBUG
extern MV_HWS_DDR_FREQ initFreq;
extern MV_HWS_DDR_FREQ lowFreq;
extern MV_HWS_DDR_FREQ mediumFreq;
extern GT_U8 genericInitController;
extern AUTO_TUNE_STAGE trainingStage;
extern GT_U8  isPllBeforeInit;
extern GT_U8  isAdllCalibBeforeInit;
extern GT_U8  isDfsInInit;
extern GT_32 wlDebugDelay;
extern GT_U32 siliconDelay[HWS_MAX_DEVICE_NUM];
extern 	GT_U32 vrefInitialValue;
extern 	GT_U32 gZpriData;
extern 	GT_U32 gZnriData;
extern 	GT_U32 gZpriCtrl;
extern 	GT_U32 gZnriCtrl;
extern 	GT_U32 gZpodtData;
extern 	GT_U32 gZnodtData;
extern GT_U32 freqVal[DDR_FREQ_LIMIT];
extern GT_U32 startPattern, endPattern;
extern GT_U32  PhyReg0Val;
extern GT_U32  PhyReg1Val;
extern GT_U32  PhyReg2Val;
extern GT_U32  PhyReg3Val;
extern MV_HWS_PATTERN sweepPattern;
extern MV_HWS_PATTERN pbsPattern;
extern GT_U8  debugTrainingAccess;
extern GT_U32 fingerTest, pFingerStart,  pFingerEnd,  nFingerStart, nFingerEnd, pFingerStep, nFingerStep;
extern GT_U32 mode2T;
extern GT_U32 xsbValidateType;
extern GT_U32 xsbValidationBaseAddress;
extern GT_U32 odtAdditional;
extern GT_U32 debugMode;
extern GT_U32 delayEnable;
extern GT_U32 caDelay;
extern GT_U32 debugDunit;
extern GT_U32 clampTbl[MAX_INTERFACE_NUM];
extern GT_U32 freqMask[HWS_MAX_DEVICE_NUM][DDR_FREQ_LIMIT];
extern GT_U32 startPattern, endPattern;

/*Declarations*/
MV_HWS_TIP_CONFIG_FUNC_DB configFuncInfo[HWS_MAX_DEVICE_NUM];
GT_U32  startXsbOffset = 0;
GT_U8 isRlOld = 0;
GT_U8 isFreqOld = 0;
GT_U8 isDfsDisabled = 0;
GT_U32 defaultCentrlizationValue = 0x12;
GT_U32 activateSelectBeforeRunAlg= 1, activateDeselectAfterRunAlg = 1, rlTest = 0, resetReadFifo = 0;
GT_BOOL debugAcc = GT_FALSE;
GT_U32 ctrlSweepres[ADLL_LENGTH][MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U32 ctrlADLL[MAX_CS_NUM*MAX_INTERFACE_NUM*MAX_BUS_NUM];
GT_U32 xsbTestTable[][8] =
{
    {0x00000000,         0x11111111,         0x22222222,         0x33333333,         0x44444444,         0x55555555,         0x66666666,         0x77777777},
    {0x88888888,         0x99999999,         0xAAAAAAAA,         0xBBBBBBBB,         0xCCCCCCCC,         0xDDDDDDDD,         0xEEEEEEEE,         0xFFFFFFFF},
    {0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF},
    {0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF},
    {0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF},
    {0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF},
    {0x00000000,         0x00000000,         0xFFFFFFFF,         0xFFFFFFFF,         0x00000000,         0x00000000,         0xFFFFFFFF,         0xFFFFFFFF},
    {0x00000000,         0x00000000,         0x00000000,         0xFFFFFFFF,         0x00000000,         0x00000000,         0x00000000,         0x00000000},
    {0xFFFFFFFF,         0xFFFFFFFF,         0xFFFFFFFF,         0xFFFFFFFF,         0x00000000,         0xFFFFFFFF,         0xFFFFFFFF,         0xFFFFFFFF}
};
GT_U32 debugSweepVal = 100;

static GT_STATUS  ddr3TipAccessAtr
(
    GT_U32 devNum,
    GT_U32 flagId, 
	GT_U32 value,
    GT_U32** ptr
);

GT_STATUS    ddr3TipPrintAdll()
{
    GT_U32  busCnt = 0,  interfaceId,  dataP1, dataP2, uiData3, 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)
            CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, 0x1, &dataP1));
            CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, 0x2, &dataP2));
            CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId,  ACCESS_TYPE_UNICAST, busCnt, DDR_PHY_DATA, 0x3, &uiData3));
            DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE, (" IF %d busCnt %d  phy_reg_1_data 0x%x phy_reg_2_data 0x%x phy_reg_3_data 0x%x\n",interfaceId, busCnt, dataP1, dataP2, uiData3));
        }
    }
    return GT_OK; 
}

#if 0
/*****************************************************************************
Get attribute value
******************************************************************************/
GT_STATUS  ddr3TipGetAtr
(
    GT_U32 devNum,
    GT_U32 flagId, 
    GT_U32* value
)
{
    GT_STATUS retVal; 
    GT_U32 *ptrFlag = NULL;
    retVal = ddr3TipAccessAtr(devNum, flagId, &ptrFlag);
	*value = *ptrFlag;

	if(ptrFlag == NULL)
	{
		mvPrintf("flag 0x%x address cannot be retrieved. use ddr3TipSetAtr to set the value\n",flagId);
		*value = *ptrFlag;

		return GT_BAD_PARAM;
	}

    return retVal; 
}
#endif

/*****************************************************************************
Set attribute value
******************************************************************************/
GT_STATUS  ddr3TipSetAtr
(
    GT_U32 devNum,
    GT_U32 flagId,
    GT_U32 value
)
{
    GT_STATUS retVal;
    GT_U32 *ptrFlag = NULL;
    retVal = ddr3TipAccessAtr(devNum, flagId, value, &ptrFlag);
	if(ptrFlag != NULL)
	{
		mvPrintf("ddr3TipSetAtr Flag ID 0x%x value is set to 0x%x (was 0x%x)\n", flagId, value, *ptrFlag);
		*ptrFlag = value;
	}
	else
	{
		mvPrintf("ddr3TipSetAtr Flag ID 0x%x value is set to 0x%x\n", flagId, value);
	}

    return retVal;
}


/*****************************************************************************
Access attribute
******************************************************************************/
static GT_STATUS  ddr3TipAccessAtr
(
    GT_U32   devNum,
    GT_U32   flagId,
	GT_U32   value,
    GT_U32** ptr
)
 {
    GT_U32 tmpVal = 0, interfaceId = 0, pupId = 0;

	devNum = devNum;
	*ptr = NULL;

    switch(flagId)
    {

    case 0:
        *ptr = (GT_U32*) &(topologyMap->interfaceActiveMask);
        break;

    case 0x1:
        *ptr = (GT_U32*) &maskTuneFunc;
        break;

    case 0x2:
        lowFreq = (MV_HWS_DDR_FREQ)value;
	    break;

    case 0x3:
        mediumFreq = (MV_HWS_DDR_FREQ)value;
	    break;

    case 0x4:
        *ptr = (GT_U32*) &genericInitController;
        break;

    case 0x8:
        *ptr = (GT_U32*) &startXsbOffset;
        break;

   case 0x20:
        *ptr = (GT_U32*) &isRlOld;
        break;

   case 0x21:
       *ptr = (GT_U32*) &isFreqOld;
       break;

   case 0x23:
       *ptr = (GT_U32*) &isDfsDisabled;
       break;

   case 0x24:
       *ptr = (GT_U32*) &isPllBeforeInit;
       break;

   case 0x25:
       *ptr = (GT_U32*) &isAdllCalibBeforeInit;
       break;
#ifdef STATIC_ALGO_SUPPORT
   case 0x26:
       *ptr = (GT_U32*) &(siliconDelay[0]);
       break;

   case 0x27:
       *ptr = (GT_U32*) &wlDebugDelay;
       break;
#endif
   case 0x28:
       *ptr = (GT_U32*) &isTuneResult;
       break;

   case 0x29:
       *ptr = (GT_U32*) &isValidateWindowPerIf;
       break;

   case 0x2a:
       *ptr = (GT_U32*) &isValidateWindowPerPup;
       break;

   case 0x30:
       *ptr = (GT_U32*) &sweepCnt;
       break;

   case 0x31:
       *ptr = (GT_U32*) &isBistResetBit;
       break;

   case 0x32:
       *ptr = (GT_U32*) &isDfsInInit;
       break;
   case 0x33:
       *ptr = (GT_U32*) &gZnodtData;
       break;

   case 0x34:
       *ptr = (GT_U32*) &gZpodtData;
       break;

   case 0x35:
       initFreq = (MV_HWS_DDR_FREQ)value;
       break;

   case 0x36:
       *ptr = (GT_U32*) &(freqVal[DDR_FREQ_LOW_FREQ]);
       break;

   case 0x37:
       *ptr = (GT_U32*) &startPattern;
       break;

   case 0x38:
       *ptr = (GT_U32*) &endPattern;
       break;

   case 0x39:
       *ptr = (GT_U32*) &PhyReg0Val;
       break;

   case 0x4a:
       *ptr = (GT_U32*) &PhyReg1Val;
       break;

   case 0x4b:
       *ptr = (GT_U32*) &PhyReg2Val;
       break;

   case 0x4c:
       *ptr = (GT_U32*) &PhyReg3Val;
       break;

   case 0x4e:
       sweepPattern = (MV_HWS_PATTERN)value;
       break;
/*
   case 0x4f:
       *ptr = (GT_U32*) &(phy1ValTable[DDR_FREQ_LOW_FREQ]);
       break;
*/
   case 0x51:
       *ptr = (GT_U32*) &gZnriData;
       break;

   case 0x52:
       *ptr = (GT_U32*) &gZpriData;
       break;

   case 0x53:
       *ptr = (GT_U32*) &fingerTest;
       break;

   case 0x54:
       *ptr = (GT_U32*) &nFingerStart;
       break;

   case 0x55:
       *ptr = (GT_U32*) &nFingerEnd;
       break;

   case 0x56:
       *ptr = (GT_U32*) &pFingerStart;
       break;

   case 0x57:
       *ptr = (GT_U32*) &pFingerEnd;
       break;

   case 0x58:
       *ptr = (GT_U32*) &pFingerStep;
       break;

   case 0x59:
       *ptr = (GT_U32*) &nFingerStep;
       break;

   case 0x5A:
       *ptr = (GT_U32*) &gZnriCtrl;
       break;

   case 0x5B:
       *ptr = (GT_U32*) &gZpriCtrl;
       break;
   case 0x5C:
       *ptr = (GT_U32*) &isRegDump;
       break;

   case 0x5D:
       *ptr = (GT_U32*) &vrefInitialValue;
       break;

   case 0x5E:
       *ptr = (GT_U32*) &mode2T;
       break;

   case 0x5F:
       *ptr = (GT_U32*) &xsbValidateType;
       break;

   case 0x60:
       *ptr = (GT_U32*) &xsbValidationBaseAddress;
       break;

   case 0x67:
       *ptr = (GT_U32*) &activateSelectBeforeRunAlg;
       break;

   case 0x68:
       *ptr = (GT_U32*) &activateDeselectAfterRunAlg;
       break;

   case 0x69:
       *ptr = (GT_U32*) &odtAdditional;
       break;

   case 0x70:
       *ptr = (GT_U32*) &debugMode;
       break;

   case 0x71:
       pbsPattern = (MV_HWS_PATTERN)value;
       break;

   case 0x72:
       *ptr = (GT_U32*) &delayEnable;
       break;

   case 0x73:
       *ptr = (GT_U32*) &ckDelay;
       break;

   case 0x75:
       *ptr = (GT_U32*) &caDelay;
       break;

   case 0x100:
        *ptr = (GT_U32*) &debugDunit;
        break;

    case 0x101:
		debugAcc = (GT_BOOL)value;
        break;

    case 0x102:
		debugTraining = (GT_U8)value;
        break;
        
    case 0x103:
		debugTrainingBist = (GT_U8)value;
        break;
       
    case 0x104:
		debugCentralization = (GT_U8)value;
   	    break;

    case 0x105:
		debugTrainingIp = (GT_U8)value;
        break;

    case 0x106:
		debugLeveling = (GT_U8)value;
        break;
		
    case 0x107:
		debugPbs = (GT_U8)value;
        break;
    
    case 0x108:
		debugTrainingStatic = (GT_U8)value;
        break;

    case 0x109:
		debugTrainingAccess = (GT_U8)value;
        break; 

#ifdef CONFIG_DDR4
    case 0x110:
		debugTapTuning = (GT_U8)value;
        break;

    case 0x111:
		debugCalibration = (GT_U8)value;
        break;
#endif
   case 0x112:
	   *ptr = &startPattern;
        break;

    case 0x113:
		*ptr = &endPattern;
        break;

    default:
        if ((flagId >=0x200) && (flagId < 0x210))
        {
            interfaceId = flagId - 0x200;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].memoryFreq);
        }
        else if ((flagId >=0x210) && (flagId < 0x220))
        {
            interfaceId = flagId - 0x210;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].speedBinIndex);
        }
        else if ((flagId >=0x220) && (flagId < 0x230))
        {
            interfaceId = flagId - 0x220;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].busWidth);
        }
        else if ((flagId >=0x230) && (flagId < 0x240))
        {
            interfaceId = flagId - 0x230;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].memorySize);
        }
        else if ((flagId >=0x240) && (flagId < 0x250))
        {
            interfaceId = flagId - 0x240;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].casL);
        }
        else if ((flagId >=0x250) && (flagId < 0x260))
        {
            interfaceId = flagId - 0x250;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].casWL);
        }
        else if ((flagId >=0x270) && (flagId < 0x2cf))
        {
            interfaceId = (flagId - 0x270)/MAX_BUS_NUM;
			pupId = (flagId - 0x270)%MAX_BUS_NUM;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].asBusParams[pupId].isCkSwap);
        }
        else if ((flagId >=0x2d0) && (flagId < 0x32f))
        {
            interfaceId = (flagId - 0x2d0)/MAX_BUS_NUM;
			pupId = (flagId - 0x2d0)%MAX_BUS_NUM;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].asBusParams[pupId].isDqsSwap);
        }
        else if ((flagId >=0x330) && (flagId < 0x38f))
        {
            interfaceId = (flagId - 0x330)/MAX_BUS_NUM;
			pupId = (flagId - 0x330)%MAX_BUS_NUM;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].asBusParams[pupId].csBitmask);
        }
        else if ((flagId >=0x390) && (flagId < 0x3ef))
        {
            interfaceId = (flagId - 0x390)/MAX_BUS_NUM;
			pupId = (flagId - 0x390)%MAX_BUS_NUM;
            *ptr = (GT_U32*) &(topologyMap->interfaceParams[interfaceId].asBusParams[pupId].mirrorEnableBitmask);
        }
       /* else if ((flagId >=0x3f0) && (flagId < 0x3ff))
        {
            interfaceId = flagId - 0x3f0;
            *ptr = (GT_U32*) &ckDelay;
        }
        else if ((flagId >=0x400) && (flagId < 0x40f))
        {
            interfaceId = flagId - 0x400;
            *ptr = (GT_U32*) &caDelay;
        }*/
       /* else if ((flagId >=0x400) && (flagId<=0x4ff))
        {
            freq = (flagId-0x400)/16;
            field = (flagId-0x400)%16;
            *ptr = (GT_U32*) &(freqParams[freq][field]);
        }*/
        else if ((flagId >=0x500) && (flagId<=0x50f))
        {
            tmpVal = flagId-0x320;
            *ptr = (GT_U32*) &(clampTbl[tmpVal]);
        }
        else
        {
			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("flagId out of boundary %d \n",flagId));
            return GT_BAD_PARAM;
        }
    }
    return GT_OK;
 }
#endif /* #ifndef EXCLUDE_SWITCH_DEBUG */
#ifdef DDR_VIEWER_TOOL
/*****************************************************************************
Print ADLL
******************************************************************************/
GT_STATUS printAdll(GT_U32 devNum, GT_U32 adll[MAX_INTERFACE_NUM*MAX_BUS_NUM])
{
    GT_U32 i,j;
    GT_U32 octetsPerInterfaceNum;

    devNum = devNum;
    octetsPerInterfaceNum = ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    for(j=0; j< octetsPerInterfaceNum; j++)
    {
        VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, j)
        for(i=0;i<MAX_INTERFACE_NUM; i++)
        {
            mvPrintf("%d ,",adll[i*octetsPerInterfaceNum+j]);
        }
    }
    mvPrintf("\n");
    return GT_OK;
}
GT_STATUS printPh(GT_U32 devNum, GT_U32 adll[MAX_INTERFACE_NUM*MAX_BUS_NUM])
{
    GT_U32 i,j;
    GT_U32 octetsPerInterfaceNum;

    devNum = devNum;
    octetsPerInterfaceNum = ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    for(j=0; j< octetsPerInterfaceNum; j++)
    {
        VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, j)
        for(i=0;i<MAX_INTERFACE_NUM; i++)
        {
            mvPrintf("%d ,",adll[i*octetsPerInterfaceNum+j]>>6);
        }
    }
    mvPrintf("\n");
    return GT_OK;
}
#endif

#ifndef EXCLUDE_SWITCH_DEBUG
/* uiByteIndex - only byte 0,1,2, or 3, oxff - test all bytes */
static
GT_U32 ddr3TipCompare(GT_U32 interfaceId, GT_U32 *pSrc, GT_U32 *pDst, GT_U32 uiByteIndex)
{
   GT_U32 burstCnt = 0, addrOffset,iId;
   GT_BOOL bIsFail = GT_FALSE;

   addrOffset = (uiByteIndex == 0xff) ? (GT_U32) 0xffffffff: (GT_U32) (0xff << (uiByteIndex*8));
   for(burstCnt = 0; burstCnt < EXT_ACCESS_BURST_LENGTH; burstCnt++)
   {
      if ((pSrc[burstCnt] & addrOffset) != (pDst[interfaceId] & addrOffset))
      {
          bIsFail = GT_TRUE;
      }
   }
   if (bIsFail == GT_TRUE)
   {
        DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("IF %d exp: ",interfaceId));
	for(iId = 0; iId <= MAX_INTERFACE_NUM-1; iId++)
	{
		 DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("0x%8x ",pSrc[iId]));
        }
        DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("\nIF %d rcv: ",interfaceId));
	for(iId = 0; iId <= MAX_INTERFACE_NUM-1; iId++)
	{
		 DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("(0x%8x ",pDst[iId]));
        }
	DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("\n "));
   }
   return bIsFail;

}

#endif /* EXCLUDE_SWITCH_DEBUG*/
#if defined(DDR_VIEWER_TOOL)
/*****************************************************************************
Sweep validation
******************************************************************************/
GT_BOOL ddr3TipRunSweepTest(GT_32 devNum, GT_U32 RepeatNum, GT_U32 direction, GT_U32 mode)
{
    GT_U32  pup = 0, startPup = 0, endPup = 0;
    GT_U32 adll = 0,rep = 0,sweepPatternIndex = 0;
    GT_U32 res[MAX_INTERFACE_NUM] = {0};
    GT_32  interfaceId = 0;
    GT_U32 adllValue = 0;
    GT_32 reg = (direction == 0) ? WRITE_CENTRALIZATION_PHY_REG : READ_CENTRALIZATION_PHY_REG;
    MV_HWS_ACCESS_TYPE  pupAccess;
    GT_U32 uiCs;
    GT_U32 maxCs = mvHwsDdr3TipMaxCSGet(devNum);
	GT_U8 octetsPerInterfaceNum = ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);

    RepeatNum = RepeatNum;
	RepeatNum = 2;
    if ( mode == 1)
    {
        /* per pup */
        startPup = 0;
        endPup = octetsPerInterfaceNum-1;
        pupAccess = ACCESS_TYPE_UNICAST;
    }
    else
    {
        startPup = 0;
        endPup = 0;
        pupAccess = ACCESS_TYPE_MULTICAST;
    }
    for(uiCs=0; uiCs < maxCs; uiCs++){
	for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
	{
		for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
		{
			VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			for( pup = startPup ;pup <= endPup ; pup++)
			{
				ctrlSweepres[adll][interfaceId][pup] = 0;
			}
		}
	}

	for(adll = 0 ; adll < (MAX_INTERFACE_NUM * MAX_BUS_NUM) ; adll++)
	{
		ctrlADLL[adll] = 0;
	}
	/*Save DQS value(after algorithm run)*/
	readAdllValue(ctrlADLL, (reg + (uiCs * CS_REGISTER_ADDR_OFFSET)) , MASK_ALL_BITS );

	/*Sweep ADLL  from 0:31 on all I/F on all Pup and perform BIST on each stage.*/
	for(pup=startPup; pup <=endPup; pup++)
	{
		for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
		{
			for(rep = 0; rep < RepeatNum ; rep++)
			{
				for(sweepPatternIndex = sweepPatternIndexStart ; sweepPatternIndex < sweepPatternIndexEnd ; sweepPatternIndex++)
				{
					adllValue = (direction == 0) ? (adll*2):adll;
					CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_MULTICAST, 0, pupAccess, pup, DDR_PHY_DATA, reg + CS_BYTE_GAP(uiCs), adllValue));
					mvHwsDdr3RunBist(devNum, sweepPattern, res ,uiCs);
					/*ddr3TipResetFifoPtr(devNum);*/
					for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
					{
						VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
						ctrlSweepres[adll][interfaceId][pup] += res[interfaceId];
						if (mode == 1)
						{
							CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, ACCESS_TYPE_UNICAST, pup, DDR_PHY_DATA, reg + CS_BYTE_GAP(uiCs),  ctrlADLL[interfaceId*uiCs*octetsPerInterfaceNum+pup]));
						}
					}
				}
			}
		}
	}
	mvPrintf("Final,CS %d,%s,Sweep,Result,Adll,", uiCs,((direction==0) ? "TX":"RX"));
	for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
	{
		VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		if (mode == 1)
		{
			for(pup=startPup; pup <=endPup; pup++)
			{
				VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
				mvPrintf("I/F%d-PHY%d , ",interfaceId,pup);
			}
		}
		else
		{
			mvPrintf("I/F%d , ",interfaceId);
		}
	}
	mvPrintf("\n");
	for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
	{
		adllValue = (direction == 0) ? (adll*2):adll;
		mvPrintf("Final,%s,Sweep,Result, %d ,",((direction==0) ? "TX":"RX"),adllValue);

		for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++){
			VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			for( pup=startPup; pup <=endPup; pup++)
			{
				mvPrintf("%8d , ",ctrlSweepres[adll][interfaceId][pup]);
			}
		}
		mvPrintf("\n");
	}
	/*Write back to the phy the Rx DQS value, we store in the begging. */
	writeAdllValue(ctrlADLL, (reg +  uiCs * CS_REGISTER_ADDR_OFFSET));
	/* print adll results */
	readAdllValue(ctrlADLL, (reg + uiCs * CS_REGISTER_ADDR_OFFSET), MASK_ALL_BITS);
	mvPrintf("%s,DQS,ADLL,,,",(direction==0) ? "Tx":"Rx");
	printAdll(devNum, ctrlADLL);
    }
    ddr3TipResetFifoPtr(devNum);
    return 0;
}

#if defined(EXCLUDE_SWITCH_DEBUG)
GT_BOOL ddr3TipRunLevelingSweepTest(GT_32 devNum, GT_U32 RepeatNum, GT_U32 direction, GT_U32 mode)
{
    GT_U32  pup = 0, startPup = 0, endPup = 0, startAdll = 0;
    GT_U32 adll = 0,rep = 0,sweepPatternIndex = 0;
	GT_U32  readData[MAX_INTERFACE_NUM];
    GT_U32 res[MAX_INTERFACE_NUM] = {0};
    GT_32  interfaceId = 0,gap = 0;
    GT_32 adllValue = 0;
    GT_32 reg = (direction == 0) ? WL_PHY_REG : RL_PHY_REG;
    MV_HWS_ACCESS_TYPE  pupAccess;
    GT_U32 uiCs;
    GT_U32 maxCs = mvHwsDdr3TipMaxCSGet(devNum);
	GT_U8 octetsPerInterfaceNum = ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE);
    RepeatNum = RepeatNum;
	RepeatNum = 3;
    if ( mode == 1)
    {
        /* per pup */
        startPup = 0;
        endPup = octetsPerInterfaceNum-1;
        pupAccess = ACCESS_TYPE_UNICAST;
    }
    else
    {
        startPup = 0;
        endPup = 0;
        pupAccess = ACCESS_TYPE_MULTICAST;
    }
    for(uiCs=0; uiCs < maxCs; uiCs++){
		for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
		{
			for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
			{
				VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
				for( pup = startPup ;pup <= endPup ; pup++)
				{
					ctrlSweepres[adll][interfaceId][pup] = 0;
				}
			}
		}

		for(adll = 0 ; adll < (MAX_INTERFACE_NUM * MAX_BUS_NUM) ; adll++)
		{
			ctrlADLL[adll] = 0;
			ctrlLevelPhase[adll] = 0;
			ctrlADLL1[adll] = 0;
		}
		/*Save Leveling value(after algorithm run)*/
		readAdllValue(ctrlADLL, (reg + (uiCs * CS_REGISTER_ADDR_OFFSET)) , 0x1F );
		readPhaseValue(ctrlLevelPhase, (reg + (uiCs * CS_REGISTER_ADDR_OFFSET)) , 0x7<<6 );
		if(direction == 0)
		{
			readAdllValue(ctrlADLL1, (0x1 + (uiCs * CS_REGISTER_ADDR_OFFSET)) , MASK_ALL_BITS );
		}
		/*Sweep ADLL  from 0:31 on all I/F on all Pup and perform BIST on each stage.*/
		for(pup=startPup; pup <=endPup; pup++)
		{
			for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
			{
				for(rep = 0; rep < RepeatNum ; rep++)
				{
					adllValue = (direction == 0) ? (adll*2):(adll*3);
					for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
					{
						startAdll = ctrlADLL[interfaceId*uiCs*octetsPerInterfaceNum+pup] + (ctrlLevelPhase[interfaceId*uiCs*octetsPerInterfaceNum+pup]>>6)*32 ;
						if(direction == 0)
						{
							startAdll = (startAdll>32)?(startAdll-32):0;
						}else
						{
							startAdll = (startAdll>48)?(startAdll-48):0;
						}
						if(direction == 0)
						{
							adllValue = startAdll + adllValue;
						}else
						{
							adllValue = startAdll + adllValue;
						}
						gap = ctrlADLL1[interfaceId*uiCs*octetsPerInterfaceNum+pup] - ctrlADLL[interfaceId*uiCs*octetsPerInterfaceNum+pup];
						gap = (((adllValue%32) + gap)%64);
						adllValue = ((adllValue%32) + (((adllValue- (adllValue%32))/32)<<6));

						CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, pupAccess, pup, DDR_PHY_DATA, reg + CS_BYTE_GAP(uiCs), adllValue));
						if(direction == 0)
						{
							CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, pupAccess, pup, DDR_PHY_DATA, 0x1 + CS_BYTE_GAP(uiCs), gap));
						}
					}
					for(sweepPatternIndex = sweepPatternIndexStart ; sweepPatternIndex < sweepPatternIndexEnd ; sweepPatternIndex++)
					{
						mvHwsDdr3RunBist(devNum, sweepPattern, res ,uiCs);
						ddr3TipResetFifoPtr(devNum);
						for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
						{
							VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
							if(pup != 4)
							{
								ctrlSweepres[adll][interfaceId][pup] += res[interfaceId];
							}else
							{
								CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x1458, readData, MASK_ALL_BITS));
								ctrlSweepres[adll][interfaceId][pup] += readData[interfaceId];

								CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x1458, 0x0 , 0xFFFFFFFF));
								CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, 0x145C, 0x0 , 0xFFFFFFFF));
							}
						}
					}
				}
			}
			for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
			{
				startAdll = ctrlADLL[interfaceId*uiCs*octetsPerInterfaceNum+pup] + ctrlLevelPhase[interfaceId*uiCs*octetsPerInterfaceNum+pup] ;
				CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, pupAccess, pup, DDR_PHY_DATA, reg + CS_BYTE_GAP(uiCs), startAdll));
				if(direction == 0)
				{
					CHECK_STATUS(mvHwsDdr3TipBUSWrite(  devNum, ACCESS_TYPE_UNICAST, interfaceId, pupAccess, pup, DDR_PHY_DATA, 0x1 + CS_BYTE_GAP(uiCs), ctrlADLL1[interfaceId*uiCs*octetsPerInterfaceNum+pup]));
				}
			}
		}
		mvPrintf("Final,CS %d,%s,Leveling,Result,Adll,", uiCs,((direction==0) ? "TX":"RX"));
		for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
		{
			VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			if (mode == 1)
			{
				for(pup=startPup; pup <=endPup; pup++)
				{
					VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
					mvPrintf("I/F%d-PHY%d , ",interfaceId,pup);
				}
			}
			else
			{
				mvPrintf("I/F%d , ",interfaceId);
			}
		}
		mvPrintf("\n");
		for(adll = 0 ; adll < ADLL_LENGTH ; adll++)
		{
			adllValue = (direction == 0) ? ((adll*2)-32):((adll*3)-48);
			mvPrintf("Final,%s,LevelingSweep,Result, %d ,",((direction==0) ? "TX":"RX"),adllValue);

			for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++){
				VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
				for( pup=startPup; pup <=endPup; pup++)
				{
					mvPrintf("%8d , ",ctrlSweepres[adll][interfaceId][pup]);
				}
			}
			mvPrintf("\n");
		}
		/*Write back to the phy the Rx DQS value, we store in the begging. */
		writeLevelingValue(ctrlADLL,ctrlLevelPhase, (reg +  uiCs * CS_REGISTER_ADDR_OFFSET));
		if(direction == 0)
		{
			writeAdllValue(ctrlADLL1, (0x1 + (uiCs * CS_REGISTER_ADDR_OFFSET)));
		}
		/* print adll results */
		readAdllValue(ctrlADLL, (reg + uiCs * CS_REGISTER_ADDR_OFFSET), MASK_ALL_BITS);
		mvPrintf("%s,DQS,Leveling,,,",(direction==0) ? "Tx":"Rx");
		printAdll(devNum, ctrlADLL);
		printPh(devNum, ctrlLevelPhase);
	}/*End of CS*/

    ddr3TipResetFifoPtr(devNum);
    return 0;
}
#endif


void printTopology(MV_HWS_TOPOLOGY_MAP *pTopologyDB)
{
	GT_U32 ui, uj;

	mvPrintf("\tinterfaceMask: 0x%x\n",   pTopologyDB->interfaceActiveMask);
	mvPrintf("\tNum Bus:  %d\n",   ddr3TipDevAttrGet(0, MV_ATTR_OCTET_PER_INTERFACE));
	mvPrintf("\tactiveBusMask: 0x%x\n",   pTopologyDB->activeBusMask);

	for( ui = 0; ui < MAX_INTERFACE_NUM; ui++ )
	{
		VALIDATE_IF_ACTIVE(pTopologyDB->interfaceActiveMask, ui)
		mvPrintf ("\n\tInterface ID: %d\n",ui);
		mvPrintf("\t\tDDR Frequency: %s\n",   ConvertFreq(pTopologyDB->interfaceParams[ ui ].memoryFreq));
		mvPrintf("\t\tSpeedBin: %d\n",   pTopologyDB->interfaceParams[ ui ].speedBinIndex);
		mvPrintf("\t\tBusWidth: %d\n", (4 << pTopologyDB->interfaceParams[ ui ].busWidth));
		mvPrintf("\t\tMemSize: %s\n",   ConvertMemSize(pTopologyDB->interfaceParams[ ui ].memorySize));
		mvPrintf("\t\tCasWL: %d\n",   pTopologyDB->interfaceParams[ ui ].casWL);
		mvPrintf("\t\tCasL: %d\n",   pTopologyDB->interfaceParams[ ui ].casL);
		mvPrintf("\t\tTemperature: %d\n",   pTopologyDB->interfaceParams[ ui ].interfaceTemp);
		mvPrintf("\n");
		for( uj = 0; uj < 4; uj++ )
		{
			mvPrintf("\t\tBUS %d parameters- CS Mask: 0x%x\t", uj, pTopologyDB->interfaceParams[ ui ].asBusParams[ uj ].csBitmask);
			mvPrintf("Mirror: 0x%x\t",   pTopologyDB->interfaceParams[ ui ].asBusParams[ uj ].mirrorEnableBitmask);
			mvPrintf("DQS Swap is %s \t", (pTopologyDB->interfaceParams[ ui ].asBusParams[ uj ].isDqsSwap == 1)? "enabled": "disabled");
			mvPrintf("Ck Swap:%s\t",   (pTopologyDB->interfaceParams[ ui ].asBusParams[ uj ].isCkSwap == 1)? "enabled": "disabled");
			mvPrintf("\n");
		}
	}
}
#endif
#ifndef EXCLUDE_SWITCH_DEBUG
/*****************************************************************************
Execute XSB Test transaction (rd/wr/both)
******************************************************************************/
GT_STATUS RunXsbTest(GT_U32 devNum, GT_U32 uiMemAddress, GT_U32 writeType, GT_U32 readType, GT_U32 burstLength)
{
    GT_U32 seq = 0, interfaceId = 0, uiAddr, cnt;
    GT_STATUS retVal = GT_OK, retTmp;
	GT_U32 dataRead[MAX_INTERFACE_NUM];



    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        uiAddr = uiMemAddress;
        /*DEBUG_TRAINING_BIST_ENGINE(DEBUG_LEVEL_TRACE, " interfaceIdIndex %d numIfTested %d interfaceId %d \n",interfaceId, numIfTested, interfaceId);*/
        for(cnt = 0; cnt <= burstLength; cnt++)
        {
            seq = (seq + 1)%8;
            if (writeType != 0)
            {
                CHECK_STATUS(ddr3TipExtWrite(devNum, interfaceId, uiAddr, 1, xsbTestTable[seq]));
            }
            if (readType != 0)
            {
                CHECK_STATUS(ddr3TipExtRead(  devNum, interfaceId, uiAddr, 1, dataRead));
            }
            if ((readType != 0)&&(writeType != 0))
            {
                retTmp = ddr3TipCompare(interfaceId, xsbTestTable[seq], dataRead, 0xff);
                uiAddr += (EXT_ACCESS_BURST_LENGTH*4);
                retVal = (retVal != GT_OK) ? retVal:retTmp;
            }
        }
    }
    return retVal;
}

#else /*EXCLUDE_SWITCH_DEBUG*/
GT_U32  startXsbOffset = 0;
GT_STATUS RunXsbTest(GT_U32 devNum, GT_U32 uiMemAddress, GT_U32 writeType, GT_U32 readType, GT_U32 burstLength)
{
	return GT_OK;
}

#endif

