/*******************************************************************************
**
**  onuPonPatternBurstTransmit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function turn on or off actuacl burst transmission
**
**  PARAMETERS:  when on  == true  transmission is on
**               when off == false transmission is off
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstTransmit(MV_BOOL on)
{
	MV_STATUS status;
	MV_U32    gpioGroup, gpioMask;
	MV_U32    trans_value = 0;

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* ASIC Rev Z2 */
		/* =========== */
		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
		if (gpioMask == PON_GPIO_NOT_USED)
			return(MV_ERROR);

		trans_value = (on == MV_TRUE ? ~gpioMask /*0*/: gpioMask /*1*/);

		status = mvGppTypeSet(gpioGroup, gpioMask, trans_value);
		if (status != MV_OK)
			return(MV_ERROR);

	} else if (mvCtrlRevGet() == ONU_ASIC_REV_A0) {

		/* ASIC Rev A0 */
		/* =========== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
			return(MV_ERROR);
		}
	}

	transmit_up = on;
	return(MV_OK);
}
/*******************************************************************************
**
**  onuPonTxPowerControlInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function initialyzes TX power control pins
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonTxPowerControlInit(void)
{
	MV_U32		gpioPinNum, gpioGroup, gpioMask;
	MV_U32		regVal, mppGroup;
	MV_GPP_HAL_DATA	halData;
	MV_U32		devId = mvCtrlModelGet();
	MV_STATUS	status = MV_OK;

	gpioPinNum = mvBoarGpioPinNumGet(BOARD_GPP_PON_XVR_TX_POWER, 0);
	if (gpioPinNum != MV_ERROR) {
		mppGroup = mvCtrlMppRegGet(gpioPinNum / 8);
		/* Set TX power MPP to GPP mode */
		regVal = MV_REG_READ(mppGroup);
		regVal &= ~(0xf << ((gpioPinNum % 8) * 4));
		MV_REG_WRITE(mppGroup, regVal);

		halData.ctrlRev = mvCtrlRevGet();

		status = mvGppInit(&halData);
		if (status == MV_OK) {
			/* Set TX power GPP pin direction to OUT */
			gpioGroup = gpioPinNum / 32;
			gpioMask = 1 << gpioPinNum;
			status = mvGppTypeSet(gpioGroup, gpioMask, (MV_GPP_OUT & gpioMask));
		}

	} else if (devId == MV_6601_DEV_ID)
		status = MV_ERROR;

	return(status);
}
예제 #3
0
파일: proc.c 프로젝트: jameshilliard/prism
/********************************************************************
* soc_type_read -
*********************************************************************/
int soc_type_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *zero, void *ptr)
{
	int count = 0;
	char tmp_buffer[1000] = { 0 };

#ifdef CONFIG_ARCH_FEROCEON_MV78XX0
	char name[100] = { 0 };

#endif	/*  */
	if (offset > 0)
		return 0;

#ifdef CONFIG_ARCH_FEROCEON_MV78XX0
	mvCtrlModelRevNameGet(name);
	count += sprintf(tmp_buffer, "%s\n", name);

#endif	/*  */
#ifdef CONFIG_MV88F6281
	count += sprintf(tmp_buffer, "%s%x Rev %d\n", SOC_NAME_PREFIX, mvCtrlModelGet(), mvCtrlRevGet());

#endif	/* */
	count += mvCpuIfPrintSystemConfig(tmp_buffer, count);
	*(tmp_buffer + count) = '\0';
	sprintf(buffer, "%s", tmp_buffer);
	return count;
}
예제 #4
0
MV_STATUS my_mvSysCesaInit(int numOfSession, int queueDepth, void *osHandle)
{
	MV_CESA_HAL_DATA halData;
	MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1];
	MV_STATUS status;
	MV_U8 chan;

	status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1);

	if (status == MV_OK) {
		for (chan = 0; chan < MV_CESA_CHANNELS; chan++) {
			status = mvCesaTdmaWinInit(chan, addrWinMap);
			if (status != MV_OK) {
				mvOsPrintf("Error, unable to initialize CESA windows for channel(%d)\n", chan);
				break;
			}
			halData.sramPhysBase[chan] = (MV_ULONG)mv_crypto_virt_base_get(chan);
			halData.sramVirtBase[chan] = (MV_U8 *)mv_crypto_virt_base_get(chan);
			halData.sramOffset[chan] = 0;
		}

		if (status == MV_OK) {
		halData.ctrlModel = mvCtrlModelGet();
		halData.ctrlRev = mvCtrlRevGet();
			status = mvCesaHalInit(numOfSession, queueDepth,
					osHandle, &halData);
	}
	}

	return status;
}
예제 #5
0
int board_init (void)
{
	DECLARE_GLOBAL_DATA_PTR;

#ifdef	CONFIG_FLASH_CFI_DRIVER
	int portwidth;
	MV_U32 devParam;
#endif
#if defined(MV_INCLUDE_TWSI)
	MV_TWSI_ADDR slave;
#endif
	MV_GPP_HAL_DATA gppHalData;

	unsigned int i;

	maskAllInt();

	/* must initialize the int in order for udelay to work */
	//alior interrupt_init();
	timer_init();

	/* Init the Board environment module (device bank params init) */
	mvBoardEnvInit();

#if defined(MV_INCLUDE_TWSI)
	slave.type = ADDR7_BIT;
	slave.address = 0;
	mvTwsiInit(0, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_TCLK, &slave, 0);
#endif

	/* Init the Controlloer environment module (MPP init) */
	mvCtrlEnvInit();

	mvBoardDebugLed(3);

	/* Init the Controller CPU interface */
	mvCpuIfInit(mvCpuAddrWinMap);

	/* Init the GPIO sub-system */
	gppHalData.ctrlRev = mvCtrlRevGet();
	mvGppInit(&gppHalData);

	/* arch number of Integrator Board */
	gd->bd->bi_arch_number = 529; //KW2 arch number

	/* adress of boot parameters */
	gd->bd->bi_boot_params = 0x00000100;

	/* relocate the exception vectors */
	/* U-Boot is running from DRAM at this stage */
	for(i = 0; i < 0x100; i+=4)
	{
		*(unsigned int *)(0x0 + i) = *(unsigned int*)(TEXT_BASE + i);
	}

	mvBoardDebugLed(4);
	
	return 0;
}
예제 #6
0
/*******************************************************************************
* mvSysCntmrInit - Initialize the Cntmr subsystem
*
* DESCRIPTION:
*
* INPUT:
*       None
* OUTPUT:
*		None
* RETURN:
*       None
*
*******************************************************************************/
MV_STATUS   mvSysCntmrInit(void)
{
	MV_CNTMR_HAL_DATA halData;

	halData.ctrlModel = mvCtrlModelGet();
	halData.ctrlRev = mvCtrlRevGet();
	halData.ctrlFamily=mvCtrlDevFamilyIdGet(halData.ctrlModel);
	return mvCntmrHalInit(&halData);
}
int board_init(void)
{
	DECLARE_GLOBAL_DATA_PTR;

	if (whoAmI() != 0)
		return 0;

#if defined(MV_INCLUDE_TWSI)
	MV_TWSI_ADDR slave;
#endif

	unsigned int i;

	maskAllInt();
	/* Init the Board environment module (device bank params init) */
	mvBoardEnvInit();


#if defined(MV_INCLUDE_TWSI)
	slave.type = ADDR7_BIT;
	slave.address = 0;
	mvTwsiInit(0, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_TCLK, &slave, 0);
#endif

	/* Init the Controlloer environment module (MPP init) */
	mvCtrlEnvInit();

#if defined(CONFIG_DISPLAY_CPUINFO)
	late_print_cpuinfo();          /* display cpu info (and speed) */
#endif

	mvBoardDebugLed(2);

	mvCpuIfInit(mvCpuAddrWinMap);

#ifdef MV_NOR_BOOT
	env_init();
#endif

	/* Init the GPIO sub-system */
	MV_GPP_HAL_DATA gppHalData;
	gppHalData.ctrlRev = mvCtrlRevGet();
	mvGppInit(&gppHalData);

	gd->bd->bi_arch_number = 528;
	gd->bd->bi_boot_params = 0x00000100;

	/* relocate the exception vectors */
	/* U-Boot is running from DRAM at this stage */
	for (i = 0; i < 0x100; i += 4)
		*(unsigned int*)(0x0 + i) =
			*(unsigned int*)(CONFIG_SYS_TEXT_BASE + i);

	mvBoardDebugLed(4);
	return 0;
}
MV_STATUS mvGeneralInit(void)
{
	/* Check is its A370 A0 */
	if (mvCtrlRevGet() == 0)
		sramConfig();  /* Armada 370 - Must Run the sram reconfig WA */

#if !defined(MV_NO_PRINT)
	mvUartConfig(); /* prepare UART configuration (MPP's & interface selection) */
	mvUartInit();
	DEBUG_INIT_S("\n\nGeneral initialization - Version: " GENERAL_VERION "\n");
#endif

	return MV_OK;
}
static void mvEthComplexGbeClockControlSet(void)
{
	MV_U32 reg;
	/* Thus fields are not exists in ZX revision */
	if (mvCtrlRevGet() <= MV_88F6720_Z3_ID)
		return;

	/* Change default value of Bit 23, and 28 to NegEdge(0) */
	reg = MV_REG_READ(MV_ETHCOMP_GBE_PHY_CLOCK_CTRL_REG);
	/* Field - Switch Port4 To MPP Data Sample */
	reg &= ~(ETHCC_GBE_PHY_P4_SW_TO_MPP_EDGE_MASK);
	/* Field - GbE Port 0 To MPP Data Sample */
	reg &= ~(ETHCC_GBE_PHY_GBE_P0_TO_MPP_EDGE_MASK);

	MV_REG_WRITE(MV_ETHCOMP_GBE_PHY_CLOCK_CTRL_REG, reg);
}
예제 #10
0
/*******************************************************************************
* mvSysUsbHalInit - Initialize the USB subsystem
*
* DESCRIPTION:
*
* INPUT:
*       None
* OUTPUT:
*		None
* RETURN:
*       None
*
*******************************************************************************/
MV_STATUS   mvSysUsbInit(MV_U32 dev, MV_BOOL isHost)
{
	MV_USB_HAL_DATA halData;
	MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1];
	MV_STATUS status;

	status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1);
	if(status == MV_OK)
		status = mvUsbWinInit(dev, addrWinMap);

	if(status == MV_OK) {
		halData.ctrlModel = mvCtrlModelGet();
		halData.ctrlRev = mvCtrlRevGet();
		status = mvUsbHalInit(dev, isHost, &halData);
	}

	return status;
}
void mvEthComplexGphyPortSmiSrcSet(MV_U32 phy, MV_U32 src)
{
	MV_U32 reg;
	/* In A0 added Phy Smi source configuration for ports 0 and 3.
	** In Zx, only Phy Smi source for 1,2 are configurable, but no
	** need to modify the default values. */
	if (mvCtrlRevGet() <= MV_88F6720_Z3_ID)
		return;

	reg = MV_REG_READ(MV_ETHCOMP_CTRL_REG);
	reg &= ~ETHCC_GBE_PHY_PORT_SMI_SRC_MASK(phy);

	src <<= ETHCC_GBE_PHY_PORT_SMI_SRC_OFFSET(phy);
	src &= ETHCC_GBE_PHY_PORT_SMI_SRC_MASK(phy);

	reg |= src;

	MV_REG_WRITE(MV_ETHCOMP_CTRL_REG, reg);
}
예제 #12
0
/*******************************************************************************
* mvGppTypeSet - Enable a GPP (OUT) pin
*
* DESCRIPTION:
*
* INPUT:
*       group - GPP group number
*       mask  - 32bit mask value. Each set bit in the mask means that the type
*               of corresponding GPP will be set. Other GPPs are ignored.
*       value - 32bit value that describes GPP type per pin.
*
* OUTPUT:
*       None.
*
* EXAMPLE:
*       Set GPP8 to input and GPP15 to output.
*       mvGppTypeSet(0, (GPP8 | GPP15), 
*                    ((MV_GPP_IN & GPP8) | (MV_GPP_OUT & GPP15)) );
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_STATUS mvGppTypeSet(MV_U32 group, MV_U32 mask, MV_U32 value)
{
	if (group >= MV_GPP_MAX_GROUP)
	{
		DB(mvOsPrintf("mvGppTypeSet: ERR. invalid group number \n"));
		return MV_BAD_PARAM;
	}

	gppRegSet(group, GPP_DATA_OUT_EN_REG(group), mask, value);

    /* Workaround for Erratum FE-MISC-70*/
    if(mvCtrlRevGet()==MV_88F6XXX_A0_REV && (group == 1))
    {
        mask &= 0x2;
        gppRegSet(0, GPP_DATA_OUT_EN_REG(0), mask, value);
    } /*End of WA*/

	return MV_OK;

}
예제 #13
0
MV_VOID mvBoardEnvInit(MV_VOID)
{
	MV_U32 boardId= mvBoardIdGet();

	if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
	{
		mvOsPrintf("mvBoardEnvInit:Board unknown.\n");
		return;

	}

	if (mvBoardIdGet() != XCAT98DX_ID) {
		/* Set NAND interface access parameters */
		MV_REG_WRITE(NAND_READ_PARAMS_REG, BOARD_INFO(boardId)->nandFlashReadParams);
		MV_REG_WRITE(NAND_WRITE_PARAMS_REG, BOARD_INFO(boardId)->nandFlashWriteParams);
		MV_REG_WRITE(NAND_CTRL_REG, BOARD_INFO(boardId)->nandFlashControl);
	}

	/* Set GPP Out value */
	MV_REG_WRITE(GPP_DATA_OUT_REG(0), BOARD_INFO(boardId)->gppOutValLow);
	MV_REG_WRITE(GPP_DATA_OUT_REG(1), BOARD_INFO(boardId)->gppOutValHigh);

	/* set GPP polarity */
	mvGppPolaritySet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValLow);
	mvGppPolaritySet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValHigh);

    /* Workaround for Erratum FE-MISC-70*/
    if(mvCtrlRevGet()==MV_88F6XXX_A0_REV)
    {
        BOARD_INFO(boardId)->gppOutEnValLow &= 0xfffffffd;
        BOARD_INFO(boardId)->gppOutEnValLow |= (BOARD_INFO(boardId)->gppOutEnValHigh) & 0x00000002;
    } /*End of WA*/

	/* Set GPP Out Enable*/
	mvGppTypeSet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValLow);
	mvGppTypeSet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValHigh);

	/* Nand CE */
	MV_REG_BIT_SET(NAND_CTRL_REG, NAND_ACTCEBOOT_BIT);
}
예제 #14
0
/*******************************************************************************
* mvGppValueSet - Set a GPP Pin list value.
*
* DESCRIPTION:
*       This function set value for given GPP pin list.
*
* INPUT:
*       group - GPP group number
*       mask  - 32bit mask value. Each set bit in the mask means that the 
*               value of corresponding GPP will be set accordingly. Other GPP 
*               are not affected.
*       value - 32bit value that describes GPP value per pin.
*
* OUTPUT:
*       None.
*
* EXAMPLE:
*       Set GPP8 value of '0' and GPP15 value of '1'.
*       mvGppActiveSet(0, (GPP8 | GPP15), ((0 & GPP8) | (GPP15)) );
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_STATUS mvGppValueSet (MV_U32 group, MV_U32 mask, MV_U32 value)
{
	MV_U32 outEnable, tmp;
	MV_U32 i;

	if (group >= MV_GPP_MAX_GROUP)
	{
		DB(mvOsPrintf("mvGppValueSet: Error invalid group number \n"));
		return MV_BAD_PARAM;
	}

	/* verify that the gpp pin is configured as output 		*/
	/* Note that in the register out enabled -> bit = '0'. 	*/
	outEnable = ~MV_REG_READ(GPP_DATA_OUT_EN_REG(group));

    /* Workaround for Erratum FE-MISC-70*/
    if(mvCtrlRevGet()==MV_88F6XXX_A0_REV && (group == 1))
    {
        tmp = ~MV_REG_READ(GPP_DATA_OUT_EN_REG(0));
        outEnable &= 0xfffffffd;
        outEnable |= (tmp & 0x2);
    } /*End of WA*/

	for (i = 0 ; i < 32 ;i++)
	{
		if (((mask & (1 << i)) & (outEnable & (1 << i))) != (mask & (1 << i)))
		{
			mvOsPrintf("mvGppValueSet: Err. An attempt to set output "\
					   "value to GPP %d in input mode.\n", i);
			return MV_ERROR;
		}
	}

	gppRegSet(group, GPP_DATA_OUT_REG(group), mask, value);

	return MV_OK;

}
/*******************************************************************************
**
**  mvOnuPonMacBurstEnableInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init Burst Enable MPP
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuPonMacBurstEnableInit(void)
{
	MV_U32    gpioGroup, gpioMask;
	MV_STATUS status = MV_OK;

	if (MV_6601_DEV_ID == mvCtrlModelGet())
	{
	       /* PHY control register - output status set */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				  "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
		       return(MV_ERROR);
	       }

	       /* Set SW BEN control for MC tranciever */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_HW_SELECT, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			"ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl select\n\r");
		       return(MV_ERROR);
	       }

	       /* PHY control register - force disable */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_FORCE, 0, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			     "ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl not force\n\r");
		       return(MV_ERROR);
	       }
	} else if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* KW2 ASIC Rev Z2 */
		/* =============== */
		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
		if (gpioMask == PON_GPIO_NOT_USED)
			return MV_ERROR;

		status = mvGppTypeSet(gpioGroup, gpioMask, ~gpioMask/* 0-output allow transsmit*/);

		if (status == MV_OK)
			status = mvGppValueSet(gpioGroup, gpioMask, ~gpioMask/*0-disable signal*/);
		else
			return(status);

		if (status == MV_OK)
			status = mvGppTypeSet(gpioGroup, gpioMask, gpioMask /* 0-input NOT allow transsmit*/);

	} else if (mvCtrlRevGet() == ONU_ASIC_REV_A0) {

		/* KW2 ASIC Rev A0 */
		/* =============== */
		/* PHY control register - output status set */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
			return(MV_ERROR);
		}

		/* PHY control register - force disable */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_EN, 0, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl not force\n\r");
			return(MV_ERROR);
		}
	}

	return(status);
}
예제 #16
0
MV_U32 mvPexHwConfigRead (MV_U32 pexIf, MV_U32 bus, MV_U32 dev, MV_U32 func,
                        MV_U32 regOff)
{
#endif
	MV_U32 pexData = 0;
	MV_U32	localDev,localBus;

	/* Parameter checking   */
	if (PEX_DEFAULT_IF != pexIf)
	{
		if (pexIf >= mvCtrlPexMaxIfGet())
		{
			mvOsPrintf("mvPexConfigRead: ERR. Invalid PEX interface %d\n",pexIf);
			return 0xFFFFFFFF;
		}
	}

	if (dev >= MAX_PEX_DEVICES)
	{
		DB(mvOsPrintf("mvPexConfigRead: ERR. device number illigal %d\n", dev));
		return 0xFFFFFFFF;
	}
	
	if (func >= MAX_PEX_FUNCS)
	{
		DB(mvOsPrintf("mvPexConfigRead: ERR. function num illigal %d\n", func));
		return 0xFFFFFFFF;
	}
	
	if (bus >= MAX_PEX_BUSSES)
	{
		DB(mvOsPrintf("mvPexConfigRead: ERR. bus number illigal %d\n", bus));
		return MV_ERROR;
	}
    	     
    DB(mvOsPrintf("mvPexConfigRead: pexIf %d, bus %d, dev %d, func %d, regOff 0x%x\n",
                   pexIf, bus, dev, func, regOff));
	
	localDev = mvPexLocalDevNumGet(pexIf);
	localBus = mvPexLocalBusNumGet(pexIf);
                                     
    /* Speed up the process. In case on no link, return MV_ERROR */
    if ((dev != localDev) || (bus != localBus))
    {
        pexData = MV_REG_READ(PEX_STATUS_REG(pexIf));

        if ((pexData & PXSR_DL_DOWN))
        {
            return MV_ERROR;
        }
    }

    /* in PCI Express we have only one device number */
	/* and this number is the first number we encounter 
	else that the localDev*/
	/* spec pex define return on config read/write on any device */
	if (bus == localBus)
	{
		if (localDev == 0)
		{
			/* if local dev is 0 then the first number we encounter 
			after 0 is 1 */
			if ((dev != 1)&&(dev != localDev))
			{
				return MV_ERROR;
			}	
		}
		else
		{
			/* if local dev is not 0 then the first number we encounter 
			is 0 */
	
			if ((dev != 0)&&(dev != localDev))
			{
				return MV_ERROR;
			}
		}
		if(func != 0 ) /* i.e bridge */
		{
			return MV_ERROR;
		}
	}
    
    
	/* Creating PEX address to be passed */
	pexData = (bus << PXCAR_BUS_NUM_OFFS);
	pexData |= (dev << PXCAR_DEVICE_NUM_OFFS);
	pexData |= (func << PXCAR_FUNC_NUM_OFFS);
	pexData |= (regOff & PXCAR_REG_NUM_MASK); /* lgacy register space */
	/* extended register space */
	pexData |=(((regOff & PXCAR_REAL_EXT_REG_NUM_MASK) >> 
				PXCAR_REAL_EXT_REG_NUM_OFFS) << PXCAR_EXT_REG_NUM_OFFS);

	pexData |= PXCAR_CONFIG_EN; 
	
	/* Write the address to the PEX configuration address register */
	MV_REG_WRITE(PEX_CFG_ADDR_REG(pexIf), pexData);

	DB(mvOsPrintf("mvPexConfigRead:address pexData=%x ",pexData));
    
	
	/* In order to let the PEX controller absorbed the address of the read 	*/
	/* transaction we perform a validity check that the address was written */
	if(pexData != MV_REG_READ(PEX_CFG_ADDR_REG(pexIf)))
	{
		return MV_ERROR;
	}

	/* cleaning Master Abort */
	MV_REG_BIT_SET(PEX_CFG_DIRECT_ACCESS(pexIf,PEX_STATUS_AND_COMMAND), 
				   PXSAC_MABORT);
#if 0
	/* Guideline (GL# PCI Express-1) Erroneous Read Data on Configuration   */
	/* This guideline is relevant for all devices except of the following devices:
	   88F5281-BO and above, 88F5181L-A0 and above, 88F1281 A0 and above
	   88F6183 A0 and above, 88F6183L  */
	if ( ( (dev != localDev) || (bus != localBus) ) && 
		(
		!(MV_5281_DEV_ID == mvCtrlModelGet())&&
		!((MV_5181_DEV_ID == mvCtrlModelGet())&& (mvCtrlRevGet() >= MV_5181L_A0_REV))&&
		!(MV_1281_DEV_ID == mvCtrlModelGet())&&
		!(MV_6183_DEV_ID == mvCtrlModelGet())&&
		!(MV_6183L_DEV_ID == mvCtrlModelGet())&&
		!(MV_6281_DEV_ID == mvCtrlModelGet())&&
		!(MV_6192_DEV_ID == mvCtrlModelGet())&&
		!(MV_6190_DEV_ID == mvCtrlModelGet())&&
        !(MV_6180_DEV_ID == mvCtrlModelGet())&& 
		!(MV_78XX0_DEV_ID == mvCtrlModelGet()) 
		))
	{

		/* PCI-Express configuration read work-around */

		/* we will use one of the Punit (AHBToMbus) windows to access the xbar 
		and read the data from there */
		/*
		Need to configure the 2 free Punit (AHB to MBus bridge) 
		address decoding windows:
		Configure the flash Window to handle Configuration space requests 
		for PEX0/1:
		1.    write 0x7931/0x7941 to the flash window and the size, 
		      79-xbar attr (pci cfg), 3/4-xbar target (pex0/1), 1-WinEn
		2.    write base to flash window 
		
		Configuration transactions from the CPU should write/read the data 
		to/from address of the form:
		addr[31:28] = 0x5 (for PEX0) or 0x6 (for PEX1)
		addr[27:24] = extended register number
		addr[23:16] = bus number
		addr[15:11] = device number
		addr[10:8]   = function number
		addr[7:0]     = register number
		*/

		#include "ctrlEnv/sys/mvAhbToMbus.h"
		{
			MV_U32 winNum;
			MV_AHB_TO_MBUS_DEC_WIN originWin;
			MV_U32 pciAddr=0;
			MV_U32 remapLow=0,remapHigh=0;

			/* 
			We will use DEV_CS2\Flash window for this workarround 
			*/
            
			winNum = mvAhbToMbusWinTargetGet(PEX_CONFIG_RW_WA_TARGET);

			/* save remap values if exist */
			if ((1 == winNum)||(0 == winNum))
			{
				remapLow = MV_REG_READ(AHB_TO_MBUS_WIN_REMAP_LOW_REG(winNum));
				remapHigh = MV_REG_READ(AHB_TO_MBUS_WIN_REMAP_HIGH_REG(winNum));

			}
			

			/* save the original window values */
			mvAhbToMbusWinGet(winNum,&originWin);

			if (PEX_CONFIG_RW_WA_USE_ORIGINAL_WIN_VALUES)
			{
				/* set the window as xbar window */
				if (pexIf)
				{
					MV_REG_WRITE(AHB_TO_MBUS_WIN_CTRL_REG(winNum), 
					(0x7931 | (((originWin.addrWin.size >> 16)-1) ) << 16));
				}
				else
				{
					MV_REG_WRITE(AHB_TO_MBUS_WIN_CTRL_REG(winNum), 
					(0x7941 | (((originWin.addrWin.size >> 16)-1) ) << 16));
				}

				MV_REG_WRITE(AHB_TO_MBUS_WIN_BASE_REG(winNum),
							 originWin.addrWin.baseLow);

				/*pciAddr = originWin.addrWin.baseLow;*/
				pciAddr = (MV_U32)CPU_MEMIO_UNCACHED_ADDR(
					(MV_U32)originWin.addrWin.baseLow);
			
			}
예제 #17
0
/*******************************************************************************
* mvBoardIdGet - Get Board model
*
* DESCRIPTION:
*       This function returns board ID.
*       Board ID is 32bit word constructed of board model (16bit) and 
*       board revision (16bit) in the following way: 0xMMMMRRRR.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       32bit board ID number, '-1' if board is undefined.
*
*******************************************************************************/
MV_U32 mvBoardIdGet(MV_VOID)
{
	MV_U32 tmpBoardId = -1;
	BOARD_DATA    boardData;

	if(gBoardId != -1)
		return gBoardId;

#if defined(MV_88F1181)
	
	if(boardEepromGet(&boardData) == MV_OK)
	{
		tmpBoardId = (MV_U32)boardData.boardId;
	}
	else
	{
		/* until we have relevant data in twsi then we 
		will detect the board type from sdram config reg */
		if (MV_REG_READ(SDRAM_CONFIG_REG) & SDRAM_DTYPE_DDR2)
		{
			tmpBoardId = DB_88F1181_DDR2;
		}
		else
		{
			tmpBoardId = DB_88F1181_DDR1;
		}

	}
	

#elif defined(MV_88F5181)

	if (MV_REG_READ(SDRAM_CONFIG_REG) & SDRAM_DTYPE_DDR2)
	{
	}
	else /* DDR1 */
	{
		#if defined(RD_88F5182)
		tmpBoardId = RD_88F5182_2XSATA;
		#elif defined(RD_88F5182_3)
		tmpBoardId = RD_88F5182_2XSATA3;
		#elif defined(RD_88W8660)
		tmpBoardId = RD_88W8660_DDR1;
		#elif defined(RD_88F5181L_FE)
		tmpBoardId = RD_88F5181L_VOIP_FE;
		#elif defined(RD_88F5181L_GE)
		tmpBoardId = RD_88F5181L_VOIP_GE;
        	#elif defined(MV_POS_NAS) 
        	tmpBoardId = RD_88F5181_POS_NAS;
		#elif defined(MV_VOIP)
		tmpBoardId = RD_88F5181_VOIP;
        	#elif defined(DB_PRPMC)
		tmpBoardId = DB_88F5181_DDR1_PRPMC;
		#elif defined(DB_PEX_PCI)
		tmpBoardId = DB_88F5181_DDR1_PEXPCI;
		#else
		tmpBoardId = RD_88F5181_POS_NAS;
		#endif
	}
	if(tmpBoardId != -1) {
		gBoardId = tmpBoardId;
		return tmpBoardId;
	}

//jack20060626
//	if(boardEepromGet(&boardData) == MV_OK)
//	{
//		tmpBoardId = (MV_U32)boardData.boardId;
//	}
//	else
	{
		/* until we have relevant data in twsi then we 
		will detect the board type from sdram config reg */
		if (MV_REG_READ(SDRAM_CONFIG_REG) & SDRAM_DTYPE_DDR2)
		{
			if((mvCtrlModelGet() == MV_5281_DEV_ID)&&(mvCtrlRevGet() >= 0x1))
			{
				tmpBoardId = DB_88F5X81_DDR2;
			} 
			else if(mvCtrlModelGet() == MV_8660_DEV_ID)
			{
				tmpBoardId = DB_88W8660_DDR2;
			}
			else if(mvCtrlModelGet() == MV_5182_DEV_ID)
			{
				tmpBoardId = DB_88F5182_DDR2;
			}
			else
			{
				tmpBoardId = DB_88F5181_5281_DDR2;
			}
		}
		else /* DDR1 */
		{
			if (MV_REG_READ(PCI_ARBITER_CTRL_REG(0)) & PACR_ARB_ENABLE) /* arbiter enabled*/
			{
				if((mvCtrlModelGet() == MV_5281_DEV_ID)&&(mvCtrlRevGet() >= 0x1))
				{
					tmpBoardId = DB_88F5X81_DDR1;
				}
				else
				{
					tmpBoardId = DB_88F5181_5281_DDR1;
				}
			}
			else /* arbiter disabled */
			{

				if ((MV_REG_READ(PEX_CTRL_REG(0)) & PXCR_DEV_TYPE_CTRL_MASK)
					 == PXCR_DEV_TYPE_CTRL_CMPLX) /*root complex*/
				{
					tmpBoardId = DB_88F5181_DDR1_PRPMC;
				}
				else if ((MV_REG_READ(PEX_CTRL_REG(0)) & PXCR_DEV_TYPE_CTRL_MASK)
					 == PXCR_DEV_TYPE_CTRL_POINT) /*end point*/
				{
					tmpBoardId = DB_88F5181_DDR1_PEXPCI;
				}
			}
		}

	}

	gBoardId = tmpBoardId;


	return tmpBoardId;

#else
#   error "CHIP not selected"
#endif



}
예제 #18
0
/*****************************************************************************
 * UART
 ****************************************************************************/
static struct resource mv_uart_resources[] = {
	{
		.start		= PORT0_BASE,
		.end		= PORT0_BASE + 0xff,
		.flags		= IORESOURCE_MEM,
	},
	{
		.start          = IRQ_UART0,
		.end            = IRQ_UART0,
		.flags          = IORESOURCE_IRQ,
	},
	{
		.start		= PORT1_BASE,
		.end		= PORT1_BASE + 0xff,
		.flags		= IORESOURCE_MEM,
	},
	{
		.start          = IRQ_UART1,
		.end            = IRQ_UART1,
		.flags          = IORESOURCE_IRQ,
	},
};

static struct plat_serial8250_port mv_uart_data[] = {
	{
		.mapbase	= PORT0_BASE,
		.membase	= (char *)PORT0_BASE,
		.irq		= IRQ_UART0,
		.flags		= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
	},
	{
		.mapbase	= PORT1_BASE,
		.membase	= (char *)PORT1_BASE,
		.irq		= IRQ_UART1,
		.flags		= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
	},
	{ },
};

static struct platform_device mv_uart = {
	.name			= "serial8250",
	.id			= PLAT8250_DEV_PLATFORM,
	.dev			= {
		.platform_data	= mv_uart_data,
	},
	.num_resources		= ARRAY_SIZE(mv_uart_resources),
	.resource		= mv_uart_resources,
};


static void serial_initialize(void)
{
	mv_uart_data[0].uartclk = mv_uart_data[1].uartclk = mvTclk;
	platform_device_register(&mv_uart);
}

static void __init mv_vfp_init(void)
{

#if defined CONFIG_VFP_FASTVFP
        printk("VFP initialized to Run Fast Mode.\n");
#endif
}

#if defined(MV_88F6183)

#ifdef CONFIG_MV_INCLUDE_AUDIO

typedef struct {
	unsigned int base;
	unsigned int size;
} _audio_mem_info;

typedef struct {
	u32 spdif_rec;
	u32 spdif_play;
	u32 i2s_rec;
	u32 i2s_play;
	_audio_mem_info mem_array[MV_DRAM_MAX_CS + 1];
} _audio_info;

_audio_info audio_info = {1, 1, 1, 1};

 static struct resource mv_snd_resources[] = {
	[0] = {
		.start	= INTER_REGS_BASE + AUDIO_REG_BASE,
		.end	= INTER_REGS_BASE + AUDIO_REG_BASE + SZ_16K -1,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= IRQ_AUDIO_INT,
		.end	= IRQ_AUDIO_INT,
		.flags	= IORESOURCE_IRQ,
	},
	[2] = {
		.start	= NR_IRQS,	/* should obtained from board information*/
		.end	= NR_IRQS,	/* should obtained from board information */
		.flags	= IORESOURCE_IRQ,
	}
 };

static u64 mv_snd_dmamask = 0xFFFFFFFFUL;

static struct platform_device mv_snd_device = {
	.name	= "mv88fx_snd",
	.id	= -1,
	.dev	= {
		.dma_mask		= &mv_snd_dmamask,
		.coherent_dma_mask	= 0xFFFFFFFF,
		.platform_data		= &audio_info,
	},
	.num_resources	= ARRAY_SIZE(mv_snd_resources),
	.resource	= mv_snd_resources,
};

#endif /* #ifdef CONFIG_MV_INCLUDE_AUDIO */

#ifdef CONFIG_MV_INCLUDE_SDIO
static struct resource mvsdmmc_resources[] = {
	[0] = {
		.start	= INTER_REGS_BASE + 0x80000,
		.end	= INTER_REGS_BASE + 0x80000 + SZ_1K -1,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= SDIO_IRQ_NUM,
		.end	= SDIO_IRQ_NUM,
		.flags	= IORESOURCE_IRQ,
	},
	[2] = {
		.start	= NR_IRQS,	/* should obtained from board information*/
		.end	= NR_IRQS,	/* should obtained from board information */
		.flags	= IORESOURCE_IRQ,
	}

};

static u64 mvsdmmc_dmamask = 0xffffffffUL;

static struct platform_device mvsdmmc_device = {
	.name		= "mvsdmmc",
	.id		= -1,
	.dev		= {
		.dma_mask = &mvsdmmc_dmamask,
		.coherent_dma_mask = 0xffffffff,
	},
	.num_resources	= ARRAY_SIZE(mvsdmmc_resources),
	.resource	= mvsdmmc_resources,
};

#endif /* CONFIG_MV_INCLUDE_SDIO */

static struct platform_device *devices[] __initdata = {
#ifdef CONFIG_MV_INCLUDE_AUDIO
	&mv_snd_device,
#endif
#ifdef CONFIG_MV_INCLUDE_SDIO
 	&mvsdmmc_device,
#endif
 	NULL
};

#endif /* #if defined(MV_88F6183) */
static void __init mv_init(void)
{

	unsigned int temp;
        /* init the Board environment */
        if (mvBoardIdGet() != RD_88F6082_MICRO_DAS_NAS)  /* excluded for HDD power problem - to be fixed */
		mvBoardEnvInit();

        /* init the controller environment */
        if( mvCtrlEnvInit() ) {
            printk( "Controller env initialization failed.\n" );
            return;
        }

	if(mvBoardIdGet() == RD_88F5181_POS_NAS) {
		temp = MV_REG_READ(GPP_DATA_OUT_REG(0));
		temp &= ~(1 << 0x5);

		/* for host mode should be set to 0 */
		if(!mvIsUsbHost) {
			temp |= (1 << 0x5);
		}
        	MV_REG_WRITE(GPP_DATA_OUT_REG(0), temp);
	}

	/* Init the CPU windows setting and the access protection windows. */
	if( mvCpuIfInit(mv_sys_map()) ) {

		printk( "Cpu Interface initialization failed.\n" );
		return;
	}

    	/* Init Tclk & SysClk */
    	mvTclk = mvBoardTclkGet();
   	mvSysclk = mvBoardSysClkGet();

	printk("Sys Clk = %d, Tclk = %d\n",mvSysclk ,mvTclk  );
	

    	if ((mvCtrlModelGet() == MV_5281_DEV_ID) || (mvCtrlModelGet() == MV_1281_DEV_ID)
			|| (mvCtrlModelGet() == MV_6183_DEV_ID))
            mv_orion_ver = MV_ORION2; /* Orion II */
    	else
            mv_orion_ver = MV_ORION1; /* Orion I */

        /* Implement workaround for FEr# CPU-C16: Wait for interrupt command */ 
        /* is not processed properly, the workaround is not to use this command */
        /* the erratum is relevant for 5281 devices with revision less than C0 */
        if((mvCtrlModelGet() == MV_5281_DEV_ID)
         && (mvCtrlRevGet() < MV_5281_C0_REV))
        {
            support_wait_for_interrupt = 0;
        }

#ifdef CONFIG_JTAG_DEBUG
            support_wait_for_interrupt = 0; /*  for Lauterbach */
#endif
	mv_vfp_init();
	elf_hwcap &= ~HWCAP_JAVA;

   	serial_initialize();

	/* At this point, the CPU windows are configured according to default definitions in mvSysHwConfig.h */
	/* and cpuAddrWinMap table in mvCpuIf.c. Now it's time to change defaults for each platform.         */
	mvCpuIfAddDecShow();


#if defined(CONFIG_MTD_PHYSMAP)
	mv_mtd_initialize();
#endif
    	print_board_info();

#ifdef CONFIG_MV_INCLUDE_IDMA
    	mvDmaInit();
#endif

#if defined(MV_88F6183)

#ifdef 	CONFIG_MV_INCLUDE_SDIO
	mvsdmmc_resources[2].end = mvBoardSDIOGpioPinGet() + IRQ_GPP_START;
	mvsdmmc_resources[2].start = mvBoardSDIOGpioPinGet() + IRQ_GPP_START;
	irq_int_type[mvBoardSDIOGpioPinGet()] = GPP_IRQ_TYPE_CHANGE_LEVEL;
#endif /* CONFIG_MV_INCLUDE_SDIO */
	
#ifdef CONFIG_MV_INCLUDE_AUDIO
	for (temp=0 ; temp< MV_DRAM_MAX_CS; temp++) {
		MV_DRAM_DEC_WIN win;
		audio_info.mem_array[temp].base = 0;
		audio_info.mem_array[temp].size = 0;

		mvDramIfWinGet(SDRAM_CS0 + temp, &win);

		if (win.enable) {
			audio_info.mem_array[temp].base = win.addrWin.baseLow;
			audio_info.mem_array[temp].size = win.addrWin.size;
		}
	}
#endif /* CONFIG_MV_INCLUDE_AUDIO */
	if ((temp = ARRAY_SIZE(devices) - 1))
		platform_add_devices(devices, temp);

#endif /* MV_88F6183 */
    return;
}
예제 #19
0
/*******************************************************************************
* mvSysUsbHalInit - Initialize the USB subsystem
*
* DESCRIPTION:
*
* INPUT:
*       None
* OUTPUT:
*		None
* RETURN:
*       None
*
*******************************************************************************/
MV_STATUS mvSysUsbInit(MV_VOID)
{
	MV_USB_HAL_DATA halData;
	MV_STATUS status = MV_OK;
	MV_U32 dev;
	MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1];
	halData.ctrlModel = mvCtrlModelGet();
	halData.ctrlRev = mvCtrlRevGet();
	halData.ctrlFamily = mvCtrlDevFamilyIdGet(halData.ctrlModel);


	status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1);

#ifdef CONFIG_USB_EHCI
		MV_BOOL isHost;
		char envname[10], *env;
		int maxUsbPorts = mvCtrlUsbMaxGet();
		/* for ALP/A375: if using single usb2 port, use Virtual MAC ID since
		 MAC ID0 (usbActive =0) is connected to Physical MAC ID1 */
		int id, mac_id[2] = {1, 0};

		 for (id = 0; id < maxUsbPorts ; id++) {
			if (mvBoardIsUsbPortConnected(USB_UNIT_ID,id) == MV_FALSE)
				continue;
			if (maxUsbPorts == 1 && (halData.ctrlFamily == MV_88F67X0 ||
					(halData.ctrlRev == MV_88F66XX_A0_ID && halData.ctrlFamily == MV_88F66X0)))
				dev = mac_id[id];
			else
				dev = id;

			sprintf(envname, "usb%dMode", dev);
			env = getenv(envname);
			if ((!env) || (strcmp(env, "device") == 0) || (strcmp(env, "Device") == 0))
				isHost = MV_FALSE;
			else
				isHost = MV_TRUE;

			if (status == MV_OK)	/* Map DDR windows to EHCI */
#ifdef CONFIG_USB_XHCI_HCD
/* CONFIG_USB_XHCI_HCD indicate that both xHCI and eHCI are compiled:
 * Last Boolean argument is used to indicate the HAL layer which unit is currently initiated */
				status = mvUsbWinInit(dev, addrWinMap, MV_FALSE);
#else
				status = mvUsbWinInit(dev, addrWinMap);
#endif
			if (status == MV_OK)
				status = mvUsbHalInit(dev, isHost, &halData);
			if (status == MV_OK)
				printf("USB2.0 %d: %s Mode\n", dev, (isHost == MV_TRUE ? "Host" : "Device"));
			else
				mvOsPrintf("%s: Error: USB2.0 initialization failed (port %d).\n", __func__, dev);
		}
#endif
#ifdef CONFIG_USB_XHCI
		MV_U32 reg;
		for (dev = 0; dev < mvCtrlUsb3HostMaxGet(); dev++) {
			if (mvBoardIsUsbPortConnected(USB3_UNIT_ID,dev) == MV_FALSE)
				continue;
			status = mvUsbUtmiPhyInit(dev, &halData);
			if (halData.ctrlFamily == MV_88F66X0 || halData.ctrlFamily == MV_88F67X0) {
				/* ALP/A375: Set UTMI PHY Selector:
				 * - Connect UTMI PHY to USB2 port of USB3 Host
				 * - Powers down the other unit (so USB3.0 unit's registers are accessible) */
				reg = MV_REG_READ(USB_CLUSTER_CONTROL);
				reg = (reg & (~0x1)) | 0x1;
				MV_REG_WRITE(USB_CLUSTER_CONTROL, reg);
			}
			if (status == MV_OK)	/* Map DDR windows to XHCI */
				status = mvUsbWinInit(mvCtrlUsbMapGet(USB3_UNIT_ID, dev), addrWinMap, MV_TRUE);
			if (status == MV_OK)
				printf("USB3.0 %d: Host Mode\n", mvCtrlUsbMapGet(USB3_UNIT_ID, dev));
			else
				mvOsPrintf("%s: Error: USB3.0 initialization failed (port %d).\n", __func__,
						mvCtrlUsbMapGet(USB3_UNIT_ID, dev));
		}
#endif
	return status;
}
/*******************************************************************************
**
**  onuPonPatternBurstOn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function start TX transmissions of a selected pattern as periodic or static burst
**
**  PARAMETERS:
**      MV_U32 pattern      0x1     1T
**                          0x2     2T
**                          0x80    PRBS - 9
**                          0x82    PRBS - 15
**                          0x83    PRBS - 23
**     MV_BOOL isPeriodic   TX burst can be either static (in this case the following parameters has no effect)
**                          and this parameter is FALSE OR periodic in this case this parameters is TRUE
**     MV_U32 period        cycle time - the time in micro seconds between the start of on peak and the other
**                          (must be greater then the duration interval)
**     MV_U32 duration      peak time interval in micro seconds  (must be smaller then the duration interval)

**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstOn(MV_U32 pattern, MV_BOOL isPeriodic, MV_U32 period, MV_U32 duration)
{
	MV_STATUS  status;

	/*pattern validation*/
	if (!((pattern == ONU_PON_TX_PATTERN_TYPE_T1) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_T2) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_9) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_15) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_23))) {

		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, "Wrong pattern type value %d \n", pattern);
		return MV_BAD_VALUE;
	}

	if ((isPeriodic == MV_TRUE) && (duration >= period)) {
		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
			   "Period value %d MUST be greater then duration value %d \n", period, duration);
		return MV_BAD_VALUE;
	}

	/*in case of sequential call to onuPonPatternBurstOn*/
	/*stop timer operation and transmissions*/
	onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId));
	onuPonPatternBurstTransmit(MV_TRUE);
	onuPonPatternBurstEnable(MV_FALSE);
	time_interval_up     = 0;
	time_interval_down   = 0;

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* ASIC Rev Z2 */
		/* =========== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_INPUT, 0);
		if (status != MV_OK)
			return(status);

	} else if (mvCtrlRevGet() == ONU_ASIC_REV_A0) {

		/* ASIC Rev A0 */
		/* =========== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
		if (status != MV_OK)
			return(status);
	}

	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_EN_LOOP_TIMING, 0x0, 0);
	if (status != MV_OK)
		return(status);

	/*Set system in PHY mode, meaning disconnect the PON MAC*/
	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_OPEN_TX_DOOR_15, 0x1, 0);
	if (status != MV_OK)
		return(status);

	/*Set sedes power up in phy mode*/
	status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_POWER_PHY_MODE, 0xfd04,0);
	if (status != MV_OK)
		return(status);

	/*set select on pattern*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_SELECT, 0x7, 0);
	if (status != MV_OK)
		return(status);

	/*set pattern type*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_DATA, pattern, 0);
	if (status != MV_OK)
		return(status);

	/*turn on selected pattern*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_ENABLED, 0x1, 0);
	if (status != MV_OK)
		return(status);


	onuPonPatternBurstEnable(MV_TRUE);
	if (isPeriodic == MV_TRUE) {
		/*periosic burst*/
		time_interval_up     = duration;
		time_interval_down   = (period - duration);
		transmit_up          = MV_TRUE;
		onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId),0,time_interval_up,1);

	}

	return(MV_OK);
}
/*******************************************************************************
**
**  onuPonPatternBurstEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION:
**
**  PARAMETERS:  bool on
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstEnable(bool on)
{
	MV_STATUS status;
	MV_U32    gpioGroup, gpioMask;
	MV_U32    trans_value = 0;
	MV_U32    polarity;

	if (MV_6601_DEV_ID == mvCtrlModelGet())
	{
	       /* PHY control register - force enable */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_FORCE, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			     "ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl force\n\r");
		       return(MV_ERROR);
	       }

	       /* PHY control register - force enable value - according to polarity */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_VALUE, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				  "ERROR: asicOntMiscRegWrite failed for PON phy ctrl SW force value %d\n\r",
				  trans_value);
		       return(MV_ERROR);
	       }

	} else if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

	    	/* ASIC Rev Z2 */
	    	/* =========== */
		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
		if (gpioMask == PON_GPIO_NOT_USED)
			return MV_ERROR;

		trans_value = ((on == MV_TRUE) ? (gpioMask/*1*/) : (~gpioMask/*0*/));

		status = mvGppValueSet(gpioGroup, gpioMask, trans_value);
		if (status != MV_OK)
			return(MV_ERROR);

	} else if (mvCtrlRevGet() == ONU_ASIC_REV_A0) {

		/* ASIC Rev A0 */
		/* =========== */
		/* PHY control register - force enable */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_EN, 1, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl force\n\r");
			return(MV_ERROR);
		}

        polarity = onuP2PDbXvrBurstEnablePolarityGet();

		/* XVR polarity */
		/* XVR polarity == 0, Active High, transmit 1 to the line  */
		/* XVR polarity == 1, Active Low, transmit 0 to the line  */

		/* P2P mode */
		/* Force Value == 0, transmit 0 to the line  */
		/* Force Value == 1, transmit 1 to the line  */

		/* Setting P2P should be reversed from XVR polarity */
		/* XVR polarity == 0, Active High, write 1 for Force Value */
		/* XVR polarity == 1, Active Low, write 0 for Force Value */

		/* PHY control register - force enable value - according to polarity */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_VAL, polarity, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl force value %d\n\r",
				   trans_value);
			return(MV_ERROR);
		}
	}

	transmit_up = on;
	return(MV_OK);
}
예제 #22
0
/* USB Phy init (change from defaults) for 150nm chips:
 *  - 645xx, 646xx
 *  - 51xx, 52xx
 *  - 6082
 */
static void    mvUsbPhyInit(int dev)
{
    MV_U32          regVal;

    /* GL# USB-9 */
    /******* USB 2.0 Power Control Register 0x400 *******/
    regVal= MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));

    /* Bits 7:6 (BG_VSEL) = 0x1 */
    regVal &= ~(0x3 << 6);
    regVal |= (0x1 << 6);

    MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev),regVal);

    /* GL# USB-1 */
    /******* USB PHY Tx Control Register Register 0x420 *******/
    regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

    if( (mvCtrlModelGet() == MV_5181_DEV_ID) && (mvCtrlRevGet() <= MV_5181_A1_REV) )
    {
        /* For OrionI A1/A0 rev:  Bit[21] = 0 (TXDATA_BLOCK_EN  = 0). */
        regVal &= ~(1 << 21);
    }
    else
    {
        regVal |= (1 << 21);
    }

    /* Force Auto calibration */

    /* Bit[13] = 0x1, (REG_EXT_RCAL_EN = 0x1) */
    regVal |= (1<<13);

    /* Bits[2:0] (TxAmp)
     *      64560, 64660, 6082, 5181, 5182, etc = 0x4
     *      5281                                = 0x3
     */
    if(mvCtrlModelGet() == MV_5281_DEV_ID)
    {
        regVal &= ~(0x7 << 0);
        regVal |= (0x3 << 0);
    }
    else
    {
        regVal &= ~(0x7 << 0);
        regVal |= (0x4 << 0);
    }

    /* Bit[6:3] (IMP_CAL)
     *      64560, 64660 = 0xA
     *      Others       = 0x8
     *
     */
    regVal &= ~(0xf << 3);
    if( (mvCtrlModelGet() == MV64560_DEV_ID) ||
            (mvCtrlModelGet() == MV64660_DEV_ID))
    {
        regVal |= (0xA << 3);
    }
    else
    {
        regVal |= (0x8 << 3);
    }

    MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);

    /* GL# USB-3 GL# USB-9 */
    /******* USB PHY Rx Control Register 0x430 *******/
    regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

    /* bit[8:9] - (DISCON_THRESHOLD ). */
    /* 88F5181-A0/A1/B0 = 11, 88F5281-A0 = 10, all other 00 */
    /* 64660-A0 = 10 */
    regVal &= ~(0x3 << 8);
    if( (mvCtrlModelGet() == MV_5181_DEV_ID) && (mvCtrlRevGet() <= MV_5181_B0_REV) )
    {
        regVal |= (0x3 << 8);
    }
    else if(mvCtrlModelGet() == MV64660_DEV_ID)
    {
        regVal |= (0x2 << 8);
    }

    /* bit[21] = 0 (CDR_FASTLOCK_EN = 0). */
    regVal &= ~(1 << 21);

    /* bit[27:26] = 00 ( EDGE_DET_SEL = 00). */
    regVal &= ~(0x3 << 26);

    /* Bits[31:30] = RXDATA_BLOCK_LENGHT = 0x3 */
    regVal |= (0x3 << 30);

    /* Bits 7:4 (SQ_THRESH)
     *      64560, 64660                = 0x1
     *      5181, 5182, 5281, 6082, etc = 0x0
     */
    regVal &= ~(0xf << 4);
    if( (mvCtrlModelGet() == MV64560_DEV_ID) ||
            (mvCtrlModelGet() == MV64660_DEV_ID))
    {
        regVal |= (0x1 << 4);
    }

    MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);

    /* GL# USB-3 GL# USB-9 */
    /******* USB PHY IVREF Control Register 0x440 *******/
    regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

    /*Bits[1:0] = 0x2 (PLLVDD12 = 0x2)*/
    regVal &= ~(0x3 << 0);
    regVal |= (0x2 << 0);

    /* Bits 5:4 (RXVDD) = 0x3; */
    regVal &= ~(0x3 << 4);
    regVal |= (0x3 << 4);


    /* <VPLLCAL> bits[17:16] = 0x1 */
    if( (mvCtrlModelGet() == MV64560_DEV_ID) ||
            (mvCtrlModelGet() == MV64660_DEV_ID))
    {
        regVal &= ~(0x3 << 16);
        regVal |= (0x1 << 16);
    }

    /* <ISAMPLE_SEL> bits[19:18] = 0x2 */
    regVal &= ~(0x3 << 18);
    regVal |= (0x2 << 18);

    /* <SAMPLER_CTRL> bit[20] = 0x0 */
    regVal &= ~(0x1 << 20);

    /* <ICHGPBUF_SEL> bit[21] = 0x1 */
    regVal |= (0x1 << 21);

    MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);

    /***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/
    regVal = MV_REG_READ(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev));

    /* bit[15] = 0 (REG_FIFO_SQ_RST = 0). */
    regVal &= ~(1 << 15);

    /* <REG_FIFO_OVUF_SEL> bit[17] = 0x1 */
    if( (mvCtrlModelGet() == MV64560_DEV_ID) ||
            (mvCtrlModelGet() == MV64660_DEV_ID))
    {
        regVal |= (1 << 17);
    }

    MV_REG_WRITE(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev), regVal);
}
예제 #23
0
/*******************************************************************************
* mvUsbHalInit - Initialize USB engine
*
* DESCRIPTION:
*       This function initialize USB unit. It set the default address decode
*       windows of the unit.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_ERROR if setting fail.
*******************************************************************************/
MV_STATUS   mvUsbHalInit(int dev, MV_BOOL isHost)
{
    MV_U32          regVal;

    /* Clear Interrupt Cause and Mask registers */
    MV_REG_WRITE(MV_USB_BRIDGE_INTR_CAUSE_REG(dev), 0);
    MV_REG_WRITE(MV_USB_BRIDGE_INTR_MASK_REG(dev), 0);

    /* Reset controller */
    regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
    MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal | MV_USB_CORE_CMD_RESET_MASK);
    while( MV_REG_READ(MV_USB_CORE_CMD_REG(dev)) & MV_USB_CORE_CMD_RESET_MASK);

    /* Clear bit 4 in USB bridge control register for enableing core byte swap */
    if((mvCtrlModelGet() == MV64560_DEV_ID) || (mvCtrlModelGet() == MV64660_DEV_ID))
    {
        MV_REG_WRITE(MV_USB_BRIDGE_CTRL_REG(dev),(MV_REG_READ(MV_USB_BRIDGE_CTRL_REG(dev))
                     & ~MV_USB_BRIDGE_CORE_BYTE_SWAP_MASK));
    }

    /* GL# USB-10 */
    /* The new register 0x360 USB 2.0 IPG Metal Fix Register
     * dont' exists in the following chip revisions:
     * OrionN B1 (id=0x5180, rev 3)
     * Orion1 B1 (id=0x5181, rev=3) and before
     * Orion1-VoIP A0 (id=0x5181, rev=8)
     * Orion1-NAS A1 (id=0x5182, rev=1) and before
     * Orion2 B0 (id=0x5281, rev=1) and before
     */
    if( ((mvCtrlModelGet() == MV_5181_DEV_ID) &&
            ((mvCtrlRevGet() <= MV_5181_B1_REV) || (mvCtrlRevGet() == MV_5181L_A0_REV))) ||
            ((mvCtrlModelGet() == MV_5182_DEV_ID) &&
             (mvCtrlRevGet() <= MV_5182_A1_REV)) ||
            ((mvCtrlModelGet() == MV_5180_DEV_ID) &&
             (mvCtrlRevGet() <= MV_5180N_B1_REV)) )
    {
        /* Do nothing */
    }
    else
    {
        /* Change value of new register 0x360 */
        regVal = MV_REG_READ(MV_USB_BRIDGE_IPG_REG(dev));

        /*  Change bits[14:8] - IPG for non Start of Frame Packets
         *  from 0x9(default) to 0xD
         */
        regVal &= ~(0x7F << 8);
        regVal |= (0xD << 8);

        MV_REG_WRITE(MV_USB_BRIDGE_IPG_REG(dev), regVal);
    }

    /********* Update USB PHY configuration **********/
    if(	(mvCtrlModelGet() == MV_78100_DEV_ID) ||
            (mvCtrlModelGet() == MV_78200_DEV_ID) ||
            (mvCtrlModelGet() == MV_76100_DEV_ID) ||
            (mvCtrlModelGet() == MV_6281_DEV_ID)  ||
            (mvCtrlModelGet() == MV_6192_DEV_ID) ||
            (mvCtrlModelGet() == MV_6190_DEV_ID) ||
            (mvCtrlModelGet() == MV_6180_DEV_ID))
    {
        mvUsbPhy65nmNewInit(dev);
    }
    else if((mvCtrlModelGet() == MV_78XX0_DEV_ID))
    {
        mvUsbPhy65nmInit(dev);
    }
    else if( mvCtrlModelGet() == MV_6183_DEV_ID )
    {
        mvUsbPhy90nmInit(dev);
    }
    else
    {
        mvUsbPhyInit(dev);
    }

    /* Set Mode register (Stop and Reset USB Core before) */
    /* Stop the controller */
    regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
    regVal &= ~MV_USB_CORE_CMD_RUN_MASK;
    MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);

    /* Reset the controller to get default values */
    regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
    regVal |= MV_USB_CORE_CMD_RESET_MASK;
    MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);

    /* Wait for the controller reset to complete */
    do
    {
        regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
    } while (regVal & MV_USB_CORE_CMD_RESET_MASK);

    /* Set USB_MODE register */
    if(isHost)
    {
        regVal = MV_USB_CORE_MODE_HOST;
    }
    else
    {
        regVal = MV_USB_CORE_MODE_DEVICE | MV_USB_CORE_SETUP_LOCK_DISABLE_MASK;
    }

#if (MV_USB_VERSION == 0)
    regVal |= MV_USB_CORE_STREAM_DISABLE_MASK;
#endif

    MV_REG_WRITE(MV_USB_CORE_MODE_REG(dev), regVal);

    return MV_OK;
}
예제 #24
0
int board_init (void)
{
	DECLARE_GLOBAL_DATA_PTR;
	int clock_divisor;
	unsigned int i;
	MV_GPP_HAL_DATA gppHalData;
	clock_divisor = (CONFIG_SYS_TCLK / 16)/115200;

	/* muti-core support, initiate each Uart to each cpu */
	mvUartInit(whoAmI(), clock_divisor, mvUartBase(whoAmI()));
	if (whoAmI() != 0)
		return 0;

#if defined(MV_INCLUDE_TWSI)
	MV_TWSI_ADDR slave;
#endif
	maskAllInt();

	/* must initialize the int in order for udelay to work */
	/* interrupt_init(); - no interrupt handling in u-boot */
	timer_init();

	/* Init the Board environment module (device bank params init) */
	mvBoardEnvInit();

#if defined(MV_INCLUDE_TWSI)
	slave.type = ADDR7_BIT;
	slave.address = 0;
	mvTwsiInit(0, CONFIG_SYS_I2C_SPEED, CONFIG_SYS_TCLK, &slave, 0);
#endif

	/* Init the Controlloer environment module (MPP init) */
	mvCtrlEnvInit();

#if defined(CONFIG_DISPLAY_CPUINFO)
	late_print_cpuinfo();          /* display cpu info (and speed) */
#endif
	mvBoardDebugLed(2);

	/* Init the Controller CPU interface */
	mvCpuIfInit(mvCpuAddrWinMap);
#if defined(MV_NOR_BOOT)
	env_init();
#endif
	if (mvBoardCpssBoardIdSet(mvBoardIdGet()) != MV_OK)
		printf("%s: Error: Failed to set Board ID for CPSS!\n", __func__);

	/* Init the GPIO sub-system */
	gppHalData.ctrlRev = mvCtrlRevGet();
	mvGppInit(&gppHalData);

	/* arch number of Integrator Board */
	gd->bd->bi_arch_number=mv_get_arch_number();

	/* adress of boot parameters */
	gd->bd->bi_boot_params = 0x00000100;

	/* relocate the exception vectors */
	/* U-Boot is running from DRAM at this stage */
	for(i = 0; i < 0x100; i+=4) {
		*(unsigned int *)(0x0 + i) = *(unsigned int*)(CONFIG_SYS_TEXT_BASE + i);
	}
	mvBoardDebugLed(4);
	return 0;
}