| /******************************************************************************* |
| * 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_U8 pbsDelayPerPup[NUM_OF_PBS_MODES][MAX_INTERFACE_NUM][MAX_BUS_NUM][MAX_CS_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; |
| GT_U8 octetsPerInterfaceNum = (GT_U8)ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE); |
| |
| /* 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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 < octetsPerInterfaceNum ; 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*octetsPerInterfaceNum]; |
| 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])); |
| } |
| |
| temp = (MaxPBSPerPup[interfaceId][pup] == MinPBSPerPup[interfaceId][pup])?\ |
| TYPICAL_PBS_VALUE :\ |
| ((MaxADLLPerPup[interfaceId][pup] - MinADLLPerPup[interfaceId][pup])*ADLLTap/(MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])); |
| |
| pbsDelayPerPup[pbsMode][interfaceId][pup][effective_cs] = temp; |
| |
| 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", temp, ((MaxPBSPerPup[interfaceId][pup] - MinPBSPerPup[interfaceId][pup])*temp))); |
| } |
| } |
| /*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++) |
| { |
| VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId) |
| for( pup = 0 ; pup < octetsPerInterfaceNum ; pup++) |
| { |
| VALIDATE_BUS_ACTIVE(topologyMap->activeBusMask, pup) |
| /* 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); |
| } |
| |
| #ifdef DDR_VIEWER_TOOL |
| /***************************************************************************** |
| 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); |
| GT_U8 octetsPerInterfaceNum = ddr3TipDevAttrGet(devNum, MV_ATTR_OCTET_PER_INTERFACE); |
| |
| mvPrintf("%s,CS%d,PBS,ADLLRATIO,,,", (pbsMode == PBS_RX_MODE)?"Rx":"Tx", csNum); |
| for(interfaceId = 0; interfaceId <= MAX_INTERFACE_NUM-1; interfaceId++) |
| { |
| VALIDATE_IF_ACTIVE(topologyMap->interfaceActiveMask, interfaceId) |
| for( pup=0; pup < octetsPerInterfaceNum; pup++) |
| { |
| mvPrintf("%d,",pbsDelayPerPup[pbsMode][interfaceId][pup][csNum]); |
| } |
| } |
| mvPrintf("\nCS%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 <=octetsPerInterfaceNum; 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); |
| 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( pup=0; pup <=octetsPerInterfaceNum; 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; |
| } |
| |
| |