xref: /rk3399_rockchip-uboot/board/varisys/cyrus/eth.c (revision 6b29a395b62965eef6b5065d3a526a8588a92038)
187e29878SAndy Fleming /*
287e29878SAndy Fleming  * Author Adrian Cox
387e29878SAndy Fleming  * Based somewhat on board/freescale/corenet_ds/eth_hydra.c
487e29878SAndy Fleming  *
587e29878SAndy Fleming  * SPDX-License-Identifier:    GPL-2.0+
687e29878SAndy Fleming  */
787e29878SAndy Fleming 
887e29878SAndy Fleming #include <common.h>
987e29878SAndy Fleming #include <netdev.h>
1087e29878SAndy Fleming #include <asm/fsl_serdes.h>
1187e29878SAndy Fleming #include <fm_eth.h>
1287e29878SAndy Fleming #include <fsl_mdio.h>
1387e29878SAndy Fleming #include <malloc.h>
1487e29878SAndy Fleming #include <fdt_support.h>
1587e29878SAndy Fleming #include <fsl_dtsec.h>
1687e29878SAndy Fleming 
1787e29878SAndy Fleming #ifdef CONFIG_FMAN_ENET
1887e29878SAndy Fleming 
1987e29878SAndy Fleming #define FIRST_PORT_ADDR 3
2087e29878SAndy Fleming #define SECOND_PORT_ADDR 7
2187e29878SAndy Fleming 
22*95390360SYork Sun #ifdef CONFIG_ARCH_P5040
2387e29878SAndy Fleming #define FIRST_PORT FM1_DTSEC5
2487e29878SAndy Fleming #define SECOND_PORT FM2_DTSEC5
2587e29878SAndy Fleming #else
2687e29878SAndy Fleming #define FIRST_PORT FM1_DTSEC4
2787e29878SAndy Fleming #define SECOND_PORT FM1_DTSEC5
2887e29878SAndy Fleming #endif
2987e29878SAndy Fleming 
3087e29878SAndy Fleming #define IS_VALID_PORT(p)  ((p) == FIRST_PORT || (p) == SECOND_PORT)
3187e29878SAndy Fleming 
cyrus_phy_tuning(int phy)3287e29878SAndy Fleming static void cyrus_phy_tuning(int phy)
3387e29878SAndy Fleming {
3487e29878SAndy Fleming 	/*
3587e29878SAndy Fleming 	 * Enable RGMII delay on Tx and Rx for CPU port
3687e29878SAndy Fleming 	 */
3787e29878SAndy Fleming 	printf("Tuning PHY @ %d\n", phy);
3887e29878SAndy Fleming 
3987e29878SAndy Fleming 	/* sets address 0x104 or reg 260 for writing */
4087e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xb, 0x8104);
4187e29878SAndy Fleming 	/* Sets RXC/TXC to +0.96ns and TX_CTL/RX_CTL to -0.84ns */
4287e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xc, 0xf0f0);
4387e29878SAndy Fleming 	/* sets address 0x105 or reg 261 for writing */
4487e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xb, 0x8105);
4587e29878SAndy Fleming 	/* writes to address 0x105 , RXD[3..0] to -0. */
4687e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xc, 0x0000);
4787e29878SAndy Fleming 	/* sets address 0x106 or reg 261 for writing */
4887e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xb, 0x8106);
4987e29878SAndy Fleming 	/* writes to address 0x106 , TXD[3..0] to -0.84ns */
5087e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0xc, 0x0000);
5187e29878SAndy Fleming 	/* force re-negotiation */
5287e29878SAndy Fleming 	miiphy_write(DEFAULT_FM_MDIO_NAME, phy, 0x0, 0x1340);
5387e29878SAndy Fleming }
5487e29878SAndy Fleming #endif
5587e29878SAndy Fleming 
board_eth_init(bd_t * bis)5687e29878SAndy Fleming int board_eth_init(bd_t *bis)
5787e29878SAndy Fleming {
5887e29878SAndy Fleming #ifdef CONFIG_FMAN_ENET
5987e29878SAndy Fleming 	struct fsl_pq_mdio_info dtsec_mdio_info;
6087e29878SAndy Fleming 	unsigned int i;
6187e29878SAndy Fleming 
6287e29878SAndy Fleming 	printf("Initializing Fman\n");
6387e29878SAndy Fleming 
6487e29878SAndy Fleming 
6587e29878SAndy Fleming 	/* Register the real 1G MDIO bus */
6687e29878SAndy Fleming 	dtsec_mdio_info.regs =
6787e29878SAndy Fleming 		(struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR;
6887e29878SAndy Fleming 	dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
6987e29878SAndy Fleming 
7087e29878SAndy Fleming 	fsl_pq_mdio_init(bis, &dtsec_mdio_info);
7187e29878SAndy Fleming 
7287e29878SAndy Fleming 
7387e29878SAndy Fleming 	fm_info_set_phy_address(FIRST_PORT, FIRST_PORT_ADDR);
7487e29878SAndy Fleming 	fm_info_set_mdio(FIRST_PORT,
7587e29878SAndy Fleming 			miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME));
7687e29878SAndy Fleming 	fm_info_set_phy_address(SECOND_PORT, SECOND_PORT_ADDR);
7787e29878SAndy Fleming 	fm_info_set_mdio(SECOND_PORT,
7887e29878SAndy Fleming 			miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME));
7987e29878SAndy Fleming 
8087e29878SAndy Fleming 	/* Never disable DTSEC1 - it controls MDIO */
8187e29878SAndy Fleming 	for (i = FM1_DTSEC2; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
8287e29878SAndy Fleming 		if (!IS_VALID_PORT(i))
8387e29878SAndy Fleming 			fm_disable_port(i);
8487e29878SAndy Fleming 	}
8587e29878SAndy Fleming 
86*95390360SYork Sun #ifdef CONFIG_ARCH_P5040
8787e29878SAndy Fleming 	for (i = FM2_DTSEC2; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) {
8887e29878SAndy Fleming 		if (!IS_VALID_PORT(i))
8987e29878SAndy Fleming 			fm_disable_port(i);
9087e29878SAndy Fleming 	}
9187e29878SAndy Fleming #endif
9287e29878SAndy Fleming 
9387e29878SAndy Fleming 	cpu_eth_init(bis);
9487e29878SAndy Fleming 
9587e29878SAndy Fleming 	cyrus_phy_tuning(FIRST_PORT_ADDR);
9687e29878SAndy Fleming 	cyrus_phy_tuning(SECOND_PORT_ADDR);
9787e29878SAndy Fleming #endif
9887e29878SAndy Fleming 
9987e29878SAndy Fleming 	return pci_eth_init(bis);
10087e29878SAndy Fleming }
101