xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc85xx/p1023_serdes.c (revision cbe7706ab8aab06c18edaa9b120371f9c8012728)
167a719daSRoy Zang /*
267a719daSRoy Zang  * Copyright 2010-2011 Freescale Semiconductor, Inc.
367a719daSRoy Zang  * Author: Roy Zang <tie-fei.zang@freescale.com>
467a719daSRoy Zang  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
667a719daSRoy Zang  */
767a719daSRoy Zang 
867a719daSRoy Zang #include <config.h>
967a719daSRoy Zang #include <common.h>
1067a719daSRoy Zang #include <asm/io.h>
1167a719daSRoy Zang #include <asm/immap_85xx.h>
1267a719daSRoy Zang #include <asm/fsl_serdes.h>
1367a719daSRoy Zang 
1467a719daSRoy Zang #define SRDS1_MAX_LANES		4
1567a719daSRoy Zang 
1667a719daSRoy Zang static u32 serdes1_prtcl_map;
1767a719daSRoy Zang 
1867a719daSRoy Zang static const u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
1967a719daSRoy Zang 	[0x00] = {PCIE1, PCIE2, NONE, NONE},
2067a719daSRoy Zang 	[0x01] = {PCIE1, PCIE2, PCIE3, NONE},
2167a719daSRoy Zang 	[0x02] = {PCIE1, PCIE2, PCIE3, SGMII_FM1_DTSEC2},
2267a719daSRoy Zang 	[0x03] = {PCIE1, PCIE2, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2},
2367a719daSRoy Zang };
2467a719daSRoy Zang 
is_serdes_configured(enum srds_prtcl device)2567a719daSRoy Zang int is_serdes_configured(enum srds_prtcl device)
2667a719daSRoy Zang {
27*71fe2225SHou Zhiqiang 	int ret;
28*71fe2225SHou Zhiqiang 
29*71fe2225SHou Zhiqiang 	if (!(serdes1_prtcl_map & (1 << NONE)))
30*71fe2225SHou Zhiqiang 		fsl_serdes_init();
31*71fe2225SHou Zhiqiang 
32*71fe2225SHou Zhiqiang 	ret = (1 << device) & serdes1_prtcl_map;
3367a719daSRoy Zang 	return ret;
3467a719daSRoy Zang }
3567a719daSRoy Zang 
fsl_serdes_init(void)3667a719daSRoy Zang void fsl_serdes_init(void)
3767a719daSRoy Zang {
3867a719daSRoy Zang 	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
3967a719daSRoy Zang 	u32 pordevsr = in_be32(&gur->pordevsr);
4067a719daSRoy Zang 	u32 srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
4167a719daSRoy Zang 				MPC85xx_PORDEVSR_IO_SEL_SHIFT;
4267a719daSRoy Zang 	int lane;
4367a719daSRoy Zang 
44*71fe2225SHou Zhiqiang 	if (serdes1_prtcl_map & (1 << NONE))
45*71fe2225SHou Zhiqiang 		return;
46*71fe2225SHou Zhiqiang 
4767a719daSRoy Zang 	debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
4867a719daSRoy Zang 
49e51e47d3SAxel Lin 	if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
5067a719daSRoy Zang 		printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
5167a719daSRoy Zang 		return;
5267a719daSRoy Zang 	}
5367a719daSRoy Zang 	for (lane = 0; lane < SRDS1_MAX_LANES; lane++) {
5467a719daSRoy Zang 		enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
5567a719daSRoy Zang 		serdes1_prtcl_map |= (1 << lane_prtcl);
5667a719daSRoy Zang 	}
5767a719daSRoy Zang 
58*71fe2225SHou Zhiqiang 	/* Set the first bit to indicate serdes has been initialized */
59*71fe2225SHou Zhiqiang 	serdes1_prtcl_map |= (1 << NONE);
6067a719daSRoy Zang }
61