4xx_enet.c

来自「最新版的u-boot,2008-10-18发布」· C语言 代码 · 共 2,136 行 · 第 1/5 页

C
2,136
字号
		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(2);		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_ZMII;		bis->bi_phymode[3] = BI_PHYMODE_ZMII;		break;	case 2:		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(2);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_ZMII;		bis->bi_phymode[3] = BI_PHYMODE_ZMII;		break;	case 3:		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(0);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(2);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		bis->bi_phymode[2] = BI_PHYMODE_RGMII;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 4:		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V (2);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V (3);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_RGMII;		bis->bi_phymode[3] = BI_PHYMODE_RGMII;		break;	case 5:		zmiifer |= ZMII_FER_SMII << ZMII_FER_V (0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V (1);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V (2);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_ZMII;		bis->bi_phymode[3] = BI_PHYMODE_RGMII;		break;	case 6:		zmiifer |= ZMII_FER_SMII << ZMII_FER_V (0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V (1);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(2);		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_RGMII;		break;	case 0:	default:		zmiifer = ZMII_FER_MII << ZMII_FER_V(devnum);		rmiifer = 0x0;		bis->bi_phymode[0] = BI_PHYMODE_ZMII;		bis->bi_phymode[1] = BI_PHYMODE_ZMII;		bis->bi_phymode[2] = BI_PHYMODE_ZMII;		bis->bi_phymode[3] = BI_PHYMODE_ZMII;		break;	}	/* Ensure we setup mdio for this devnum and ONLY this devnum */	zmiifer |= (ZMII_FER_MDI) << ZMII_FER_V(devnum);	out_be32((void *)ZMII_FER, zmiifer);	out_be32((void *)RGMII_FER, rmiifer);	return ((int)pfc1);}#endif	/* CONFIG_440_GX */#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis){	unsigned long zmiifer=0x0;	unsigned long pfc1;	mfsdr(sdr_pfc1, pfc1);	pfc1 &= SDR0_PFC1_SELECT_MASK;	switch (pfc1) {	case SDR0_PFC1_SELECT_CONFIG_2:		/* 1 x GMII port */		out_be32((void *)ZMII_FER, 0x00);		out_be32((void *)RGMII_FER, 0x00000037);		bis->bi_phymode[0] = BI_PHYMODE_GMII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	case SDR0_PFC1_SELECT_CONFIG_4:		/* 2 x RGMII ports */		out_be32((void *)ZMII_FER, 0x00);		out_be32((void *)RGMII_FER, 0x00000055);		bis->bi_phymode[0] = BI_PHYMODE_RGMII;		bis->bi_phymode[1] = BI_PHYMODE_RGMII;		break;	case SDR0_PFC1_SELECT_CONFIG_6:		/* 2 x SMII ports */		out_be32((void *)ZMII_FER,			 ((ZMII_FER_SMII) << ZMII_FER_V(0)) |			 ((ZMII_FER_SMII) << ZMII_FER_V(1)));		out_be32((void *)RGMII_FER, 0x00000000);		bis->bi_phymode[0] = BI_PHYMODE_SMII;		bis->bi_phymode[1] = BI_PHYMODE_SMII;		break;	case SDR0_PFC1_SELECT_CONFIG_1_2:		/* only 1 x MII supported */		out_be32((void *)ZMII_FER, (ZMII_FER_MII) << ZMII_FER_V(0));		out_be32((void *)RGMII_FER, 0x00000000);		bis->bi_phymode[0] = BI_PHYMODE_MII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	default:		break;	}	/* Ensure we setup mdio for this devnum and ONLY this devnum */	zmiifer = in_be32((void *)ZMII_FER);	zmiifer |= (ZMII_FER_MDI) << ZMII_FER_V(devnum);	out_be32((void *)ZMII_FER, zmiifer);	return ((int)0x0);}#endif	/* CONFIG_440EPX */#if defined(CONFIG_405EX)int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis){	u32 rgmiifer = 0;	/*	 * The 405EX(r)'s RGMII bridge can operate in one of several	 * modes, only one of which (2 x RGMII) allows the	 * simultaneous use of both EMACs on the 405EX.	 */	switch (CONFIG_EMAC_PHY_MODE) {	case EMAC_PHY_MODE_NONE:		/* No ports */		rgmiifer |= RGMII_FER_DIS	<< 0;		rgmiifer |= RGMII_FER_DIS	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_NONE;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	case EMAC_PHY_MODE_NONE_RGMII:		/* 1 x RGMII port on channel 0 */		rgmiifer |= RGMII_FER_RGMII	<< 0;		rgmiifer |= RGMII_FER_DIS	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_RGMII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	case EMAC_PHY_MODE_RGMII_NONE:		/* 1 x RGMII port on channel 1 */		rgmiifer |= RGMII_FER_DIS	<< 0;		rgmiifer |= RGMII_FER_RGMII	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_NONE;		bis->bi_phymode[1] = BI_PHYMODE_RGMII;		break;	case EMAC_PHY_MODE_RGMII_RGMII:		/* 2 x RGMII ports */		rgmiifer |= RGMII_FER_RGMII	<< 0;		rgmiifer |= RGMII_FER_RGMII	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_RGMII;		bis->bi_phymode[1] = BI_PHYMODE_RGMII;		break;	case EMAC_PHY_MODE_NONE_GMII:		/* 1 x GMII port on channel 0 */		rgmiifer |= RGMII_FER_GMII	<< 0;		rgmiifer |= RGMII_FER_DIS	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_GMII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	case EMAC_PHY_MODE_NONE_MII:		/* 1 x MII port on channel 0 */		rgmiifer |= RGMII_FER_MII	<< 0;		rgmiifer |= RGMII_FER_DIS	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_MII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		break;	case EMAC_PHY_MODE_GMII_NONE:		/* 1 x GMII port on channel 1 */		rgmiifer |= RGMII_FER_DIS	<< 0;		rgmiifer |= RGMII_FER_GMII	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_NONE;		bis->bi_phymode[1] = BI_PHYMODE_GMII;		break;	case EMAC_PHY_MODE_MII_NONE:		/* 1 x MII port on channel 1 */		rgmiifer |= RGMII_FER_DIS	<< 0;		rgmiifer |= RGMII_FER_MII	<< 4;		out_be32((void *)RGMII_FER, rgmiifer);		bis->bi_phymode[0] = BI_PHYMODE_NONE;		bis->bi_phymode[1] = BI_PHYMODE_MII;		break;	default:		break;	}	/* Ensure we setup mdio for this devnum and ONLY this devnum */	rgmiifer = in_be32((void *)RGMII_FER);	rgmiifer |= (1 << (19-devnum));	out_be32((void *)RGMII_FER, rgmiifer);	return ((int)0x0);}#endif  /* CONFIG_405EX */#if defined(CONFIG_460EX) || defined(CONFIG_460GT)int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis){	u32 eth_cfg;	u32 zmiifer;		/* ZMII0_FER reg. */	u32 rmiifer;		/* RGMII0_FER reg. Bridge 0 */	u32 rmiifer1;		/* RGMII0_FER reg. Bridge 1 */	int mode;	zmiifer  = 0;	rmiifer  = 0;	rmiifer1 = 0;#if defined(CONFIG_460EX)	mode = 9;	mfsdr(SDR0_ETH_CFG, eth_cfg);	if (((eth_cfg & SDR0_ETH_CFG_SGMII0_ENABLE) > 0) &&	    ((eth_cfg & SDR0_ETH_CFG_SGMII1_ENABLE) > 0))		mode = 11; /* config SGMII */#else	mode = 10;	mfsdr(SDR0_ETH_CFG, eth_cfg);	if (((eth_cfg & SDR0_ETH_CFG_SGMII0_ENABLE) > 0) &&	    ((eth_cfg & SDR0_ETH_CFG_SGMII1_ENABLE) > 0) &&	    ((eth_cfg & SDR0_ETH_CFG_SGMII2_ENABLE) > 0))		mode = 12; /* config SGMII */#endif	/* TODO:	 * NOTE: 460GT has 2 RGMII bridge cores:	 *		emac0 ------ RGMII0_BASE	 *		           |	 *		emac1 -----+	 *	 *		emac2 ------ RGMII1_BASE	 *		           |	 *		emac3 -----+	 *	 *	460EX has 1 RGMII bridge core:	 *	and RGMII1_BASE is disabled	 *		emac0 ------ RGMII0_BASE	 *		           |	 *		emac1 -----+	 */	/*	 * Right now only 2*RGMII is supported. Please extend when needed.	 * sr - 2008-02-19	 * Add SGMII support.	 * vg - 2008-07-28	 */	switch (mode) {	case 1:		/* 1 MII - 460EX */		/* GMC0 EMAC4_0, ZMII Bridge */		zmiifer |= ZMII_FER_MII << ZMII_FER_V(0);		bis->bi_phymode[0] = BI_PHYMODE_MII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		bis->bi_phymode[2] = BI_PHYMODE_NONE;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 2:		/* 2 MII - 460GT */		/* GMC0 EMAC4_0, GMC1 EMAC4_2, ZMII Bridge */		zmiifer |= ZMII_FER_MII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_MII << ZMII_FER_V(2);		bis->bi_phymode[0] = BI_PHYMODE_MII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		bis->bi_phymode[2] = BI_PHYMODE_MII;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 3:		/* 2 RMII - 460EX */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, ZMII Bridge */		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(1);		bis->bi_phymode[0] = BI_PHYMODE_RMII;		bis->bi_phymode[1] = BI_PHYMODE_RMII;		bis->bi_phymode[2] = BI_PHYMODE_NONE;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 4:		/* 4 RMII - 460GT */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, GMC1 EMAC4_2, GMC1, EMAC4_3 */		/* ZMII Bridge */		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(1);		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(2);		zmiifer |= ZMII_FER_RMII << ZMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_RMII;		bis->bi_phymode[1] = BI_PHYMODE_RMII;		bis->bi_phymode[2] = BI_PHYMODE_RMII;		bis->bi_phymode[3] = BI_PHYMODE_RMII;		break;	case 5:		/* 2 SMII - 460EX */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, ZMII Bridge */		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1);		bis->bi_phymode[0] = BI_PHYMODE_SMII;		bis->bi_phymode[1] = BI_PHYMODE_SMII;		bis->bi_phymode[2] = BI_PHYMODE_NONE;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 6:		/* 4 SMII - 460GT */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, GMC0 EMAC4_3, GMC0 EMAC4_3 */		/* ZMII Bridge */		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(2);		zmiifer |= ZMII_FER_SMII << ZMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_SMII;		bis->bi_phymode[1] = BI_PHYMODE_SMII;		bis->bi_phymode[2] = BI_PHYMODE_SMII;		bis->bi_phymode[3] = BI_PHYMODE_SMII;		break;	case 7:		/* This is the default mode that we want for board bringup - Maple */		/* 1 GMII - 460EX */		/* GMC0 EMAC4_0, RGMII Bridge 0 */		rmiifer |= RGMII_FER_MDIO(0);		if (devnum == 0) {			rmiifer |= RGMII_FER_GMII << RGMII_FER_V(2); /* CH0CFG - EMAC0 */			bis->bi_phymode[0] = BI_PHYMODE_GMII;			bis->bi_phymode[1] = BI_PHYMODE_NONE;			bis->bi_phymode[2] = BI_PHYMODE_NONE;			bis->bi_phymode[3] = BI_PHYMODE_NONE;		} else {			rmiifer |= RGMII_FER_GMII << RGMII_FER_V(3); /* CH1CFG - EMAC1 */			bis->bi_phymode[0] = BI_PHYMODE_NONE;			bis->bi_phymode[1] = BI_PHYMODE_GMII;			bis->bi_phymode[2] = BI_PHYMODE_NONE;			bis->bi_phymode[3] = BI_PHYMODE_NONE;		}		break;	case 8:		/* 2 GMII - 460GT */		/* GMC0 EMAC4_0, RGMII Bridge 0 */		/* GMC1 EMAC4_2, RGMII Bridge 1 */		rmiifer |= RGMII_FER_GMII << RGMII_FER_V(2);	/* CH0CFG - EMAC0 */		rmiifer1 |= RGMII_FER_GMII << RGMII_FER_V(2);	/* CH0CFG - EMAC2 */		rmiifer |= RGMII_FER_MDIO(0);			/* enable MDIO - EMAC0 */		rmiifer1 |= RGMII_FER_MDIO(0);			/* enable MDIO - EMAC2 */		bis->bi_phymode[0] = BI_PHYMODE_GMII;		bis->bi_phymode[1] = BI_PHYMODE_NONE;		bis->bi_phymode[2] = BI_PHYMODE_GMII;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 9:		/* 2 RGMII - 460EX */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, RGMII Bridge 0 */		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(2);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(3);		rmiifer |= RGMII_FER_MDIO(0);			/* enable MDIO - EMAC0 */		bis->bi_phymode[0] = BI_PHYMODE_RGMII;		bis->bi_phymode[1] = BI_PHYMODE_RGMII;		bis->bi_phymode[2] = BI_PHYMODE_NONE;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 10:		/* 4 RGMII - 460GT */		/* GMC0 EMAC4_0, GMC0 EMAC4_1, RGMII Bridge 0 */		/* GMC1 EMAC4_2, GMC1 EMAC4_3, RGMII Bridge 1 */		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(2);		rmiifer |= RGMII_FER_RGMII << RGMII_FER_V(3);		rmiifer1 |= RGMII_FER_RGMII << RGMII_FER_V(2);		rmiifer1 |= RGMII_FER_RGMII << RGMII_FER_V(3);		bis->bi_phymode[0] = BI_PHYMODE_RGMII;		bis->bi_phymode[1] = BI_PHYMODE_RGMII;		bis->bi_phymode[2] = BI_PHYMODE_RGMII;		bis->bi_phymode[3] = BI_PHYMODE_RGMII;		break;	case 11:		/* 2 SGMII - 460EX */		bis->bi_phymode[0] = BI_PHYMODE_SGMII;		bis->bi_phymode[1] = BI_PHYMODE_SGMII;		bis->bi_phymode[2] = BI_PHYMODE_NONE;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	case 12:		/* 3 SGMII - 460GT */		bis->bi_phymode[0] = BI_PHYMODE_SGMII;		bis->bi_phymode[1] = BI_PHYMODE_SGMII;		bis->bi_phymode[2] = BI_PHYMODE_SGMII;		bis->bi_phymode[3] = BI_PHYMODE_NONE;		break;	default:		break;	}	/* Set EMAC for MDIO */	mfsdr(SDR0_ETH_CFG, eth_cfg);	eth_cfg |= SDR0_ETH_CFG_MDIO_SEL_EMAC0;	mtsdr(SDR0_ETH_CFG, eth_cfg);	out_be32((void *)RGMII_FER, rmiifer);#if defined(CONFIG_460GT)	out_be32((void *)RGMII_FER + RGMII1_BASE_OFFSET, rmiifer1);#endif	/* bypass the TAHOE0/TAHOE1 cores for U-Boot */	mfsdr(SDR0_ETH_CFG, eth_cfg);	eth_cfg |= (SDR0_ETH_CFG_TAHOE0_BYPASS | SDR0_ETH_CFG_TAHOE1_BYPASS);	mtsdr(SDR0_ETH_CFG, eth_cfg);	return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?