blob: 09a892f922f7813a6784c2147bee17fef2d539af [file] [log] [blame]
/*******************************************************************************
* 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 mvHwsDdr3TipReadAdllValue(GT_U32 devNum, GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr, GT_U32 mask)
{
GT_U32 dataValue;
GT_U32 interfaceId = 0, busId = 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 mvHwsDdr3TipWriteAdllValue(GT_U32 devNum, GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr)
{
GT_U32 interfaceId = 0, busId = 0;
GT_U32 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 devNum,GT_U32 PupValues[MAX_INTERFACE_NUM*MAX_BUS_NUM], int regAddr, GT_U32 mask)
{
GT_U32 dataValue;
GT_U32 interfaceId = 0, busId = 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 devNum,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 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)*/
mvHwsDdr3TipReadAdllValue(devNum,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. */
mvHwsDdr3TipWriteAdllValue(devNum,ctrlADLL, (reg + uiCs * CS_REGISTER_ADDR_OFFSET));
/* print adll results */
mvHwsDdr3TipReadAdllValue(devNum,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)*/
mvHwsDdr3TipReadAdllValue(devNum,ctrlADLL, (reg + (uiCs * CS_REGISTER_ADDR_OFFSET)) , 0x1F );
readPhaseValue(devNum,ctrlLevelPhase, (reg + (uiCs * CS_REGISTER_ADDR_OFFSET)) , 0x7<<6 );
if(direction == 0)
{
mvHwsDdr3TipReadAdllValue(devNum,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(devNum,ctrlADLL,ctrlLevelPhase, (reg + uiCs * CS_REGISTER_ADDR_OFFSET));
if(direction == 0)
{
mvHwsDdr3TipWriteAdllValue(devNum,ctrlADLL1, (0x1 + (uiCs * CS_REGISTER_ADDR_OFFSET)));
}
/* print adll results */
mvHwsDdr3TipReadAdllValue(devNum,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