/*******************************************************************************
*                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.
********************************************************************************
* ddr3TipDdr3TrainingPbs.c
*
* DESCRIPTION: DDR3 IF for galtis commands
*
*
* DEPENDENCIES:
*
* FILE REVISION NUMBER:
*       $Revision: 48 $
******************************************************************************/

#include "mvDdr3TrainingIp.h"
#include "mvDdr3TrainingIpFlow.h"
#include "mvDdr3TrainingIpEngine.h"
#include "mvDdr3TrainingIpDef.h"
#include "mvDdrTrainingIpDb.h"
#include "mvDdr3TrainingIpPbs.h"
#include "mvDdr3LoggingDef.h"


extern GT_U8  debugPbs;
extern GT_U32 effective_cs;

#define TYPICAL_PBS_VALUE   (12)

typedef enum
{
	PBS_TX_MODE = 0,
	PBS_RX_MODE,
	NUM_OF_PBS_MODES
}PBS_DIRECTION;

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

GT_U32 nominalAdll[MAX_INTERFACE_NUM*MAX_BUS_NUM];
MV_HWS_TrainingIpStatus trainStatus[MAX_INTERFACE_NUM];
GT_U8 Result_MAT[MAX_INTERFACE_NUM][MAX_BUS_NUM][BUS_WIDTH_IN_BITS];
GT_U8 Result_MAT_RX_DQS[MAX_INTERFACE_NUM][MAX_BUS_NUM][MAX_CS_NUM];
GT_U8 PupState[MAX_INTERFACE_NUM][MAX_BUS_NUM];/*4-EEWA,3-EWA,2-SWA,1-Fail,0-Pass*/
GT_U8 ResultAllBit[MAX_BUS_NUM*BUS_WIDTH_IN_BITS*MAX_INTERFACE_NUM];
GT_U8 MaxPBSPerPup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U8 MinPBSPerPup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U8 MaxADLLPerPup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U8 MinADLLPerPup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U32 pbsdelayPerPup[NUM_OF_PBS_MODES][MAX_INTERFACE_NUM][MAX_BUS_NUM];
GT_U8 ADLL_SHIFT_Lock[MAX_INTERFACE_NUM][MAX_BUS_NUM] ;
GT_U8 ADLL_SHIFT_val[MAX_INTERFACE_NUM][MAX_BUS_NUM] ;
MV_HWS_PATTERN pbsPattern = PATTERN_VREF;

extern GT_U32 mvHwsDdr3TipMaxCSGet(void);
/************************** pre declarations ******************************/
extern MV_HWS_TOPOLOGY_MAP *topologyMap;
extern GT_U32 maskResultsDqRegMap[];
extern MV_HWS_DDR_FREQ mediumFreq;
extern GT_U32 freqVal[];
extern MV_HWS_RESULT trainingResult[MAX_STAGE_LIMIT][MAX_INTERFACE_NUM];
extern AUTO_TUNE_STAGE trainingStage;
extern GT_U32 debugMode;
extern GT_U32* dqMapTable;

/*****************************************************************************
Print PBS Result
******************************************************************************/
GT_STATUS    ddr3TipPrintPbsResult
(
    GT_U32		devNum,
    GT_U32		csNum,
    PBS_DIRECTION	pbsMode
);

/*****************************************************************************
Fixup PBS Result
******************************************************************************/
GT_STATUS    ddr3TipCleanPbsResult
(
    GT_U32                  devNum,
    PBS_DIRECTION			pbsMode
);

/******************************************************************************
* Name:     ddr3TipPbs
* Desc:     PBS
* Args:     TBD
* Notes:
* Returns:  OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipPbs
(
   GT_U32            devNum,
   PBS_DIRECTION     pbsMode
)
{
    GT_U32 Result0[MAX_INTERFACE_NUM] ;
    int ADLLTap = MEGA / freqVal[mediumFreq] / 64;
    int PadNum = 0;
    MV_HWS_SearchDirection SearchDirection = (pbsMode == PBS_RX_MODE) ? MV_HWS_High2Low : MV_HWS_Low2High;
    MV_HWS_DIRECTION Direction = (pbsMode == PBS_RX_MODE) ? OPER_READ:OPER_WRITE;
    int NumberOfIterations = (pbsMode == PBS_RX_MODE) ? 31:63;
    GT_U32 ResultValidationMask = (pbsMode == PBS_RX_MODE) ? 0x1F : 0x3f;
    int InitValue = (SearchDirection == MV_HWS_Low2High)?0:NumberOfIterations;
    MV_HWS_EdgeCompare SearchEDGE_ = EDGE_FP;
    GT_U32 pup = 0, bit = 0, interfaceId = 0, AllLock = 0 , csNum = 0;
    GT_32 regAddr = 0;
    GT_U32 validationVal = 0;
    GT_U32   csEnableRegVal[MAX_INTERFACE_NUM];
    GT_U16 *maskResultsDqRegMap 	= ddr3TipGetMaskResultsDqReg();
    GT_U8 temp = 0;

    /* save current cs enable reg val */
    for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        /* save current cs enable reg val */
        CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_UNICAST, interfaceId, CS_ENABLE_REG, csEnableRegVal, MASK_ALL_BITS));
        /* enable single cs */
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, CS_ENABLE_REG, (1 << 3), (1 << 3)));
    }

    regAddr = (pbsMode == PBS_RX_MODE ) ? (READ_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET)) : (WRITE_CENTRALIZATION_PHY_REG + (effective_cs * CS_REGISTER_ADDR_OFFSET));
    readAdllValue(nominalAdll, regAddr , MASK_ALL_BITS );
    /* stage 1 shift ADLL */
    /*ddr3TipIpTrainingPerbitMultiCast( SearchDirection, Direction, InitValue, NumberOfIterations, pbsPattern,  SearchEDGE_ , MV_HWS_ControlElement_ADLL);*/

    ddr3TipIpTraining(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, RESULT_PER_BIT, MV_HWS_ControlElement_ADLL,
                      SearchDirection, Direction, topologyMap->interfaceActiveMask, InitValue, NumberOfIterations, pbsPattern, SearchEDGE_, CS_SINGLE, csNum, trainStatus);

    validationVal = (pbsMode == PBS_RX_MODE) ? 0x1f : 0;
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
		for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
		{
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
    		MinADLLPerPup[interfaceId][pup] = (pbsMode == PBS_RX_MODE) ? 0x1f : 0x3f;
            PupState[interfaceId][pup] = 0x3;
			ADLL_SHIFT_Lock[interfaceId][pup] = 1;
		    MaxADLLPerPup[interfaceId][pup] = 0x0;
        }
    }

    /* EBA */
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
		for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
		{
            CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, maskResultsDqRegMap[bit+pup*BUS_WIDTH_IN_BITS ], Result0, MASK_ALL_BITS));

			for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
			{
                VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
                 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("FP I/F %d, bit:%d, pup:%d Result0 0x%x\n",interfaceId,bit,pup,Result0[interfaceId]));
				if(PupState[interfaceId][pup] != 3) { continue;} /* if not EBA state than move to next pup*/

				if((Result0[interfaceId] & 0x2000000) == 0 )
				{
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("-- Fail Training IP\n"));
					PupState[interfaceId][pup] = 1; /* training machine failed */
	     		    ADLL_SHIFT_Lock[interfaceId][pup] = 0;

					continue;
				}
                else if((Result0[interfaceId] & ResultValidationMask) == validationVal)
				{
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("-- FAIL EBA\n",interfaceId,bit,pup,Result0[interfaceId]));
					PupState[interfaceId][pup] = 4; /* this pup move to EEBA */
	     		    ADLL_SHIFT_Lock[interfaceId][pup] = 0;
					continue;
				}
                else
				{
					Result0[interfaceId]= (pbsMode == PBS_RX_MODE) ? ((Result0[interfaceId] & ResultValidationMask) + 1) :
																	 ((Result0[interfaceId] & ResultValidationMask) - 1);/* The search ended in Pass we need Fail */
					MaxADLLPerPup[interfaceId][pup]  = (MaxADLLPerPup[interfaceId][pup] < Result0[interfaceId]) ? (GT_U8)Result0[interfaceId] : MaxADLLPerPup[interfaceId][pup];
					MinADLLPerPup[interfaceId][pup]  = (Result0[interfaceId] > MinADLLPerPup[interfaceId][pup]) ? MinADLLPerPup[interfaceId][pup] : (GT_U8)Result0[interfaceId];
					ADLL_SHIFT_val[interfaceId][pup] = (pbsMode == PBS_RX_MODE) ? MaxADLLPerPup[interfaceId][pup] : MinADLLPerPup[interfaceId][pup];/*vs the Rx we are searching for the smallest value of DQ shift so all Bus would fail*/
				}
			}
		}
	}

	/* EEBA */
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
		{
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			if(PupState[interfaceId][pup] != 4) { continue;}/* if pup state different from EEBA than move to next pup */

            regAddr = (pbsMode == PBS_RX_MODE) ? (0x54 + effective_cs * 0x10) : (0x14 + effective_cs * 0x10);
            CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x1F));
            regAddr = (pbsMode == PBS_RX_MODE) ? (0x55 + effective_cs * 0x10) : (0x15 + effective_cs * 0x10);
            CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x1F));
		    ADLL_SHIFT_val[interfaceId][pup]=0;/* initilaze the Edge2 Max. */
		    MinADLLPerPup[interfaceId][pup] = (pbsMode == PBS_RX_MODE) ? 0x1F : 0x3f;
		    MaxADLLPerPup[interfaceId][pup] = 0x0;
		    /*ddr3TipIpTrainingPerbitMultiCast( SearchDirection, Direction, InitValue, NumberOfIterations, pbsPattern,  SearchEDGE_ , MV_HWS_ControlElement_ADLL);*/
            ddr3TipIpTraining(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, RESULT_PER_BIT, MV_HWS_ControlElement_ADLL,
                              SearchDirection, Direction, topologyMap->interfaceActiveMask, InitValue, NumberOfIterations, pbsPattern, SearchEDGE_, CS_SINGLE, csNum, trainStatus);

            DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("ADLL shift results:\n"));
		    for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
		    {
                CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, maskResultsDqRegMap[bit+pup*BUS_WIDTH_IN_BITS], Result0, MASK_ALL_BITS));

                DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("FP I/F %d, bit:%d, pup:%d Result0 0x%x\n",interfaceId,bit,pup, Result0[interfaceId]));

				if((Result0[interfaceId]&0x2000000) == 0)
				{
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,(" -- EEBA Fail\n"));
					bit = BUS_WIDTH_IN_BITS;/* exit bit loop */
					DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("-- EEBA Fail Training IP\n"));
					PupState[interfaceId][pup] = 2; /* training machine failed but pass before in the EBA so maybe the DQS shift change env. */
	     		    ADLL_SHIFT_Lock[interfaceId][pup] = 0;
                    regAddr = (pbsMode == PBS_RX_MODE) ? (0x54 + effective_cs * 0x10) : (0x14 + effective_cs * 0x10);
                    CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x0));
                    regAddr = (pbsMode == PBS_RX_MODE) ? (0x55 + effective_cs * 0x10) : (0x15 + effective_cs * 0x10);
                    CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x0));

					continue;
				} else if((Result0[interfaceId] & ResultValidationMask) == validationVal)
				{
					bit = BUS_WIDTH_IN_BITS;/* exit bit loop */
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("-- FAIL EEBA\n"));
					PupState[interfaceId][pup] = 2; /* this pup move to SBA */
	     		    ADLL_SHIFT_Lock[interfaceId][pup] = 0;
                    regAddr = (pbsMode == PBS_RX_MODE) ? (0x54 + effective_cs * 0x10) : (0x14 + effective_cs * 0x10);
                    CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x0));
                    regAddr = (pbsMode == PBS_RX_MODE) ? (0x55 + effective_cs * 0x10) : (0x15 + effective_cs * 0x10);
                    CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0x0));
					continue;
				}
				else
				{
					ADLL_SHIFT_Lock[interfaceId][pup] = 1;
					Result0[interfaceId]= (pbsMode == PBS_RX_MODE) ? ((Result0[interfaceId] & ResultValidationMask) + 1) :
																	 ((Result0[interfaceId] & ResultValidationMask) - 1);/* The search ended in Pass we need Fail */
					MaxADLLPerPup[interfaceId][pup]  = (MaxADLLPerPup[interfaceId][pup] <Result0[interfaceId]) ? (GT_U8)Result0[interfaceId] : MaxADLLPerPup[interfaceId][pup];
					MinADLLPerPup[interfaceId][pup]  = (Result0[interfaceId] > MinADLLPerPup[interfaceId][pup]) ? MinADLLPerPup[interfaceId][pup] : (GT_U8)Result0[interfaceId];
					ADLL_SHIFT_val[interfaceId][pup] = (pbsMode == PBS_RX_MODE) ? MaxADLLPerPup[interfaceId][pup] : MinADLLPerPup[interfaceId][pup];/*vs the Rx we are searching for the smallest value of DQ shift so all Bus would fail*/
				}
		    }
        }
	}

	/* Print Stage result */
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
		{
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
            DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("FP I/F %d, ADLL Shift for EBA: pup[%d] Lock status = %d Lock Val = %d,%d\n",interfaceId,pup, ADLL_SHIFT_Lock[interfaceId][pup], MaxADLLPerPup[interfaceId][pup], MinADLLPerPup[interfaceId][pup]));
        }
	}

    DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("Update ADLL Shift of all pups:\n"));
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
		{
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		    if(ADLL_SHIFT_Lock[interfaceId][pup] != 1) { continue;}/* if pup not locked continue to next pup */
            regAddr = (pbsMode == PBS_RX_MODE) ? (0x3 + effective_cs * 4) : (0x1 + effective_cs * 4);
            CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, ADLL_SHIFT_val[interfaceId][pup]));
            DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,("FP I/F %d, Pup[%d] = %d \n",interfaceId, pup, ADLL_SHIFT_val[interfaceId][pup]));
        }
	}

    /* PBS EEBA&EBA */
	/* Start the Per Bit Skew search */
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
	    {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	
			MaxPBSPerPup[interfaceId][pup] = 0x0;
			MinPBSPerPup[interfaceId][pup] = 0x1F;
			for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
			{
				/* reset result for PBS */
			    ResultAllBit[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*MAX_BUS_NUM*BUS_WIDTH_IN_BITS] = 0;
            }
		}
	}

    NumberOfIterations= 31;
	SearchDirection = MV_HWS_Low2High; 
	InitValue = 0; /* !!!!! ran sh (SearchDirection == MV_HWS_Low2High)?0:NumberOfIterations; */
	/*ddr3TipIpTrainingPerbitMultiCast( SearchDirection, Direction, 0x0 , NumberOfIterations, pbsPattern,  SearchEDGE_ , MV_HWS_ControlElement_DQ_SKEW);*/
    ddr3TipIpTraining(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, RESULT_PER_BIT, MV_HWS_ControlElement_DQ_SKEW,
                      SearchDirection, Direction, topologyMap->interfaceActiveMask, InitValue, NumberOfIterations, pbsPattern, SearchEDGE_, CS_SINGLE, csNum, trainStatus);
	
 	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		    if(ADLL_SHIFT_Lock[interfaceId][pup] != 1) { continue;}/* if pup not lock continue to next pup */
		    for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
		    {
                CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, maskResultsDqRegMap[bit+pup*BUS_WIDTH_IN_BITS], Result0, MASK_ALL_BITS));
                 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("Per Bit Skew search, FP I/F %d, bit:%d, pup:%d Result0 0x%x\n",interfaceId,bit,pup, Result0[interfaceId]));

	
				if((Result0[interfaceId]&0x2000000) == 0)
				{
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("--EBA PBS Fail - Training IP machine\n"));

					bit = BUS_WIDTH_IN_BITS;/* exit the bit loop */
					ADLL_SHIFT_Lock[interfaceId][pup] = 0;/* ADLL is no long in lock need new search */
					PupState[interfaceId][pup] = 2;/* Move to SBA */
					MaxPBSPerPup[interfaceId][pup] = 0x0;
					MinPBSPerPup[interfaceId][pup] = 0x1F;
					continue;
				}
				else
				{
					temp = (GT_U8)(Result0[interfaceId] & ResultValidationMask);
					MaxPBSPerPup[interfaceId][pup] =(temp > MaxPBSPerPup[interfaceId][pup]) ? temp : MaxPBSPerPup[interfaceId][pup];
					MinPBSPerPup[interfaceId][pup] =(temp < MinPBSPerPup[interfaceId][pup]) ? temp : MinPBSPerPup[interfaceId][pup];
					ResultAllBit[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*MAX_BUS_NUM*BUS_WIDTH_IN_BITS] = temp;
				}
			}
		}
	}

    /* Check all Pup lock */
	AllLock = 1;
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
        for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			AllLock = AllLock*ADLL_SHIFT_Lock[interfaceId][pup];
        }
	}

	/* Only if not all Pups Lock */
	if(AllLock == 0)
	{
		DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("##########ADLL shift for SBA###########\n"));
		/* ADLL shift for SBA */
		SearchDirection = (pbsMode == PBS_RX_MODE) ? MV_HWS_Low2High : MV_HWS_High2Low; 
		InitValue = (SearchDirection == MV_HWS_Low2High)?0:NumberOfIterations;
		for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
		{
			VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
            for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
            {
                VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
			    if(ADLL_SHIFT_Lock[interfaceId][pup] == 1) { continue;}/*if pup lock continue to next pup */
				ADLL_SHIFT_Lock[interfaceId][pup] = 0; /*init the var altogth init before*/
                regAddr = (pbsMode == PBS_RX_MODE) ? (0x54 + effective_cs * 0x10) : (0x14 + effective_cs * 0x10);
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0));
                regAddr = (pbsMode == PBS_RX_MODE) ? (0x55 + effective_cs * 0x10) : (0x15 + effective_cs * 0x10);
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0));
                regAddr = (pbsMode == PBS_RX_MODE) ? (0x5f + effective_cs * 0x10) : (0x1f + effective_cs * 0x10);
                CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0));
			    ADLL_SHIFT_val[interfaceId][pup]=0;/* initilaze the Edge2 Max. */
			    MinADLLPerPup[interfaceId][pup] = 0x1F;
			    MaxADLLPerPup[interfaceId][pup] = 0x0;
			    /*ddr3TipIpTrainingPerbitMultiCast( SearchDirection, Direction, InitValue, NumberOfIterations, pbsPattern,  SearchEDGE_ , MV_HWS_ControlElement_ADLL);*/
                ddr3TipIpTraining(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, RESULT_PER_BIT, MV_HWS_ControlElement_ADLL,
                          SearchDirection, Direction, topologyMap->interfaceActiveMask, InitValue, NumberOfIterations, pbsPattern, SearchEDGE_, CS_SINGLE, csNum, trainStatus);

			    for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
			    {
                    CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, maskResultsDqRegMap[bit+pup*BUS_WIDTH_IN_BITS], Result0, MASK_ALL_BITS));
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("FP I/F %d, bit:%d, pup:%d Result0 0x%x \n",interfaceId,bit,pup, Result0[interfaceId]));

					if((Result0[interfaceId]&0x2000000) == 0)
					{
						bit = BUS_WIDTH_IN_BITS;/* exit the bit loop */
						PupState[interfaceId][pup] = 1;/* Fail SBA --> Fail PBS */
                        DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,(" SBA Fail\n"));
						continue;
					}
					else
					{
						ADLL_SHIFT_Lock[interfaceId][pup]++;/* - increment to get all 8 bit lock.*/
					    Result0[interfaceId]= (pbsMode == PBS_RX_MODE) ? ((Result0[interfaceId] & ResultValidationMask) + 1) :
																		 ((Result0[interfaceId] & ResultValidationMask) - 1);/* The search ended in Pass we need Fail */
					    MaxADLLPerPup[interfaceId][pup]  = (MaxADLLPerPup[interfaceId][pup] <Result0[interfaceId]) ? (GT_U8)Result0[interfaceId] : MaxADLLPerPup[interfaceId][pup];
					    MinADLLPerPup[interfaceId][pup]  = (Result0[interfaceId] > MinADLLPerPup[interfaceId][pup]) ? MinADLLPerPup[interfaceId][pup] : (GT_U8)Result0[interfaceId];
					    ADLL_SHIFT_val[interfaceId][pup] = (pbsMode == PBS_RX_MODE) ? MaxADLLPerPup[interfaceId][pup] : MinADLLPerPup[interfaceId][pup];/*vs the Rx we are searching for the smallest value of DQ shift so all Bus would fail*/
					}
			    }
			    ADLL_SHIFT_Lock[interfaceId][pup] = (ADLL_SHIFT_Lock[interfaceId][pup] == 8)?1:0; /* 1 is lock */

            	regAddr = (pbsMode == PBS_RX_MODE) ? (0x3 + effective_cs * 4) : (0x1 + effective_cs * 4);
            	CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, ADLL_SHIFT_val[interfaceId][pup]));

				DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("ADLL_SHIFT_Lock[%x][%x] = %x \n",interfaceId,pup, ADLL_SHIFT_Lock[interfaceId][pup]));
            }
		}

		/* End ADLL Shift for SBA */
		/* Start the Per Bit Skew search */
		SearchEDGE_ = (pbsMode == PBS_RX_MODE) ? EDGE_PF : EDGE_FP; /* The ADLL shift finished with a Pass */
		SearchDirection = (pbsMode == PBS_RX_MODE) ? MV_HWS_Low2High : MV_HWS_High2Low;
        NumberOfIterations = 0x1F;
        InitValue = (pbsMode == PBS_RX_MODE) ? 0 : NumberOfIterations;/* - The initial value is different in Rx and Tx mode*/
		/*ddr3TipIpTrainingPerbitMultiCast( SearchDirection, Direction, 0x0 , NumberOfIterations, pbsPattern,  SearchEDGE_ , MV_HWS_ControlElement_DQ_SKEW);*/

	    ddr3TipIpTraining(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, RESULT_PER_BIT, MV_HWS_ControlElement_DQ_SKEW,
                      SearchDirection, Direction, topologyMap->interfaceActiveMask, InitValue, NumberOfIterations, pbsPattern, SearchEDGE_, CS_SINGLE, csNum, trainStatus);

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

				for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
				{
	                CHECK_STATUS(mvHwsDdr3TipIFRead(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, maskResultsDqRegMap[bit+pup*BUS_WIDTH_IN_BITS], Result0, MASK_ALL_BITS));
					if(PupState[interfaceId][pup] != 2) {bit = BUS_WIDTH_IN_BITS; continue;}/*if pup is not SBA continue to next pup*/
                      DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("Per Bit Skew search, PF I/F %d, bit:%d, pup:%d Result0 0x%x \n",interfaceId,bit,pup, Result0[interfaceId]));
					if((Result0[interfaceId]&0x2000000) == 0)
					{
                        DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("SBA Fail\n"));
						/* bit = BUS_WIDTH_IN_BITS;*/ /*exit the bit loop*/
/*						bit = BUS_WIDTH_IN_BITS;*/ /*exit the bit loop*/
						/*ADLL_SHIFT_Lock[interfaceId][pup] = 0;*/ /* In this stage no need to change the ADLL shift lock there is a VW > 0 */
						/*PupState[interfaceId][pup] = 1; We want to continue learn on the bits Skew*/
						MaxPBSPerPup[interfaceId][pup] = 0x1F;
						ResultAllBit[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*MAX_BUS_NUM*BUS_WIDTH_IN_BITS] = 0x1F;
					} else
					{
						temp = (GT_U8)(Result0[interfaceId] & ResultValidationMask);
						MaxPBSPerPup[interfaceId][pup] =(temp > MaxPBSPerPup[interfaceId][pup]) ? temp : MaxPBSPerPup[interfaceId][pup];
						MinPBSPerPup[interfaceId][pup] =(temp < MinPBSPerPup[interfaceId][pup]) ? temp : MinPBSPerPup[interfaceId][pup];
						ResultAllBit[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*MAX_BUS_NUM*BUS_WIDTH_IN_BITS] = temp;
						ADLL_SHIFT_Lock[interfaceId][pup] = 1;
					}
				}
			}
		}
		/* Check all Pup state */
		AllLock = 1;
		for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
		{
          /*  DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("PupState[%d][%d] = %d\n",interfaceId,pup,PupState[interfaceId][pup])); */
		}
	}
	/* END OF SBA */
    /* Norm */
	for( pup = 0 ; pup < topologyMap->numOfBusPerInterface ; pup++)
	{
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
		for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
		{
            for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
            {
                VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		        if(ADLL_SHIFT_Lock[interfaceId][pup] != 1) /* if pup not lock continue to next pup */
                { 
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_ERROR,("PBS failed for IF #%d\n",interfaceId));
                    trainingResult[trainingStage][interfaceId] = TEST_FAILED;
                  /*  if (debugMode == GT_FALSE)
                    {
                        return GT_FAIL; ?? don't want to fail all the Algorithm due to this fail. we will let the Centralization TH to limit us
                    }*/
                    /* continue; want to zero all PBS val on this pup that didn't converge in the ADLL Shift state */
					Result_MAT[interfaceId][pup][bit] = 0;
					MaxPBSPerPup[interfaceId][pup] = 0;
					MinPBSPerPup[interfaceId][pup] = 0;
                }
                else
                {
                    trainingResult[trainingStage][interfaceId] = (trainingResult[trainingStage][interfaceId] == TEST_FAILED) ? TEST_FAILED:TEST_SUCCESS;
					Result_MAT[interfaceId][pup][bit] = ResultAllBit[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*MAX_BUS_NUM*BUS_WIDTH_IN_BITS] - MinPBSPerPup[interfaceId][pup];
                }

                DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("The abs MinPBS[%d][%d] = %d\n" ,interfaceId ,pup , MinPBSPerPup[interfaceId][pup]));
			}
		}
	}

	/*Clean all results*/
	ddr3TipCleanPbsResult(devNum, pbsMode);

    /* DQ PBS register update with the final result */
    for( interfaceId = 0 ; interfaceId < MAX_INTERFACE_NUM ; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
		for( pup = 0 ; pup <  topologyMap->numOfBusPerInterface ; pup++)
		{
			VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
			/*if(ADLL_SHIFT_Lock[interfaceId][pup] != 1) { continue;}*/ /* if pup not lock continue to next pup */
            DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("Final Results: interfaceId %d, pup %d, Pup State: %d\n", interfaceId, pup, PupState[interfaceId][pup]));

			for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
			{
				 if (dqMapTable == NULL)
				 {
                    DEBUG_PBS_ENGINE(DEBUG_LEVEL_ERROR,("dqMapTable not initializaed\n"));
					return GT_FAIL;
				 }
				 PadNum = dqMapTable[bit+pup*BUS_WIDTH_IN_BITS + interfaceId*BUS_WIDTH_IN_BITS*topologyMap->numOfBusPerInterface];
                 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,("Result_MAT: %d " ,Result_MAT[interfaceId][pup][bit]));
                 regAddr = (pbsMode == PBS_RX_MODE) ? (PBS_RX_PHY_REG + effective_cs * 0x10) : (PBS_TX_PHY_REG + effective_cs * 0x10);
                 CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr+PadNum, Result_MAT[interfaceId][pup][bit]));
			}
			pbsdelayPerPup[pbsMode][interfaceId][pup] = (MaxPBSPerPup[interfaceId][pup] == MinPBSPerPup[interfaceId][pup])?TYPICAL_PBS_VALUE :((MaxADLLPerPup[interfaceId][pup] - MinADLLPerPup[interfaceId][pup])*ADLLTap/(MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup]));

			if( pbsMode == PBS_TX_MODE ){ /*RX results ready, write RX also*/
				/*Write TX results*/
		        regAddr = (0x14 + effective_cs * 0x10);
				CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, (MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])/2));
		        regAddr = (0x15 + effective_cs * 0x10);
				CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, (MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])/2));

				/*Write previously stored RX results*/
		        regAddr = (0x54 + effective_cs * 0x10);
				CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, Result_MAT_RX_DQS[interfaceId][pup][effective_cs]));
		        regAddr = (0x55 + effective_cs * 0x10);
				CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, Result_MAT_RX_DQS[interfaceId][pup][effective_cs]));

			}
			else{ /*RX results may affect RL results correctess, so just store the results that will written in TX stage*/
				Result_MAT_RX_DQS[interfaceId][pup][effective_cs] = (MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])/2;
			}

            DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,(", PBS tap=%d [psec] ==> skew observed = %d\n", pbsdelayPerPup[pbsMode][interfaceId][pup], ((MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])*pbsdelayPerPup[pbsMode][interfaceId][pup])));
		}
	}

    /*Write back to the phy the default values */
    regAddr = (pbsMode == PBS_RX_MODE) ? (READ_CENTRALIZATION_PHY_REG + effective_cs * 4) : (WRITE_CENTRALIZATION_PHY_REG + effective_cs * 4);
	writeAdllValue(nominalAdll, regAddr);


   for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
   {
        regAddr = (pbsMode == PBS_RX_MODE) ? (0x5A + effective_cs * 0x10) : (0x1A + effective_cs * 0x10);
        CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr, 0));

        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)        /* restore cs enable value*/
        CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_UNICAST, interfaceId, CS_ENABLE_REG, csEnableRegVal[interfaceId], MASK_ALL_BITS));
   }
   /* exit test mode */
   CHECK_STATUS(mvHwsDdr3TipIFWrite(devNum, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, ODPG_WRITE_READ_MODE_ENABLE_REG, 0xFFFF, MASK_ALL_BITS));

   for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
   {
      /* if (trainingResult[trainingStage][interfaceId] == TEST_FAILED) */
	  if ( PupState[interfaceId][pup] == 1) /* meaning that there is no VW exist at all (No lock at the EBA ADLL shift at EBS) */
	   	 return GT_FAIL;
   }
   return GT_OK;


}



/******************************************************************************
* Name:     ddr3TipPbsRx.
* Desc:     PBS TX
* Args:     TBD
* Notes:
* Returns:  OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipPbsRx(GT_U32               uidevNum)
{
   return ddr3TipPbs(uidevNum, PBS_RX_MODE);
}

/******************************************************************************
* Name:     ddr3TipPbsTx.
* Desc:     PBS TX
* Args:     TBD
* Notes:
* Returns:  OK if success, other error code if fail.
*/
GT_STATUS    ddr3TipPbsTx(GT_U32               uidevNum)
{
   return ddr3TipPbs(uidevNum, PBS_TX_MODE);
}

#ifndef EXCLUDE_SWITCH_DEBUG
/*****************************************************************************
Print PBS Result
******************************************************************************/
GT_STATUS    ddr3TipPrintAllPbsResult
(
    GT_U32      devNum
)
{
    GT_U32 currCs;
    GT_U32 max_cs = mvHwsDdr3TipMaxCSGet();

   for(currCs = 0; currCs < max_cs; currCs++)
   {
	    ddr3TipPrintPbsResult(devNum, currCs,PBS_RX_MODE);
	    ddr3TipPrintPbsResult(devNum, currCs,PBS_TX_MODE);
   }
   return GT_OK;
}

/*****************************************************************************
Print PBS Result
******************************************************************************/
GT_STATUS    ddr3TipPrintPbsResult
(
    GT_U32		devNum,
    GT_U32		csNum,
    PBS_DIRECTION	pbsMode
)
{
    GT_U32 dataValue = 0, bit = 0, interfaceId = 0, pup = 0;
    GT_U32 regAddr = (pbsMode == PBS_RX_MODE) ? (PBS_RX_PHY_REG + csNum * 0x10) : (PBS_TX_PHY_REG + csNum * 0x10);
    mvPrintf("CS%d, %s ,PBS \n", csNum ,(pbsMode==PBS_RX_MODE)? "Rx" : "Tx");
    for( bit = 0 ; bit < BUS_WIDTH_IN_BITS ; bit++)
    {
	mvPrintf("%s, DQ",(pbsMode==PBS_RX_MODE)? "Rx" : "Tx");
	for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++)
        {
            VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
	    mvPrintf("%d ,PBS,,, ",bit);
            for( pup=0; pup <=topologyMap->numOfBusPerInterface; pup++)
            {
		VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup)
                CHECK_STATUS(mvHwsDdr3TipBUSRead(   devNum, interfaceId, ACCESS_TYPE_UNICAST, pup,  DDR_PHY_DATA,  regAddr+bit, &dataValue));
                mvPrintf("%d , ",dataValue);
            }
	}
        mvPrintf("\n");
    }
    mvPrintf("\n");
    return GT_OK;
}

#endif

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

Fixup PBS Result
******************************************************************************/
GT_STATUS    ddr3TipCleanPbsResult
(
    GT_U32                  devNum,
    PBS_DIRECTION			pbsMode
)
{
    GT_U32 interfaceId, pup, bit;
    GT_U32 regAddr = (pbsMode == PBS_RX_MODE) ? (PBS_RX_PHY_REG + effective_cs * 0x10) : (PBS_TX_PHY_REG + effective_cs * 0x10);

    for( interfaceId = 0 ; interfaceId <= MAX_INTERFACE_NUM-1 ; interfaceId++)
    {
        VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId)
        for( pup=0; pup <=topologyMap->numOfBusPerInterface; pup++)
        {
			for( bit = 0 ; bit <= BUS_WIDTH_IN_BITS+3; bit++)
			{
			CHECK_STATUS(mvHwsDdr3TipBUSWrite(devNum,  ACCESS_TYPE_UNICAST,   interfaceId, ACCESS_TYPE_UNICAST,  pup, DDR_PHY_DATA, regAddr+bit, 0));
			}
		}
	}
	return GT_OK;
}


